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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mysql获取多张表中的数据_mysql 之多表查询

發布時間:2023/12/19 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql获取多张表中的数据_mysql 之多表查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

一 介紹

二 多表連接查詢

三 符合條件連接查詢

四 子查詢

五 綜合練習

一 介紹

本節主題

多表連接查詢

復合條件連接查詢

子查詢

首先說一下,我們寫項目一般都會建一個數據庫,那數據庫里面是不是存了好多張表啊,不可能把所有的數據都放到一張表里面,肯定要分表來存數據,這樣節省空間,數據的組織結構更清晰,解耦和程度更高,但是這些表本質上是不是還是一個整體啊,是一個項目所有的數據,那既然分表存了,就要涉及到多個表連接查詢了,比如說員工信息一張表,部門信息一張表,那如果我想讓你幫我查一下技術部門有哪些員工的姓名,你怎么辦,單獨找員工表能實現嗎,不能,單獨找部門表也無法實現,因為部門表里面沒有員工的信息,對不對,所以就涉及到部門表和員工表來關聯到一起進行查詢了,好,那我們來建立這么兩張表:

復制代碼

建表

部門表

create table department(

id int,

name varchar(20)

);

員工表,之前我們學過foreign key,強行加上約束關聯,但是我下面這個表并沒有直接加foreign key,這兩個表我只是讓它們在邏輯意義上有關系,并沒有加foreign key來強制兩表建立關系,為什么要這樣搞,是有些效果要給大家演示一下

所以,這兩個表是不是先建立哪個表都行啊,如果有foreign key的話,是不是就需要注意表建立的順序了。那我們來建表。

create table employee(

id int primary key auto_increment,

name varchar(20),

sex enum('male','female') not null default 'male',

age int,

dep_id int

);

給兩個表插入一些數據

insert into department values

(200,'技術'),

(201,'人力資源'),

(202,'銷售'),

(203,'運營'); #注意這一條數據,在下面的員工表里面沒有對應這個部門的數據

insert into employee(name,sex,age,dep_id) values

('egon','male',18,200),

('alex','female',48,201),

('wupeiqi','male',38,201),

('yuanhao','female',28,202),

('liwenzhou','male',18,200),

('jingliyang','female',18,204) #注意這條數據的dep_id字段的值,這個204,在上面的部門表里面也沒有對應的部門id。所以兩者都含有一條雙方沒有涉及到的數據,這都是為了演示一下效果設計的昂

;

查看表結構和數據

mysql> desc department;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | YES | | NULL | |

| name | varchar(20) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

mysql> desc employee;

+--------+-----------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+--------+-----------------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | varchar(20) | YES | | NULL | |

| sex | enum('male','female') | NO | | male | |

| age | int(11) | YES | | NULL | |

| dep_id | int(11) | YES | | NULL | |

+--------+-----------------------+------+-----+---------+----------------+

mysql> select * from department;

+------+--------------+

| id | name |

+------+--------------+

| 200 | 技術 |

| 201 | 人力資源 |

| 202 | 銷售 |

| 203 | 運營 |

+------+--------------+

mysql> select * from employee;

+----+------------+--------+------+--------+

| id | name | sex | age | dep_id |

+----+------------+--------+------+--------+

| 1 | egon | male | 18 | 200 |

| 2 | alex | female | 48 | 201 |

| 3 | wupeiqi | male | 38 | 201 |

| 4 | yuanhao | female | 28 | 202 |

| 5 | liwenzhou | male | 18 | 200 |

| 6 | jingliyang | female | 18 | 204 |

+----+------------+--------+------+--------+

復制代碼

二 多表連接查詢

重點:外鏈接語法

SELECT 字段列表

FROM 表1 INNER|LEFT|RIGHT JOIN 表2

ON 表1.字段 = 表2.字段;

1、交叉連接:不適用任何匹配條件。生成笛卡爾積

補充一點:select 查詢表的時候,后面可以跟多張表一起查詢:

復制代碼

mysql> select * from department,employee; #表用逗號分隔,看我查詢時表的順序,先department后employee,所以你看結果表的這些字段,是不是就是我們兩個表字段并且哪個表在前面,哪個表的字段就在前面

+------+--------------+----+------------+--------+------+--------+

| id | name | id | name | sex | age | dep_id |

+------+--------------+----+------------+--------+------+--------+

| 200 | 技術 | 1 | egon | male | 18 | 200 |

| 201 | 人力資源 | 1 | egon | male | 18 | 200 |

| 202 | 銷售 | 1 | egon | male | 18 | 200 |

| 203 | 運營 | 1 | egon | male | 18 | 200 |

| 200 | 技術 | 2 | alex | female | 48 | 201 |

| 201 | 人力資源 | 2 | alex | female | 48 | 201 |

| 202 | 銷售 | 2 | alex | female | 48 | 201 |

| 203 | 運營 | 2 | alex | female | 48 | 201 |

| 200 | 技術 | 3 | wupeiqi | male | 38 | 201 |

| 201 | 人力資源 | 3 | wupeiqi | male | 38 | 201 |

| 202 | 銷售 | 3 | wupeiqi | male | 38 | 201 |

| 203 | 運營 | 3 | wupeiqi | male | 38 | 201 |

| 200 | 技術 | 4 | yuanhao | female | 28 | 202 |

| 201 | 人力資源 | 4 | yuanhao | female | 28 | 202 |

| 202 | 銷售 | 4 | yuanhao | female | 28 | 202 |

| 203 | 運營 | 4 | yuanhao | female | 28 | 202 |

| 200 | 技術 | 5 | liwenzhou | male | 18 | 200 |

| 201 | 人力資源 | 5 | liwenzhou | male | 18 | 200 |

| 202 | 銷售 | 5 | liwenzhou | male | 18 | 200 |

| 203 | 運營 | 5 | liwenzhou | male | 18 | 200 |

| 200 | 技術 | 6 | jingliyang | female | 18 | 204 |

| 201 | 人力資源 | 6 | jingliyang | female | 18 | 204 |

| 202 | 銷售 | 6 | jingliyang | female | 18 | 204 |

| 203 | 運營 | 6 | jingliyang | female | 18 | 204 |

+------+--------------+----+------------+--------+------+--------+

24 rows in set (0.12 sec)

我們讓employee表在前面看看結果,注意看結果表的字段

mysql> select * from employee,department;

+----+------------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+----+------------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技術 |

| 1 | egon | male | 18 | 200 | 201 | 人力資源 |

| 1 | egon | male | 18 | 200 | 202 | 銷售 |

| 1 | egon | male | 18 | 200 | 203 | 運營 |

| 2 | alex | female | 48 | 201 | 200 | 技術 |

| 2 | alex | female | 48 | 201 | 201 | 人力資源 |

| 2 | alex | female | 48 | 201 | 202 | 銷售 |

| 2 | alex | female | 48 | 201 | 203 | 運營 |

| 3 | wupeiqi | male | 38 | 201 | 200 | 技術 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力資源 |

| 3 | wupeiqi | male | 38 | 201 | 202 | 銷售 |

| 3 | wupeiqi | male | 38 | 201 | 203 | 運營 |

| 4 | yuanhao | female | 28 | 202 | 200 | 技術 |

| 4 | yuanhao | female | 28 | 202 | 201 | 人力資源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 銷售 |

| 4 | yuanhao | female | 28 | 202 | 203 | 運營 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技術 |

| 5 | liwenzhou | male | 18 | 200 | 201 | 人力資源 |

| 5 | liwenzhou | male | 18 | 200 | 202 | 銷售 |

| 5 | liwenzhou | male | 18 | 200 | 203 | 運營 |

| 6 | jingliyang | female | 18 | 204 | 200 | 技術 |

| 6 | jingliyang | female | 18 | 204 | 201 | 人力資源 |

| 6 | jingliyang | female | 18 | 204 | 202 | 銷售 |

| 6 | jingliyang | female | 18 | 204 | 203 | 運營 |

+----+------------+--------+------+--------+------+--------------+

24 rows in set (0.00 sec)

關于笛卡兒積:我們看一下上面的這些數據,有什么發現,首先看到這些字段都顯示出來了,并且數據變得很多,我們來看一下,這么多條數據都是怎么來的,為什么會出現這么條數據,笛卡兒積這是一個數據名詞,你可以去研究研究~~

因為我們要進行連表查詢,那么mysql并不知道你想要如何連接兩個表的關系進行查詢,那么mysql會將你兩個表數據的所有組合關系都給你拼接成一條數據來顯示,這樣你就可以想查哪個關聯關系的數據就查哪個了,如果還是不太理解看一下下面的圖:

復制代碼

關于笛卡兒積現象的解釋圖:

咱們為了更好的管理數據,為了節省空間,為了數據組織結構更清晰,將數據拆分到了不同表里面,但是本質上是不是還是一份數據,一份重復內容很多的很大的數據,所以我們即便是分表了,但是咱們是不是還需要找到一個方案把兩個本來分開的表能夠合并到一起來進行查詢,那你是不是就可以根據部門找員工,根據員工找部門了,對不對,但是我們合并兩個表的時候,如何合并,根據什么來合并,通過笛卡兒積這種合并有沒有浪費,我們其實想做的是不是說我們的員工表中dep_id這個字段中的數據和部門表里面的id能夠對應上就可以了,因為我們知道我們設計表的時候,是通過這兩個字段來給兩個表建立關系的,對不對,看下圖:

我們的目標就是將兩個分散出去的表,按照兩者之間有關系的字段,能對應上的字段,把兩者合并成一張表,這就是多表查詢的一個本質。那么笛卡兒積干了什么事兒,就是簡單粗暴的將兩個表的數據全部對應了一遍,用處就是什么呢,它肯定就能保證有一條是對應準的,你需要做的事情就是在笛卡兒積的基礎上只過濾出我們需要的那些數據就行了,笛卡兒積不是咱們最終要得到的結果,只是給你提供了一個基礎,它不管對應的對不對,全部給你對應一遍,然后你自己去篩選就可以了,然后基于笛卡兒積我們來找一下對應的數據,看看能不能找到:

2、內連接:只連接匹配的行

復制代碼

我們要找的數據就是員工表里面dep_id字段的值和部門表里面id字段的值能對應上的那些數據啊,所以你看下面的寫法:

mysql> select * from employee,department where employee.dep_id=department.id;

+----+-----------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+----+-----------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技術 |

| 2 | alex | female | 48 | 201 | 201 | 人力資源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力資源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 銷售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技術 |

+----+-----------+--------+------+--------+------+--------------+

5 rows in set (0.14 sec)

拿到了我們想要的結果。

但是你看,我們左表employee表中的dep_id為204的那個數據沒有了,右表department表的id為203的數據沒有了,因為我們現在要的就是兩表能對應上的數據一起查出來,那個204和203雙方對應不上。

再看一個需求,我要查出技術部的員工的名字

mysql> select name from employee,department where employee.dep_id=department.id and department.name='技術';

ERROR 1052 (23000): Column 'name' in field list is ambiguous

上面直接就報錯了,因為select后面直接寫的name,在兩個表合并起來的表中,是有兩個name字段的,直接寫name是不行的,要加上表名,再看:

mysql> select employee.name from employee,department where employee.dep_id=department.id and department.name='技術';

+-----------+

| name |

+-----------+

| egon |

| liwenzhou |

+-----------+

2 rows in set (0.09 sec)

結果就沒問題了

復制代碼

但是你看上面的代碼有沒有什么不太好的地方,雖然我們能夠完成我們的事情,但是代碼可讀性不好,所以以后不要這么寫,但是看圖:

所以mysql為我們提供了一些專門做連表操作的方法,這些方法語義更加的明確,你一看就知道那些代碼是連表的,那些代碼是查詢的,其實上面的連表也是個查詢操作,但是我們為了區分明確,連表專門用連表的方法,查詢就專門用查詢的方法。那這些專門的方法都是什么呢,看后面的內容:

3 、外鏈接之左連接:優先顯示左表全部記錄

復制代碼

以左表為準,即找出所有員工信息,當然包括沒有部門的員工

本質就是:在內連接的基礎上增加左邊有右邊沒有的結果 #注意語法:

mysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;

+----+------------+--------------+

| id | name | depart_name |

+----+------------+--------------+

| 1 | egon | 技術 |

| 5 | liwenzhou | 技術 |

| 2 | alex | 人力資源 |

| 3 | wupeiqi | 人力資源 |

| 4 | yuanhao | 銷售 |

| 6 | jingliyang | NULL |

+----+------------+--------------+

復制代碼

4 、外鏈接之右連接:優先顯示右表全部記錄

復制代碼

以右表為準,即找出所有部門信息,包括沒有員工的部門

本質就是:在內連接的基礎上增加右邊有左邊沒有的結果

mysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;

+------+-----------+--------------+

| id | name | depart_name |

+------+-----------+--------------+

| 1 | egon | 技術 |

| 2 | alex | 人力資源 |

| 3 | wupeiqi | 人力資源 |

| 4 | yuanhao | 銷售 |

| 5 | liwenzhou | 技術 |

| NULL | NULL | 運營 |

+------+-----------+--------------+

復制代碼

5 、全外連接:顯示左右兩個表全部記錄

復制代碼

全外連接:在內連接的基礎上增加左邊有右邊沒有的和右邊有左邊沒有的結果

注意:mysql不支持全外連接 full JOIN

強調:mysql可以使用此種方式間接實現全外連接

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

;

查看結果

+------+------------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+------+------------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技術 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技術 |

| 2 | alex | female | 48 | 201 | 201 | 人力資源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力資源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 銷售 |

| 6 | jingliyang | female | 18 | 204 | NULL | NULL |

| NULL | NULL | NULL | NULL | NULL | 203 | 運營 |

+------+------------+--------+------+--------+------+--------------+

注意 union與union all的區別:union會去掉相同的紀錄,因為union all是left join 和right join合并,所以有重復的記錄,通過union就將重復的記錄去重了。

復制代碼

三 符合條件連接查詢

復制代碼

示例1:以內連接的方式查詢employee和department表,并且employee表中的age字段值必須大于25,即找出年齡大于25歲的員工以及員工所在的部門

select employee.name,department.name from employee inner join department

on employee.dep_id = department.id

where age > 25;

示例2:以內連接的方式查詢employee和department表,并且以age字段的升序方式顯示

select employee.id,employee.name,employee.age,department.name from employee,department

where employee.dep_id = department.id

and age > 25

order by age asc;

復制代碼

四 子查詢

子查詢其實就是將你的一個查詢結果用括號括起來,這個結果也是一張表,就可以將它交給另外一個sql語句,作為它的一個查詢依據來進行操作。

來,我們簡單來個需求:技術部都有哪些員工的姓名,都顯示出來: 1、看一下和哪個表有關,然后from找到兩個表 2、進行一個連表操作 3、基于連表的結果來一個過濾就可以了

復制代碼

我們之前的做法是:先連表

mysql> select * from employee inner join department on employee.dep_id = department.id;

+----+-----------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+----+-----------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技術 |

| 2 | alex | female | 48 | 201 | 201 | 人力資源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力資源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 銷售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技術 |

+----+-----------+--------+------+--------+------+--------------+

5 rows in set (0.10 sec)

然后根據連表的結果進行where過濾,將select*改為select employee.name

mysql> select employee.name from employee inner join department on employee.dep_id = department.id where department.name='技術';

