數據庫查詢之多表查詢與navicat使用


單表查詢補充

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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM