日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL基础——多表查询

發布時間:2023/12/18 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基础——多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。