查詢分類
單表查詢:簡單查詢
多表查詢:連接查詢
聯合查詢:多個查詢結果匯總
查詢的組成
投影查詢:挑選要顯示的字段
select array1,array2,... from tb_name;
選擇查詢:挑選符合條件的行
select * from tb_name where-clause
where-clause:布爾條件表達式 = # 等值比較 <=> # 等值比較,包括與NULL的安全比較 <>或!= # 不等值比較 <,<=,>,>= # 其它比較符 IS NULL # 是否為空值 IS NOT NULL # 是否不為空值 LIKE # 支持的通配符有%和_ RLIKE或REGEXP # 正則表達式匹配 IN # 判指定字段的值是否在給定的列表中 BETWEEN … AND … # 在某取值范圍內
組合條件查詢
NOT,! # 非 AND,&& # 和 OR,|| # 或
聚合函數查詢
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行
其它修飾符
|
1
2
3
|
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 students,classes # 注:不帶where子句哦
條件比較連接:在連接條件中使用除等號(=)運算符之外的運算符,如>,>=,<,<=,<>等
自然連接:在連接條件中使用等號(=)運算符,且只選擇結果集中的部分列,並刪除連接表中的重復列
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和union all的區別
union all:只是簡單的將多個表的結果合並后返回,不刪除重復行,效率較高
實例
涉及的表結構:
查詢需求有:


