最近又把《sql 必知必會》仔細翻了一遍,因此將基礎知識整理回顧,加深印象。
本篇包含知識點如圖:
假設有兩張表:student(sno,name,***,age,class,addr) ,sno為主鍵
grade(id,sno,math,chinses,english),id為主鍵
以下sql語句,基於mysql資料庫編寫
一、檢索資料(select)
select sno from student; # 檢索單個列
select sno,***,age from student; # 檢索多列
select * from student; # 檢索所有列 優點:能檢索出名字未知的列 缺點:降低檢索效能
檢索唯一不同/不重複 值 : distinct
select distinct name from student;
注意:distinct 關鍵字,作用於所有列,而不僅僅是跟在其後的那一列。
下面的語句,因為指定的兩列不完全相同,所以會返回student所有的行。
select distinct name,addr from student;
限制檢索結果:limit
select name from student # 檢索student表中從第 3 行起的 4 行資料
limit 4 offset 2; # 第乙個被檢索的是第0行,所以 2 實際是檢索第 3 行
limit 指定返回的行數,offset 指定從**開始。
二、排序(order by)
公升序(預設的):asc 降序:desc (order by 必須是select 的最後一條子句)
單個列排序
select name,age feom student
order by age; # 按年齡公升序排列
多個列排序
select name,age,class from student
order by age,class; # 先按年齡排,年齡相同再按班級排
指定方向排序
select name,age,class from student
order by age desc,class desc; #若在多個列上降序,必須對每一列指定desc關鍵字
三、過濾資料(where / and / or / not / is null / between / in )
where +條件
select name,age,class feom student
where age > 15; # 檢索年齡大於15歲的
select name,age,class feom student
where age <= 18; # 檢索年齡小於等於18的
select name,age,class feom student
where age = 14; # 檢索年齡等於14的
select name,age,class feom student
where age != 12; # 檢索年齡不等於12的
邏輯運算:and / or / not 優先順序:( ) > not> and >or
select name,age,class feom student
where age = 10 and class = 14; # 同時滿足兩個條件的值 年齡=10 且 班級=14
select name,age,class feom student
where age = 15 or class = 16; # 滿足其中任一條件的值 年齡=15 或者 班級=16
select name,age,class feom student
where not age = 15; # 不包含該條件的值 年齡!=15
特殊條件:is null / between / in
(1)null:無值,它與字段包含0,空字串或僅僅包含空格不同;無法比較null和0,因為他們是不等價的。
判斷是null值:is null 判斷不是null值:is not null
select name,addr from student
where addr is null; # 位址是null值
select name,addr from student
where addr is not null; # 位址不是null值
(2)範圍值檢索 between and / or
select name,age from student
where age between 12 and 16; # 年齡在12~16之間
select name,age from student
where age in(10,12,14,16,18); # 年齡是括號中的值的
ps: in 與 or 能完成相似的功能,但 in 更好。
因為:in操作符的語法更清楚、直觀;求值順序更易於管理;執行速度相對or要快一些;可以包含其他select語句。
(3)like 模糊檢索(% ,_ , [ ])
%:任何字元出現任意次數,匹配0個、1個或多個(不匹配null)
select name from student
where name like '%mark%'; # 匹配 name 包含 mark 的
select name from student
where name like '%mark'; # 匹配 name 以 mark 結尾的
select name from student
where name like 'mark%'; # 匹配 name 以 mark 開頭的
_ : 匹配單個字元(總是剛好匹配乙個字元,不能多也不能少)
select name from student
where name like '_ark'; # 匹配長度為4,且後三個字元為ark的,例如 mark/lark/hark
select name from student
where name like 'mar_'; # 匹配長度為4,且前三個字元為mar的,例如 mard/marl/maef
select name from student
where name like '_ma_'; # 匹配長度為4,且中間兩個字元為ma的,例如 mmaa/smad/kmaf
[ ] :匹配括號中任意乙個字元,只能匹配單個字元;可以用字首字元^來否定
select name from student
where name like '[mk]%'; # 匹配以 m 或 k 開頭的,例如 mark/kind/mind/kol
select name from student
where name like '%[mn]'; # 匹配以 m 或 n 結尾的,例如 moon/han
select name from student
where name like '[^abc]%'; # 匹配不以 a 或 b 或 c 開頭的,例如 doop/lamb
ps:使用萬用字元的技巧
使用萬用字元檢索,要比其他的檢索花費更長的處理時間;能不用就不用,非要用就盡量不要放在搜尋的開始處。把萬用字元放在開始處,搜尋起來是最慢的。
SQL必知必會 SQL基礎篇
是否使用外來鍵確實會有一些爭議。關於外來鍵的使用 首先,外來鍵本身是為了實現強一致性,所以如果需要正確性 效能的話,還是建議使用外來鍵,它可以讓我們在資料庫的層面保證資料的完整性和一致性。當然不用外來鍵,你也可以在業務層進行實現。不過,這樣做也同樣存在一定的風險,因為這樣,就會讓業務邏輯會與資料具備...
SQL必知必會
資料庫 儲存有組織的資料的容器。資料庫管理系統 dbms 資料庫軟體,資料庫是通過dbms建立和操縱的容器。表 某種特定資料型別的結構化清單。資料庫中的每個表都有自己的名字,且唯一。不同的資料庫可以使用相同的表名。表的特性 模式 資料在表中如何儲存,儲存什麼樣的資料,資料如何分解。模式可以用來描述資...
SQL必知必會筆記一
外來鍵 select語句 檢索單個列select prod name from products 從products表中檢索乙個名為prod name的列檢索多個列 檢索所有列select from products 檢索不同值 限制結果 排序資料select prod name from prod...