+-----------+

| name |

+-----------+

| egon |

| liwenzhou |

+-----------+

2 rows in set (0.09 sec)

復制代碼

然后看一下子查詢這種方式的寫法:它的做法就是解決完一個問題,再解決下一個問題,針對我們上面的需求,你想,我們的需求是不是說找技術部門下面有哪些員工對不對,如果你直接找員工表,你能確定哪個dep_id的數值表示的是技術部門嗎,不能,所以咱們是不是應該先確定一個技術部門對應的id號是多少,然后根據部門的id號,再去員工表里面查詢一下dep_id為技術部門對應的部門表的那個id號的所有的員工表里面的記錄:好,那我們看一下下面的操作

復制代碼

首先從部門表里面找到技術部門對應的id

mysql> select id from department where name='技術';

+------+

| id |

+------+

| 200 |

+------+

1 row in set (0.00 sec)

那我們把上面的查詢結果用括號括起來,它就表示一條id=200的數據,然后我們通過員工表來查詢dep_id=這條數據作為條件來查詢員工的name

mysql> select name from employee where dep_id = (select id from department where name='技術');

+-----------+

| name |

+-----------+

| egon |

| liwenzhou |

+-----------+

2 rows in set (0.00 sec)

上面這些就是子查詢的一個思路,解決一個問題,再解決另外一個問題,你子查詢里面可不可以是多個表的查詢結果,當然可以,然后再通過這個結果作為依據來進行過濾,然后我們學一下子查詢里面其他的內容,往下學。

復制代碼

子查詢:

1:子查詢是將一個查詢語句嵌套在另一個查詢語句中。

2:內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。

3:子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字

4:還可以包含比較運算符:= 、 !=、> 、

1、帶IN關鍵字的子查詢

復制代碼

查詢員工平均年齡在25歲以上的部門名,可以用連表,也可以用子查詢,我們用子查詢來搞一下

select id,name from department

where id in

(select dep_id from employee group by dep_id having avg(age) > 25);

連表來搞一下上面這個需求

select department.name from department inner join employee on department.id=employee.dep_id

group by department.name

having avg(age)>25;

總結:子查詢的思路和解決問題一樣,先解決一個然后拿著這個的結果再去解決另外一個問題,連表的思路是先將兩個表關聯在一起,然后在進行group by啊過濾啊等等操作,兩者的思路是不一樣的

查看技術部員工姓名

select name from employee

where dep_id in

(select id from department where name='技術');

查看不足1人的部門名(子查詢得到的是有人的部門id)

select name from department where id not in (select distinct dep_id from employee);

復制代碼

2、帶比較運算符的子查詢

復制代碼

比較運算符:=、!=、>、>=、

查詢大于所有人平均年齡的員工名與年齡

mysql> select name,age from emp where age > (select avg(age) from emp);

+---------+------+

| name | age |

+---------+------+

| alex | 48 |

| wupeiqi | 38 |

+---------+------+

2 rows in set (0.00 sec)

查詢大于部門內平均年齡的員工名、年齡

select t1.name,t1.age from emp t1

inner join

(select dep_id,avg(age) avg_age from emp group by dep_id) t2

on t1.dep_id = t2.dep_id

where t1.age > t2.avg_age;

復制代碼

3、帶EXISTS關鍵字的子查詢

EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。而是返回一個真假值。True或False

當返回True時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢。還可以寫not exists,和exists的效果就是反的

復制代碼

department表中存在dept_id=203,Ture

mysql> select * from employee

-> where exists

-> (select id from department where id=200);

+----+------------+--------+------+--------+

| id | name | sex | age | dep_id |

+----+------------+--------+------+--------+

| 1 | egon | male | 18 | 200 |

| 2 | alex | female | 48 | 201 |

| 3 | wupeiqi | male | 38 | 201 |

| 4 | yuanhao | female | 28 | 202 |

| 5 | liwenzhou | male | 18 | 200 |

