MySQL深刻02-DML之Select查詢

查詢分類正則表達式

單表查詢:簡單查詢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:只是簡單的將多個表的結果合併後返回,不刪除重複行,效率較高

實例

涉及的表結構:

wKioL1NTgmjRiTa1AAsXq1Kb2-I709.jpg

查詢需求有:

wKiom1NTghWwD-ELABLZikPcbqU748.jpg


上一篇:MySQL深刻01-SQL語言-數據字典-服務器變量-數據操做DML-視圖

下一篇:MySQL深刻03-鎖-事務-GTID

相關文章
相關標籤/搜索