mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...
一 介紹
本節(jié)主題
多表連接查詢
復合條件連接查詢
子查詢
首先說一下,我們寫項目一般都會建一個數(shù)據(jù)庫,那數(shù)據(jù)庫里面是不是存了好多張表啊,不可能把所有的數(shù)據(jù)都放到一張表里面,肯定要分表來存數(shù)據(jù),這樣節(jié)省空間,數(shù)據(jù)的組織結構更清晰,解耦和程度更高,但是這些表本質(zhì)上是不是還是一個整體啊,是一個項目所有的數(shù)據(jù),那既然分表存了,就要涉及到多個表連接查詢了,比如說員工信息一張表,部門信息一張表,那如果我想讓你幫我查一下技術部門有哪些員工的姓名,你怎么辦,單獨找員工表能實現(xiàn)嗎,不能,單獨找部門表也無法實現(xiàn),因為部門表里面沒有員工的信息,對不對,所以就涉及到部門表和員工表來關聯(lián)到一起進行查詢了,好,那我們來建立這么兩張表:
#建表
#部門表
create table department(
id int,
name varchar(20)
);
#員工表,之前我們學過foreign key,強行加上約束關聯(lián),但是我下面這個表并沒有直接加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
);
#給兩個表插入一些數(shù)據(jù)
insert into department values
(200,'技術'),
(201,'人力資源'),
(202,'銷售'),
(203,'運營'); #注意這一條數(shù)據(jù),在下面的員工表里面沒有對應這個部門的數(shù)據(jù)
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) #注意這條數(shù)據(jù)的dep_id字段的值,這個204,在上面的部門表里面也沒有對應的部門id。所以兩者都含有一條雙方?jīng)]有涉及到的數(shù)據(jù),這都是為了演示一下效果設計的昂
;
#查看表結構和數(shù)據(jù)
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 * fromdepartment;
+------+--------------+
| id | name |
+------+--------------+
| 200 | 技術 |
| 201 | 人力資源 |
| 202 | 銷售 |
| 203 | 運營 |
+------+--------------+mysql> select * fromemployee;
+----+------------+--------+------+--------+
| 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)
關于笛卡兒積:我們看一下上面的這些數(shù)據(jù),有什么發(fā)現(xiàn),首先看到這些字段都顯示出來了,并且數(shù)據(jù)變得很多,我們來看一下,這么多條數(shù)據(jù)都是怎么來的,為什么會出現(xiàn)這么條數(shù)據(jù),笛卡兒積這是一個數(shù)據(jù)名詞,你可以去研究研究~~
因為我們要進行連表查詢,那么mysql并不知道你想要如何連接兩個表的關系進行查詢,那么mysql會將你兩個表數(shù)據(jù)的所有組合關系都給你拼接成一條數(shù)據(jù)來顯示,這樣你就可以想查哪個關聯(lián)關系的數(shù)據(jù)就查哪個了,如果還是不太理解看一下下面的圖:
關于笛卡兒積現(xiàn)象的解釋圖:
咱們?yōu)榱烁玫墓芾頂?shù)據(jù),為了節(jié)省空間,為了數(shù)據(jù)組織結構更清晰,將數(shù)據(jù)拆分到了不同表里面,但是本質(zhì)上是不是還是一份數(shù)據(jù),一份重復內(nèi)容很多的很大的數(shù)據(jù),所以我們即便是分表了,但是咱們是不是還需要找到一個方案把兩個本來分開的表能夠合并到一起來進行查詢,那你是不是就可以根據(jù)部門找員工,根據(jù)員工找部門了,對不對,但是我們合并兩個表的時候,如何合并,根據(jù)什么來合并,通過笛卡兒積這種合并有沒有浪費,我們其實想做的是不是說我們的員工表中dep_id這個字段中的數(shù)據(jù)和部門表里面的id能夠?qū)暇涂梢粤?#xff0c;因為我們知道我們設計表的時候,是通過這兩個字段來給兩個表建立關系的,對不對,看下圖:
我們的目標就是將兩個分散出去的表,按照兩者之間有關系的字段,能對應上的字段,把兩者合并成一張表,這就是多表查詢的一個本質(zhì)。那么笛卡兒積干了什么事兒,就是簡單粗暴的將兩個表的數(shù)據(jù)全部對應了一遍,用處就是什么呢,它肯定就能保證有一條是對應準的,你需要做的事情就是在笛卡兒積的基礎上只過濾出我們需要的那些數(shù)據(jù)就行了,笛卡兒積不是咱們最終要得到的結果,只是給你提供了一個基礎,它不管對應的對不對,全部給你對應一遍,然后你自己去篩選就可以了,然后基于笛卡兒積我們來找一下對應的數(shù)據(jù),看看能不能找到:
2、內(nèi)連接:只連接匹配的行
#我們要找的數(shù)據(jù)就是員工表里面dep_id字段的值和部門表里面id字段的值能對應上的那些數(shù)據(jù)啊,所以你看下面的寫法:
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.14sec)
拿到了我們想要的結果。
但是你看,我們左表employee表中的dep_id為204的那個數(shù)據(jù)沒有了,右表department表的id為203的數(shù)據(jù)沒有了,因為我們現(xiàn)在要的就是兩表能對應上的數(shù)據(jù)一起查出來,那個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 isambiguous
#上面直接就報錯了,因為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.09sec)
結果就沒問題了
但是你看上面的代碼有沒有什么不太好的地方,雖然我們能夠完成我們的事情,但是代碼可讀性不好,所以以后不要這么寫,但是看圖:
所以mysql為我們提供了一些專門做連表操作的方法,這些方法語義更加的明確,你一看就知道那些代碼是連表的,那些代碼是查詢的,其實上面的連表也是個查詢操作,但是我們?yōu)榱藚^(qū)分明確,連表專門用連表的方法,查詢就專門用查詢的方法。那這些專門的方法都是什么呢,看后面的內(nèi)容:
3?、外鏈接之左連接:優(yōu)先顯示左表全部記錄
#以左表為準,即找出所有員工信息,當然包括沒有部門的員工#本質(zhì)就是:在內(nèi)連接的基礎上增加左邊有右邊沒有的結果 #注意語法:
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 、外鏈接之右連接:優(yōu)先顯示右表全部記錄
#以右表為準,即找出所有部門信息,包括沒有員工的部門#本質(zhì)就是:在內(nèi)連接的基礎上增加右邊有左邊沒有的結果
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 、全外連接:顯示左右兩個表全部記錄
全外連接:在內(nèi)連接的基礎上增加左邊有右邊沒有的和右邊有左邊沒有的結果
#注意:mysql不支持全外連接 full JOIN#強調(diào):mysql可以使用此種方式間接實現(xiàn)全外連接
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的區(qū)別:union會去掉相同的紀錄,因為union all是left join 和right join合并,所以有重復的記錄,通過union就將重復的記錄去重了。
三 符合條件連接查詢
#示例1:以內(nèi)連接的方式查詢employee和department表,并且employee表中的age字段值必須大于25,即找出年齡大于25歲的員工以及員工所在的部門
select employee.name,department.name fromemployee inner join department
on employee.dep_id =department.id
where age > 25;
#示例2:以內(nèi)連接的方式查詢employee和department表,并且以age字段的升序方式顯示
select employee.id,employee.name,employee.age,department.name fromemployee,department
where employee.dep_id =department.id
and age > 25order by age asc;
四 子查詢
子查詢其實就是將你的一個查詢結果用括號括起來,這個結果也是一張表,就可以將它交給另外一個sql語句,作為它的一個查詢依據(jù)來進行操作。
來,我們簡單來個需求:技術部都有哪些員工的姓名,都顯示出來: 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.10sec)
#然后根據(jù)連表的結果進行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的數(shù)值表示的是技術部門嗎,不能,所以咱們是不是應該先確定一個技術部門對應的id號是多少,然后根據(jù)部門的id號,再去員工表里面查詢一下dep_id為技術部門對應的部門表的那個id號的所有的員工表里面的記錄:好,那我們看一下下面的操作
#首先從部門表里面找到技術部門對應的id
mysql> select id from department where name='技術';
+------+
| id |
+------+
| 200 |
+------+
1 row in set (0.00sec)
#那我們把上面的查詢結果用括號括起來,它就表示一條id=200的數(shù)據(jù),然后我們通過員工表來查詢dep_id=這條數(shù)據(jù)作為條件來查詢員工的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)
上面這些就是子查詢的一個思路,解決一個問題,再解決另外一個問題,你子查詢里面可不可以是多個表的查詢結果,當然可以,然后再通過這個結果作為依據(jù)來進行過濾,然后我們學一下子查詢里面其他的內(nèi)容,往下學。
子查詢:
#1:子查詢是將一個查詢語句嵌套在另一個查詢語句中。#2:內(nèi)層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。#3:子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字#4:還可以包含比較運算符:= 、 !=、> 、
1、帶IN關鍵字的子查詢
#查詢員工平均年齡在25歲以上的部門名,可以用連表,也可以用子查詢,我們用子查詢來搞一下
select id,name fromdepartment
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;
總結:子查詢的思路和解決問題一樣,先解決一個然后拿著這個的結果再去解決另外一個問題,連表的思路是先將兩個表關聯(lián)在一起,然后在進行group by啊過濾啊等等操作,兩者的思路是不一樣的
#查看技術部員工姓名
select name fromemployee
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) fromemp);
+---------+------+
| name | age |
+---------+------+
| alex | 48 |
| wupeiqi | 38 |
+---------+------+
2 rows in set (0.00sec)
#查詢大于部門內(nèi)平均年齡的員工名、年齡
select t1.name,t1.age fromemp t1
inner join
(select dep_id,avg(age) avg_age fromemp group by dep_id) t2
on t1.dep_id =t2.dep_id
where t1.age > t2.avg_age;
3、帶EXISTS關鍵字的子查詢
EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內(nèi)層查詢語句不返回查詢的記錄。而是返回一個真假值。True或False
當返回True時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢。還可以寫not exists,和exists的效果就是反的
#department表中存在dept_id=203,Ture
mysql> select * fromemployee
->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 * fromemployee
->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
#創(chuàng)建表,只需要創(chuàng)建這一張表
create table employee(
id int notnull unique auto_increment,
name varchar(20) notnull,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date notnull,
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系統(tǒng)中,插入中文字符,select的結果為空白,可以將所有字符編碼統(tǒng)一設置成gbk
答案:
SELECT
*FROM
emp AS t1
INNER JOIN ( #和虛擬表進行連表
SELECT
post,
max(hire_date) as max_date #給這個最大的日期取個別名叫做max_date,先將每個部門最近入職的最大的日期的信息篩選出來,通過這個表來和我們上面的總表進行關聯(lián)
FROM
emp
GROUP BY
post
) AS t2 ON t1.post = t2.post #給虛擬表取個別名叫做t2
WHERE
t1.hire_date = t2.max_date; #然后再通過where來過濾出,入職日期和最大日期相等的記錄,就是我們要的內(nèi)容
總結
以上是生活随笔為你收集整理的mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公安网安装mysql 5.7_安装Mys
- 下一篇: hibenate5.1配置mysql_h