溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

補12.關(guān)于mysql的多表查詢

發(fā)布時間:2020-06-03 01:49:54 來源:網(wǎng)絡(luò) 閱讀:415 作者:蘇浩智 欄目:MySQL數(shù)據(jù)庫

首先先準備兩張表。

首先是員工信息表,表名為employee。

create table employee( emp_id int primary key auto_increment not null, emp_name varchar(50), age int, dept_id int );


然后在員工信息表中插入6條記錄:

insert into employee(emp_name,age,dept_id)values ('A',19,200), ('B',26,201), ('C',30,201), ('D',24,202), ('E',20,200), ('F',38,204);

#創(chuàng)建了6個員工。


然后是部門信息表。

create table department( dept_id int, dept_name varchar(100) );

#部門信息表中包含了部門ID以及部門名稱。

insert into department values(200,'人事部'),(201,'技術(shù)部'),(202,'銷售部'),(203,'財政部');

#在部門表中添加了4個部門。


employee表:

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

| emp_id | emp_name | age  | dept_id |

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

|      1 | A        |   19 |     200 |

|      2 | B        |   26 |     201 |

|      3 | C        |   30 |     201 |

|      4 | D        |   24 |     202 |

|      5 | E        |   20 |     200 |

|      6 | F        |   38 |     204 |

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


department表:

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

| dept_id | dept_name |

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

|     200 | 人事部    |

|     201 | 技術(shù)部    |

|     202 | 銷售部    |

|     203 | 財政部    |

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


一、笛卡爾積查詢:

select * from employee,department;

結(jié)果:

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

| emp_id | emp_name | age  | dept_id | dept_id | dept_name |

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

|      1 | A        |   19 |     200 |     200 | 人事部    |

|      1 | A        |   19 |     200 |     201 | 技術(shù)部    |

|      1 | A        |   19 |     200 |     202 | 銷售部    |

|      1 | A        |   19 |     200 |     203 | 財政部    |

|      2 | B        |   26 |     201 |     200 | 人事部    |

|      2 | B        |   26 |     201 |     201 | 技術(shù)部    |

|      2 | B        |   26 |     201 |     202 | 銷售部    |

|      2 | B        |   26 |     201 |     203 | 財政部    |

|      3 | C        |   30 |     201 |     200 | 人事部    |

|      3 | C        |   30 |     201 |     201 | 技術(shù)部    |

|      3 | C        |   30 |     201 |     202 | 銷售部    |

|      3 | C        |   30 |     201 |     203 | 財政部    |

|      4 | D        |   24 |     202 |     200 | 人事部    |

|      4 | D        |   24 |     202 |     201 | 技術(shù)部    |

|      4 | D        |   24 |     202 |     202 | 銷售部    |

|      4 | D        |   24 |     202 |     203 | 財政部    |

|      5 | E        |   20 |     200 |     200 | 人事部    |

|      5 | E        |   20 |     200 |     201 | 技術(shù)部    |

|      5 | E        |   20 |     200 |     202 | 銷售部    |

|      5 | E        |   20 |     200 |     203 | 財政部    |

|      6 | F        |   38 |     204 |     200 | 人事部    |

|      6 | F        |   38 |     204 |     201 | 技術(shù)部    |

|      6 | F        |   38 |     204 |     202 | 銷售部    |

|      6 | F        |   38 |     204 |     203 | 財政部    |

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

顯然這種結(jié)果沒有任何的意義。


二、內(nèi)連接查詢。

查詢兩張表中都有的關(guān)聯(lián)數(shù)據(jù),相當于利用條件從笛卡爾積結(jié)果中篩選出了正確的結(jié)果。

下面是一個內(nèi)連接查詢的例子:

還拿前面的兩張表舉例,現(xiàn)在需要列出所有員工的姓名,以及職位名稱。

select emp_name,dept_name from employee,department where employee.dept_id = department.dept_id;

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

| emp_name | dept_name |

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

| A        | 人事部    |

| B        | 技術(shù)部    |

| C        | 技術(shù)部    |

| D        | 銷售部    |

| E        | 人事部    |

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



