4.單表-多表查詢
阿新 • • 發佈:2021-01-11
表單查詢
1.單表查詢
# 多個查詢條件共同出現時使用順序 """ select ... from ... where ... group by ... having ... order by ... limit ... 查詢的資料可以用 as 起別名 """ # 一.where 條件的使用 功能:對錶中的資料進行篩選和過濾 語法: # 1.判斷的符號 > < >= <= = !=( <>不等於 ) # 2.拼接不同條件的關鍵字 and or not # 3.查詢區間值 between 小值 and 大值 [小值,大值] 查詢兩者之間的範圍 # 4.查詢區間值 id in (1,2,3,4,5,6) #5.模糊查詢 like %萬用字元 _萬用字元 like "%b" 匹配以b結尾的任意長度字串 like "a%" 匹配以a開頭的任意長度字串 like "%c%" 匹配字串中含有c的任意長度字串 like "__d" 匹配總長度為3位,而且以d結尾的字串 like "e__" 匹配總長度為3位,而且以e開頭的字串 # 6. 去重 查詢欄位內種類 distinct(欄位) # 二. group by 子句 分類,分組 各個部門 """注意點: 針對於當前表,by誰搜誰""" select sex from employee group by sex select emp_name from employee group by sex # error # 解決辦法 group_concat 按照分組把對應的欄位拼接在一起 select group_concat(emp_name) from employee group by sex; # 聚合函式 只能用在group by 中 # count 統計數量 * 號代表所有 select count(*) from employee # max 統計最大值 select max(salary) from employee; # min 統計最大值 select min(salary) from employee; # avg 統計平均值 select avg(salary) from employee; # sum 統計總和 select sum(salary) from employee; # 三.having 對分類後的資料進行二次過濾[應用在group by這個場景裡] # 四.order by 排序 """ 正序 升序 asc 倒序 降序 desc """ #練習:order by select * from employee order by age; #(預設升序) select * from employee order by age asc; # 升序 select * from employee order by age desc; # 降序 # 五.limit 限制查詢的條數 """ limit m,n m代表從第幾條搜尋資料 , n 代表搜尋幾條 m=0 代表搜尋第一條資料 limit n n 代表搜尋幾條 """ # 網頁分頁瀏覽 select * from employee limit 0,10 # 0代表第一條 ,往後搜10條資料 select * from employee limit 10,10 # 10代表第11條,往後搜10條資料 # limit 數字 代表搜尋條數 select * from employee limit 1; # 搜尋表裡面最後一條資料 select * from employee order by id desc limit 1; # 搜尋表裡面最後三條資料 select * from employee order by id desc limit 3; # 六.(瞭解) 可以使用正則表示式 (不推薦使用) select * from employee where emp_name regexp ".*n$"; #?號不識別 select * from employee where emp_name regexp "程咬.*";
2.多表查詢
# 1.內聯查詢(內聯接): inner join ...on.. 至少兩表以上做查詢,把滿足條件的所有資料查詢出來(查詢的是共同擁有的資料) select 欄位 from 表1 inner join 表2 on 必要的關聯欄位 (2張表) select 欄位 from 表1 inner join 表2 on 必要的關聯欄位1 inner join 表3 on 必要的關聯欄位2 ... inner join ... # 語法: select * from employee inner join department on employee.dep_id = department.id ; # as 起別名 (推薦) select * from employee as e inner join department as d on e.dep_id = d.id ; # as 可以省略 select * from employee e inner join department d on e.dep_id = d.id ; # where 寫法預設等價於inner join ..on..也是內聯查詢 select * from employee , department where employee.dep_id = department.id ; select * from employee as e, department as d where e.dep_id = d.id ; # 2.外聯查詢(外聯接) # (1) left join ..on.. (左聯接) : 以左表為主,右表為輔,完整查詢左表所有資料,右表沒有的資料補null select * from employee left join department on employee.dep_id = department.id ; # (2) right join ..on.. (右聯接): 以右表為主,左表為輔,完整查詢右表所有資料,左表沒有的資料補null select * from employee right join department on employee.dep_id = department.id ; # 3.全聯查詢(全聯接) left join +(union) right join select * from employee left join department on employee.dep_id = department.id union select * from employee right join department on employee.dep_id = department.id ; # 4.子查詢 """ 子查詢 : sql語句的巢狀 (1) sql語句當中巢狀另外一條sql,用括號()包起來,表達一個整體; (2) 一般用在子句的後面 比如from , where ...身後 表達一個條件或者一張表 (3) 速度快慢 : 單表查詢 > 聯表查詢 > 子查詢 """ # 帶EXISTS關鍵字的子查詢 """ exists 關鍵字,表達資料是否存在,用在子查詢裡 如果內層sql 能夠查到資料,返回True ,外層sql執行sql語句 如果內層sql 不能夠查到資料,返回False ,外層sql不執行sql語句 """ select * from employee where exists (select * from employee where id = 1); """ 總結: 子查詢可以作為臨時表,也可以作為where子句的條件,通過()包括sql,表達一個整體; 一般用在各個子句後面 select .. from ... where ... 思路: 可以把臨時搜尋出來的資料變成臨時表,在和其他表做聯表,最後做單表查詢; """