MySQL基础——多表查询
目錄
多表關系
多表查詢
連接查詢
內連接
外連接
自連接
聯合查詢
子查詢
標量子查詢
列子查詢
行子查詢
表子查詢
上篇文章我們學習了MySQL基礎——約束,這篇文章我們學習MySQL基礎——多表查詢。
多表關系
在數據表中,各個表結構之間存在著各種關系(一對一、一對多、多對多)。
一對一關系:
示例:學生與學生詳情的關系,一個學生對應一個詳細情況,一個詳細情況對應一個學生。
實現:在任意一方加入外鍵,關聯另外一方的主鍵,并且設置外鍵為唯一的UNIQUE。
一對多關系:
示例:學生與班級的關系,一個班級對應多個學生,一個學生對應一個班級。
實現:在一對多關系中,在多的一方建立外鍵,指向一的一方的主鍵。
多對多關系:
示例:學生與課程的關系,一個學生可以選修多門課程,一門課程也可以給多個學生選擇。
實現:在多對多關系中,建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵。
接下來我們通過一對多關系來演示多表查詢,演示的數據表結構如下:
建表語句如下:
create table classtype(id int auto_increment primary key comment '類型id',name varchar(10) comment '類型名' )comment '班級類型表'; ? create table students(id int auto_increment primary key comment '學生id',name varchar(10) comment '學生名',age int comment '年齡',gender char(1) comment '1:男,2:女',phone char(11) comment '手機號',friendid int comment '朋友id',classid int comment '班級id',constraint fk_students_classtype foreign key(classid) references classtype(id) )comment '學生表';數據表數據如下:
添加數據語句如下:
# 添加班級類型數據 insert into classtype values (null,'Java'),(null,'Python'),(null,'MySQL'),(null,'Hadoop'); ? # 添加學生數據 insert into students values (null,'張三',18,'1','13700000000',2,1),(null,'李四',19,'1','13700000001',3,1),(null,'王五',18,'1','13700000000',3,1),(null,'諸葛亮',16,'1','13730000000',2,3),(null,'孫尚香',18,'2','13769999999',6,2),(null,'馬克',16,'1','13755555555',1,2),(null,'武則天',16,'2','13666666666',5,4),(null,'艾琳',16,'2','13444444444',9,3),(null,'公孫離',20,'2','13733333333',7,4),(null,'李元芳',15,'1','1300000000',1,null);多表查詢
多表查詢可以分為連接查詢、聯合查詢和子查詢。
連接查詢
連接查詢有:
-
內連接:相當于查詢A、B交集部分數據;
-
外連接:左(右)外連接,查詢左(右)表所有數據,以及兩張表交集部分數據;
-
自連接:當前表與自身的連接查詢,自連接必須使用表別名。
內連接
內連接可以分為隱式內連接和顯式內連接,語法格式如下:
# 隱式內連接 select 字段列表 FROM 表1,表2 where 條件.....; ? # 顯式內連接 select 字段列表 FROM 表1 [inner] join 表2 on 連接條件....;查詢學生的所有信息,示例代碼如下:
# 隱式內連接 select * from students,classtype where students.classid=classtype.id; ? # 顯式內連接 select * from students inner join classtype on students.classid=classtype.id;如下圖所示:
由于id為10的學生classid為null,所以只顯示了9條數據。
當我們的數據表名很長時,可以為數據表其別名,上面的代碼可以改寫為:
# 隱式內連接 select * from students s,classtype c where s.classid=c.id; ? # 顯式內連接 select * from students s inner join classtype c on s.classid=c.id;返回的結果是一樣的。
外連接
外連接查詢語法格式如下:
# 左外連接 select 字段列表 FROM 表1 left [outer] join 表2 on 條件...; ? # 右外連接 select 字段列表 FROM 表1 right [outer] join 表2 on 條件...;查詢學生的所有信息,示例代碼如下:
# 左外連接 select * from students left outer join classtype on students.classid=classtype.id; ? # 右外連接 select * from students right outer join classtype on students.classid=classtype.id;如下圖所示:
自連接
自連接查詢,可以是內連接查詢,也可以是外連接查詢,語法格式如下:
select 字段列表 from 表A 別名A join 表名A 別名B on 條件...;示例代碼如下:
select a.name,b.name from students a join students b on a.id=b.friendid;如下圖所示:
聯合查詢
聯合查詢就是把多次查詢的結果合并起來,形成一個新的查詢結果集,使用union、union all關鍵字連接,語法格式如下:
select 字段列表 from 表A union [all] select 字段列表 from 表B查詢學生年齡大于17和學生性別為男的所有信息,示例代碼如下:
select * from students where age>17; select * from students where gender=1; select * from students where age>17 union all select * from students where gender=1;如下圖所示:
這樣就把兩個查詢的結果合并在一起了。但沒有去重,這時我們只需要把all去掉就可以去重了,代碼如下:
select * from students where age>17 union select * from students where gender=1;如下圖所示:
注意:在聯合查詢中,多張表的列數、字段類型必須保持一致。
子查詢
在SQL語句中嵌套select語句,稱為嵌套查詢,又稱子查詢。語法格式如下:
select * from t1 where column1=(select column1 from t2);子查詢外部的語句可以是insert、update、delete、select的任何一個。
根據子查詢結果不同,分為:
-
標量子查詢(子查詢結果為單個值);
-
列子查詢(子查詢結果為一列);
-
行子查詢(子查詢結果為一行);
-
表子查詢(子查詢結果為多行多列)。
根據子查詢位置,可以分為:where之后,from之后,select之后。
標量子查詢
子查詢返回的結果是單個值(數字、字符串、日期等),最簡單的形式,這種子查詢成為標量子查詢。
常用的操作符:= 、<> 、 > 、 >= 、 < 、 <=。
查詢班級為Python的所有學生信息,示例代碼如下:
select * from students where classid=(select id from classtype where name='Python');如下圖所示:
列子查詢
子查詢返回的結果是一列或多列,這種子查詢稱為列子查詢。
常用的操作符:
-
IN:在指定的集合范圍之內,多選一;
-
NOT IN :不在指定的集合范圍之內;
-
ANY:子查詢返回列表中,有任意一個滿足即可;
-
SOME:子查詢返回列表中,有任意一個滿足即可;
-
ALL:子查詢返回列表的所有值都必須滿足。
查詢學生班級為Python或Java的所有學生信息,示例代碼如下:
select * from students where id in (select id from classtype where name='Python' or name='Java');如下圖所示:
行子查詢
子查詢返回的結果是一行或多列,這種子查詢稱為行子查詢。
常用的操作符:=、<>、IN 、NOT IN。
示例代碼如下:
select * from students where id in (select id from classtype where friendid='2');表子查詢
子查詢返回的結果是多行多列,這種子查詢稱為表子查詢。
常用的操作符為IN。
查詢與張三、孫尚香年齡和手機號相同的學生信息,示例代碼如下:
select * from students where (age,phone) in (select age,phone from students where name='張三' or name='孫尚香');如下圖所示:
好了,MySQL基礎——多表查詢就學到這里了,下篇文章學習MySQL基礎——事務。
總結
以上是生活随笔為你收集整理的MySQL基础——多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue组件-提升
- 下一篇: linux cmake编译源码,linu