| 6 | jingliyang | female | 18 | 204 |

+----+------------+--------+------+--------+

department表中存在dept_id=205,False

mysql> select * from employee

-> where exists

-> (select id from department where id=204);

Empty set (0.00 sec)

復制代碼

練習:通過連表的方式來查詢每個部門最新入職的那位員工

復制代碼

company.employee

員工id id int

姓名 emp_name varchar

性別 sex enum

年齡 age int

入職日期 hire_date date

崗位 post varchar

職位描述 post_comment varchar

薪水 salary double

辦公室 office int

部門編號 depart_id int

創建表,只需要創建這一張表

create table employee(

id int not null unique auto_increment,

name varchar(20) not null,

sex enum('male','female') not null default 'male', #大部分是男的

age int(3) unsigned not null default 28,

hire_date date not null,

post varchar(50),

post_comment varchar(100),

salary double(15,2),

office int, #一個部門一個屋子

depart_id int

);

查看表結構

mysql> desc employee;

+--------------+-----------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+--------------+-----------------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | varchar(20) | NO | | NULL | |

| sex | enum('male','female') | NO | | male | |

| age | int(3) unsigned | NO | | 28 | |

| hire_date | date | NO | | NULL | |

| post | varchar(50) | YES | | NULL | |

| post_comment | varchar(100) | YES | | NULL | |

| salary | double(15,2) | YES | | NULL | |

| office | int(11) | YES | | NULL | |

| depart_id | int(11) | YES | | NULL | |

+--------------+-----------------------+------+-----+---------+----------------+

插入記錄

三個部門:教學,銷售,運營

insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values

('egon','male',18,'20170301','老男孩駐沙河辦事處外交大使',7300.33,401,1), #以下是教學部

('alex','male',78,'20150302','teacher',1000000.31,401,1),

('wupeiqi','male',81,'20130305','teacher',8300,401,1),

('yuanhao','male',73,'20140701','teacher',3500,401,1),

('liwenzhou','male',28,'20121101','teacher',2100,401,1),

('jingliyang','female',18,'20110211','teacher',9000,401,1),

('jinxin','male',18,'19000301','teacher',30000,401,1),

('成龍','male',48,'20101111','teacher',10000,401,1),

