MySQL資料庫 SQL學習

2022-09-20 01:51:11 字數 3751 閱讀 8976

在開始sql學習之前,其實我之前有系統性的學習過資料庫的知識,大概是在2年前。去年整整一年的時間從事的工作與資料庫沒有什麼關聯,現在重新開始乙份開發工作,資料庫學習是必要的技能,於是又來重頭學習一下,就算"溫故而知新"吧。

主要討論的是討論的是如何搭建sql學習環境,這個可以在網上搜尋一大片的教程,搜尋關鍵字「mysql安裝」、「mysql常見客戶端」,我這裡是使用的n**icat,也是現在常用的工具之一。

sql語句極其種類

ddl資料定義語言,主要用來建立和刪除資料庫或者表,常用關鍵字:create,dorp,alter,其特點為一旦執行就不能撤銷,事務中對於ddl語句也無法撤回。dml資料操作語言,主要用來查詢和變更表中內容,常見的增刪改查。dcl資料控制語言,用來確認使用者對資料的變更,如提交事務,回滾事務,對使用者進行賦權操作等。

表中資料型別的指定

數字integer,字元char和varchar,日期date。char與varchar的區別,char(4),如儲存'ab',則表中實際儲存的為'ab',不足4的則用空格進行佔位,varchar(4),如儲存'ab',則表中實際儲存為'ab'。

第一章需要掌握的sql語句

資料庫建立:

drop database if exists 資料庫名;

create database 資料庫名 default character set utf8;

表建立:

create table user (

id int(11) not null auto_increment,

name varchar(255) default null,

password varchar(255) default null,

primary key (id)

) engine=innodb default charset=utf8;

對字串使用不等號時的注意事項

select * from chars where char>'2' 如果表中的資料為1,11,2,3,32。得到的結果為2,3,32因為排序使用的規則和數字不同,類似於按姓氏進行排序,1和1開頭的所有字元比2和2開頭的都要小。

對於null值不能使用=null,需要使用 is null ,如果需要取反,則使用is not null

count進行統計時,如果使用count(*) 統計所有行數,如果count(列),該列中含有null值時,會進行排除。有以下一表

keyvalue11

2null

count(*)結果為2,count(value),結果為1

distinct用於去重複,可以用在列明前,表示去除表中該列的重複值,如果想要統計表中一列的不重複值,則需要將distinct用在count(distinct 列),distinct可用在聚合函式中,**g ,max,min,count,sum等。

group by 用於分組,需要注意的點有4個。

a點:select 子句中只能寫3中元素,(1) 常數(也就是123,字串等)(2) 聚合函式(count,distinct,**g,sum,min,max等)(3) group by 指定的列名。

正對3說明:select name,price,count(1) from product group by price。對**進行分組,並進行統計相同**的商品數量。如果在列中寫了group by之外的列名name,那麼現在有2個商品**相同的物品,牙刷10元,牙膏10元,那麼name列是顯示牙刷呢還是顯示牙膏呢??

b點:不能使用列的別名,因為sql的執行順序為from→where→group by→h**ing→select→order by,列別名是在select中取的,當執行到group by時還沒有讀取到select中取的別名,因此也就識別不到列別名了。

c點:group by 無法進行排序

d點:where子句中不能使用聚合函式,聚合函式可以使用在select,h**ing,order by。

where 只能對行內特定的值進行篩選,對組進行篩選需要使用h**ing,h**ing能夠使用的元素同group by a點一致。

在h**ing和where中都能夠使用的條件,最好放在where中,我的理解是按照sql的執行順序來執行的話,先在where這裡把資料進行篩選後,使資料減少有利於提公升後續group by和h**ing的效能。

order by 列 esc|desc,進行排序,一般寫在sql語句的最後,可以同時制定多個列進行排序。對於null的排序一般出現在開頭或者結尾。order by可以使用聚合函式。

增刪改查,其中新增時可以從別的表中直接拷貝選取的列,需要注意的是新表列的屬性需要與舊表一致,在拷貝舊表時也可以使用select where 對資料進行篩選。

事務:這裡這是簡單的提了事務的特性,即acid,開始事務start transaction,提交事務commit,回滾事務rallback,注意ddl語句無法進行回滾。

檢視,把一組需要經常使用的select語句可以儲存為檢視,這樣每次訪問時使用檢視名即可,不需要重新書寫sql語句。

子查詢,將用來定義檢視的select語句直接用於from子句中。sql此時的執行順序為優先執行子查詢中的語句。

標量子查詢:必須只能返回一條結果,能夠用於的地方有select,group by,h**ing,order by。

關聯子查詢,用a表關聯a表進行查詢,還需要學習

算術函式:+-*/,abs()絕對值,mod(被除數,除數)取餘,round(物件數值,保留的小數點)

字串函式:concat(str1,str2,..)拼接,length(str)字串長度,lower(str)小寫,replace(原字元,被替換字元,替換內容),substring(str from 起始位置 for 擷取的個數),upper大寫轉換

日期函式:current_date當前日期,current_time當前時間,current_timestamp當前日期和時間,extract(元素日期 from 日期)擷取日期

轉換函式:cast(轉換當前的值 as 轉換後的值型別)

謂詞:like,模糊查詢 '%a' '%a%' 'a%',列 between a  and b,is null 為空,is not null不為空,in 為or的簡單用法。exists?還需要學習

case:case  when 當滿足條件 then 以什麼結果進行顯示  else 其他情況時進行顯示 end,需要進一步學習。

兩表並集, a union b,將兩表進行合並且去重複。需要注意的事項:兩表的列數與型別必須一致,order by 需要放在最後使用一次。 union all 兩表合併不去重,效率比union要高,因為少了一步去重。

聯結:內聯結:select * from a inner join b on a.id=b.id,其中on為兩表之間關聯的鍵,也就是將兩表聯結條件。

外聯結:

左外聯結:select * from a left join b on a.id=b.id

右外聯結:select * from a right join b on a.id=b.id

on的含義和內聯結一致,不同之處在於會以join前的表為主表,查詢除了兩表共有的結果外還會把主表中剩餘的部分也進行顯示。

第8章的主視窗函式與grouping運算子mysql不支援,本次主要是學習mysql所以並沒有進行深入學習。第九章主要講述的是如何使用j**a程式連線資料庫,這個部分已經熟悉,所以不再學習。

SQL資料庫學習

一 認識資料庫 1 資料庫的基本概念 2 資料庫常用物件 3 資料庫的組成 資料庫主要由檔案和檔案組組成。資料庫中所有的資料和物件都被儲存在檔案中。二 建立資料庫 1 建立資料庫 物件資源管理器 資料庫 右擊 新建資料庫 三 運算元據表與檢視 1 建立資料表 空值 表示資料未知。非空值 資料列不允許...

mysql資料庫sql優化

sql優化 本文件描述了mysql資料庫的sql優化,從整體上描述mysql資料庫的sql執行過程,及整個流程上相關優化點,重點描述innodb儲存引擎的索引優化及鎖機制,旨在為讀者提供在mysql上做sql優化的思路,達到授人以漁的效果,希望能為讀者帶來收穫。效能 完成某項任務所需要的時間度量,即...

MySQL資料庫學習筆記(六) SQL(約束)

概述 非空約束 唯一約束 主鍵約束 建立表時新增唯一約束 建立stu表時給id新增主鍵約束 create table stu id int primary key,name varchar 20 刪除stu表中id的主鍵約束 alter table stu drop primary key 建立表之...