三、外連接查詢。

  1. 左外鏈接:在內(nèi)連接的基礎(chǔ)上增加左邊有右邊沒有的結(jié)果。

    select * from employee left join department on employee.dept_id = department.dept_id;

    #就是以左邊的表為基準

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

| emp_id | emp_name | age  | dept_id | dept_id | dept_name |

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

|      1 | A        |   19 |     200 |     200 | 人事部    |

|      5 | E        |   20 |     200 |     200 | 人事部    |

|      2 | B        |   26 |     201 |     201 | 技術(shù)部    |

|      3 | C        |   30 |     201 |     201 | 技術(shù)部    |

|      4 | D        |   24 |     202 |     202 | 銷售部    |

|      6 | F        |   38 |     204 |    NULL | NULL      |

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


    2.右外鏈接:在內(nèi)連接的基礎(chǔ)上增加右邊有左邊沒有的結(jié)果。

 select * from employee right join department on employee.dept_id = department.dept_id;


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

| emp_id | emp_name | age  | dept_id | dept_id | dept_name |

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

|      1 | A        |   19 |     200 |     200 | 人事部    |

|      2 | B        |   26 |     201 |     201 | 技術(shù)部    |

|      3 | C        |   30 |     201 |     201 | 技術(shù)部    |

|      4 | D        |   24 |     202 |     202 | 銷售部    |

|      5 | E        |   20 |     200 |     200 | 人事部    |

|   NULL | NULL     | NULL |    NULL |     203 | 財政部    |

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


 3.全外鏈接:

全外連接是將左外鏈接和右外鏈接做一個結(jié)合。

select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id UNION select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;

使用union關(guān)鍵字將左鏈接和有鏈接的結(jié)果做個一個拼接。

union :去除所有重復(fù)的結(jié)果。

union all : 沒有去重功能。



4.多表復(fù)合條件查詢。

比如說現(xiàn)在想要查詢,公司年齡大于25歲的員工都在哪個部門中。

select distinct department.dept_name from employee,department where employee.dept_id = department.dept_id and age > 25;

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

| dept_name |

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

| 技術(shù)部    |

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



以公司所有員工的年齡以從小到大的方式排序。

select employee.emp_id,employee.emp_name,employee.age,department.dept_name from employee,department where employee.dept_id = department.dept_id order by age asc;




5.多表子查詢。

子查詢,就是將一個查詢的sql語句,嵌套在另一個查詢的sql語句中。

內(nèi)層查詢語句的查詢結(jié)果,可以為外層查詢語句提供查詢條件。

子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關(guān)鍵字。


IN關(guān)鍵字:這個關(guān)鍵字大概是包含的意思。

比如說,查詢employee表,但dept_id必須在department表中出現(xiàn)過。

包含在department表中dept_id字段中,才會顯示。

select * from employee where dept_id in (select dept_id from department);

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

| emp_id | emp_name | age  | dept_id |

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

|      1 | A        |   19 |     200 |

|      2 | B        |   26 |     201 |

|      3 | C        |   30 |     201 |

|      4 | D        |   24 |     202 |

|      5 | E        |   20 |     200 |

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


使用比較運算符:

=、!=、>、>=、<、<=、<>

查詢包含年齡大于等于25歲的員工,都在哪些部門:

select dept_id,dept_name from department where dept_id in ( select distinct dept_id from employee where age >= 25);

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

| dept_id | dept_name |

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

|     201 | 技術(shù)部    |

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


exists關(guān)鍵字:

EXISTS關(guān)字鍵字表示存在。在使用EXISTS關(guān)鍵字時,內(nèi)層查詢語句不返回查詢的記錄,而是返回一個真假值。Ture或False,當返回Ture時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢。

例:

select * from employeeWHERE EXISTS(SELECT dept_name from department where dept_id=203);


#department表中存在dept_id=203,Ture,返回了True后select * from employeeWHERE EXISTS這條語句就可以執(zhí)行了,主要就是做一個條件判斷。


select * from employee WHERE EXISTS(SELECT dept_name from department where dept_id=205)


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI