查詢分類正則表達式
單表查詢:簡單查詢sql
多表查詢:鏈接查詢緩存
聯合查詢:多個查詢結果彙總安全
查詢的組成bash
投影查詢:挑選要顯示的字段服務器
select array1,array2,... from tb_name; |
選擇查詢:挑選符合條件的行ide
select * from tb_name where-clause函數 |
where-clause:布爾條件表達式 = # 等值比較 <=> # 等值比較,包括與NULL的安全比較 <>或!= # 不等值比較 <,<=,>,>= # 其它比較符 IS NULL # 是否爲空值 IS NOT NULL # 是否不爲空值 LIKE # 支持的通配符有%和_ RLIKE或REGEXP # 正則表達式匹配 IN # 判指定字段的值是否在給定的列表中 BETWEEN … AND … # 在某取值範圍內
組合條件查詢優化
NOT,! # 非 AND,&& # 和 OR,|| # 或
聚合函數查詢spa
SUM() # 求總和 AVG() # 求平均值 MAX() # 求最大值 MIN() # 求最小值 COUNT() # 求記錄總數 #注:count(*)效率最低,可指定某一字段求總數,如count(Name)
查詢語句
語法
select ... from tb_name where-clause [others-clause] |
各子句類型及做用
where # 條件過濾 group by # 對查詢結果分組 having # 對group by的結果進行條件過濾 order by # 排序 limit # 限制輸出行數,如」limit 2「表示只顯示前2行,「limit 2,3」表示偏移前2行,顯示3-5行
其它修飾符
distinct # 指定的結果相同的只顯示一次 sql_cache # 緩存於查詢緩存中 sql_no_cache # 不緩存查詢結果
select的執行流程
from-->where-->group by-->having-->order by-->select-->limit |
多表查詢
說明
事先將兩張或多張錶鏈接(join),根據鏈接的結果進行查詢
語法
select … from tb1 Join_Type tb2 [on (Join_Condition)] 鏈接類型有: cross join,inner join,left join和right join等 |
鏈接分類
cross join:交叉鏈接,又稱笛卡爾乘積
表1中的記錄(共M條)與表2中的記錄(共N條)逐一鏈接,交叉鏈接數據量較大,共M*N條記錄;
select * from students,classes # 注:不帶where子句哦
inner join:內鏈接,根據鏈接判斷的運算符又可分類以下:
等值鏈接:根據表1和表2中某字段值相等進行鏈接,其查詢結果中列出被鏈接表中的全部列,包括其中的重複列
select * from authors as a inner join publishers as p on a.city=p.city
條件比較鏈接:在鏈接條件中使用除等號(=)運算符以外的運算符,如>,>=,<,<=,<>等
天然鏈接:在鏈接條件中使用等號(=)運算符,且只選擇結果集中的部分列,並刪除鏈接表中的重複列
select a.name,p.pub_name from authors as a inner join publishers as p on a.city=p.city
外鏈接:返回查詢結果集合中的不只包含符合鏈接條件的行,並且還包括左表(左外鏈接)、右表(右外鏈接)或兩個邊接表(全外鏈接)中的全部數據行
左外鏈接:返回包括左表中的全部記錄和右表中聯結字段相等的記錄
tb1 LEFT JOIN tb2 ON 鏈接條件
右外鏈接:返回包括右表中的全部記錄和左表中聯結字段相等的記錄
tb1 RIGHT JOIN tb2 ON 鏈接條件
全外鏈接:鏈接運算兩邊的關係中的元組都保留,MySQL不支持此種鏈接
自鏈接:同一表中某字段的屢次比較使用
select stu1.Name as StuName,stu2.Name as TeachName from students as stu1,students as stu2 where stu1.TeacherID=stu2.StuID;
子查詢
說明:
在外層查詢中嵌套的內層查詢叫作子查詢,類型有:
where型子查詢:把內層查詢結果當作外層查詢的比較條件
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods) # 子查詢的返回值只能有1個
exists型子查詢:把內層查詢結果拿到外層,看外層的查詢是否成立
select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id); # 可經過轉換爲內鏈接查詢: select cat_id,cat_name from category inner join goods on goods.cat_id=category.cat_id; # 與exists相似的還有in子查詢,表示外層查詢條件在一個內層查詢的結果集內 select * from user_core where userId in (select userId from user_classes where class_id=’A001’);
from型子查詢:把內層的查詢結果供外層查詢使用
select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2)) group by name;
注:MySQL不擅長於子查詢的優化,故應避免使用子查詢
聯合查詢
說明
把兩個或多個查詢語句的結果合併成一個結果進行輸出,前提是多個查詢結果的輸出字段是一致的
語法
SELECT clause UNION SELECT clause UNION … |
union和union all的區別
union:會將多個表的查詢結果合併後進行排序,同時刪除重複的行,故效率略慢;
union all:只是簡單的將多個表的結果合併後返回,不刪除重複行,效率較高
實例
涉及的表結構:
查詢需求有: