單表查詢補充
group_concat()
用於分組之后,獲取除了分組之外的其他數據字段,本質可以理解為是拼接操作。
select post,group_concat(name) from emp group by post; select post,group_concat(name,':',salary) from emp group by post;
concat()方法
用於分組之前
select post,group_concat(name,':',salary) from emp group by post;
concat_ws()方法
用於分組之前,多個字符是相同的分隔符的情況
select concat_ws('|',name,age,salary,gender) from emp;
as語法
可以給查詢出來的字段名起別名
select id as '序號',name as '姓名' from emp;
可以給表名起別名
主要用在多表查詢中
# 將emp表名起別名為t1 之后使用t1替代emp
select * from emp as t1 where t1.id > 5;
多表查詢理論
多表查詢
所需數據來源於多張表數據的組合。
數據准備
#建表 create table dep( id int primary key auto_increment, name varchar(20) ); create table emp( id int primary key auto_increment, name varchar(20), gender enum('male','female') not null default 'male', age int, dep_id int ); #插入數據 insert into dep values (200,'技術'), (201,'人力資源'), (202,'銷售'), (203,'運營'); insert into emp(name,gender,age,dep_id) values ('jason','male',18,200), ('egon','female',48,201), ('kevin','male',18,201), ('nick','male',28,202), ('owen','male',18,203), ('jerry','female',18,204);
結論:
SQL語句查詢出來的結果其實也可以看成是一張表,涉及到多表可能會出現字段名沖突需要在字段名前面加上表名做限制。
查詢各員工姓名以及對應的部門名稱
員工姓名在emp表,部門名稱在dep表
# 推導過程1 select * from emp,dep; # 笛卡爾積 # 推導過程2 select * from emp,dep where emp.dep_id=dep.id; # 推導過程3 select emp.name,dep.name from emp,dep where emp.dep_id=dep.id;
多表查詢之聯表
聯表
先將多張表拼接成一張大表,然后再基於單表查詢完成。
MySQL拼接表的關鍵字
inner join 內鏈接
內鏈接只鏈接兩張表中都具有對應數據的部分。
select * from emp inner join dep on emp.dep_id=dep.id;
left join 左鏈接
以關鍵字左表為基礎展示左表所有的數據,沒有對應的數據用null填充。
select * from emp left join dep on emp.dep_id=dep.id;
right join 右鏈接
以關鍵字右表為基礎展示右表所有的數據,沒有對應的數據以null填充
select * from emp right join dep on emp.dep_id=dep.id;
union 全鏈接
不管有沒有對應數據,全部展示,其實就是把左鏈接和右鏈接用union連起來。
select * from emp left join dep on emp.dep_id=dep.id union select * from emp right join dep on emp.dep_id=dep.id;
多表查詢之子查詢
子查詢
將一張表的查詢結果用括號括起來當成另外一條SQL語句的條件。
子查詢一般是分步操作,也即是日常生活中解決問題的思路。
查詢部門是技術或者人力資源的員工信息
方法1:聯表操作
select emp.name,emp.age,dep.name from emp inner join dep on emp.dep_id=dep.id where dep.name in ('技術','人力資源');
方法2:子查詢
# 先查詢技術和人力資源id號 select id from dep where name in ('技術','人力資源'); # 再去員工表里面根據部門id號篩選出員工數據 select * from emp where dep_id in (select id from dep where name in ('技術','人力資源'));
總結
涉及到多表查詢只有兩種方法:
1.聯表操作
2.子查詢
很多復雜的查詢甚至需要兩者的結合。
可視化軟件之navicat
Navicat是一款可以操作多種數據庫的軟件,內部其實就是封裝了相應的SQL語句。
下載安裝
15版本參考地址:https://defcon.cn/214.html
舊版本(11版本)安裝參考地址:http://www.ddooo.com/softdown/59996.htm
也可以免費使用14天,但是建議不要反復試用,否則可能失效。
基本使用
連接
點擊左上角‘連接’,選擇MySQL,輸入密碼,即可鏈接。
創建
選擇連接,右鍵新建數據庫,輸入數據庫名,選擇‘utf8mb4’字符集。
雙擊數據庫,選擇表,右鍵新建表,輸入字段名和字段類型,設置主鍵。
外鍵
點擊外鍵,設置完之后選擇保存即可。
表的連接關系
選擇數據庫,右鍵選擇‘逆向數據庫到模型’,可以看到表之間的連接關系。
SQL文件
選擇一個數據庫,右鍵選擇‘轉儲SQL文件--結構和數據’,可以生成一個sql文件。
使用sql文件
新建一個數據庫,右鍵‘運行SQL文件’,選擇文件導入,即可使用。
作業
查詢平均年齡在25歲以上的部門
連表
select dep.name as '部門' from emp inner join dep on emp.dep_id=dep.id group by dep.name having avg(emp.age)>25;
子查詢
select name from dep where dep.id in (select dep_id from emp group by dep_id having avg(age)>25);