('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門

('丫丫','female',38,'20101101','sale',2000.35,402,2),

('丁丁','female',18,'20110312','sale',1000.37,402,2),

('星星','female',18,'20160513','sale',3000.29,402,2),

('格格','female',28,'20170127','sale',4000.33,402,2),

('張野','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門

('程咬金','male',18,'19970312','operation',20000,403,3),

('程咬銀','female',18,'20130311','operation',19000,403,3),

('程咬銅','male',18,'20150411','operation',18000,403,3),

('程咬鐵','female',18,'20140512','operation',17000,403,3)

;

ps:如果在windows系統中,插入中文字符,select的結果為空白,可以將所有字符編碼統一設置成gbk

復制代碼

答案:

復制代碼

SELECT

*

FROM

emp AS t1

INNER JOIN ( #和虛擬表進行連表

SELECT

post,

max(hire_date) as max_date #給這個最大的日期取個別名叫做max_date,先將每個部門最近入職的最大的日期的信息篩選出來,通過這個表來和我們上面的總表進行關聯

FROM

emp

GROUP BY

post

) AS t2 ON t1.post = t2.post #給虛擬表取個別名叫做t2

WHERE

t1.hire_date = t2.max_date; #然后再通過where來過濾出,入職日期和最大日期相等的記錄,就是我們要的內容

復制代碼

五 綜合練習

表結構為

復制代碼

創建表及插入記錄

CREATE TABLE class (

cid int(11) NOT NULL AUTO_INCREMENT,

caption varchar(32) NOT NULL,

PRIMARY KEY (cid)

) ENGINE=InnoDB CHARSET=utf8;

INSERT INTO class VALUES

(1, '三年二班'),

(2, '三年三班'),

(3, '一年二班'),

(4, '二年九班');

CREATE TABLE course(

cid int(11) NOT NULL AUTO_INCREMENT,

cname varchar(32) NOT NULL,

teacher_id int(11) NOT NULL,

PRIMARY KEY (cid),

KEY fk_course_teacher (teacher_id),

CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher (tid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO course VALUES

(1, '生物', 1),

(2, '物理', 2),

(3, '體育', 3),

(4, '美術', 2);

CREATE TABLE score (

sid int(11) NOT NULL AUTO_INCREMENT,

student_id int(11) NOT NULL,

course_id int(11) NOT NULL,

num int(11) NOT NULL,

PRIMARY KEY (sid),

KEY fk_score_student (student_id),

KEY fk_score_course (course_id),

CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course (cid),

CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(sid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO score VALUES

(1, 1, 1, 10),

(2, 1, 2, 9),

(5, 1, 4, 66),

(6, 2, 1, 8),

(8, 2, 3, 68),

(9, 2, 4, 99),

(10, 3, 1, 77),

(11, 3, 2, 66),

(12, 3, 3, 87),

(13, 3, 4, 99),

(14, 4, 1, 79),

(15, 4, 2, 11),

(16, 4, 3, 67),

(17, 4, 4, 100),

(18, 5, 1, 79),

(19, 5, 2, 11),

(20, 5, 3, 67),

(21, 5, 4, 100),

(22, 6, 1, 9),

(23, 6, 2, 100),

(24, 6, 3, 67),

(25, 6, 4, 100),

(26, 7, 1, 9),

(27, 7, 2, 100),

(28, 7, 3, 67),

(29, 7, 4, 88),

(30, 8, 1, 9),

(31, 8, 2, 100),

(32, 8, 3, 67),

(33, 8, 4, 88),

(34, 9, 1, 91),

(35, 9, 2, 88),

(36, 9, 3, 67),

(37, 9, 4, 22),

(38, 10, 1, 90),

(39, 10, 2, 77),

(40, 10, 3, 43),

(41, 10, 4, 87),

(42, 11, 1, 90),

(43, 11, 2, 77),

(44, 11, 3, 43),

(45, 11, 4, 87),

(46, 12, 1, 90),

(47, 12, 2, 77),

(48, 12, 3, 43),

(49, 12, 4, 87),

(52, 13, 3, 87);

CREATE TABLE student(

sid int(11) NOT NULL AUTO_INCREMENT,

gender char(1) NOT NULL,

class_id int(11) NOT NULL,

sname varchar(32) NOT NULL,

PRIMARY KEY (sid),

KEY fk_class (class_id),

CONSTRAINT fk_class FOREIGN KEY (class_id) REFERENCES class (cid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO student VALUES

(1, '男', 1, '理解'),

(2, '女', 1, '鋼蛋'),

(3, '男', 1, '張三'),

(4, '男', 1, '張一'),

(5, '女', 1, '張二'),

(6, '男', 1, '張四'),

(7, '女', 2, '鐵錘'),

(8, '男', 2, '李三'),

(9, '男', 2, '李一'),

(10, '女', 2, '李二'),

(11, '男', 2, '李四'),

(12, '女', 3, '如花'),

(13, '男', 3, '劉三'),

(14, '男', 3, '劉一'),

(15, '女', 3, '劉二'),

(16, '男', 3, '劉四');

CREATE TABLE teacher(

tid int(11) NOT NULL AUTO_INCREMENT,

tname varchar(32) NOT NULL,

PRIMARY KEY (tid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO teacher VALUES

(1, '張磊老師'),

(2, '李平老師'),

(3, '劉海燕老師'),

(4, '朱云海老師'),

(5, '李杰老師');

復制代碼

!!!重中之重:練習之前務必搞清楚sql邏輯查詢語句的執行順序

練習題目

總結

以上是生活随笔為你收集整理的mysql获取多张表中的数据_mysql 之多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。

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