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

首先先準(zhǔn)備兩張表。

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計(jì)、做網(wǎng)站與策劃設(shè)計(jì),船山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:船山等地區(qū)。船山做網(wǎng)站價(jià)格咨詢:028-86922220

首先是員工信息表,表名為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個(gè)員工。

然后是部門信息表。

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

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

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

#在部門表中添加了4個(gè)部門。

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 | 財(cái)政部    |

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

一、笛卡爾積查詢:

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 | 財(cái)政部    |

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

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

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

|      2 | B        |   26 |     201 |     203 | 財(cái)政部    |

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

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

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

|      3 | C        |   30 |     201 |     203 | 財(cái)政部    |

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

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

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

|      4 | D        |   24 |     202 |     203 | 財(cái)政部    |

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

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

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

|      5 | E        |   20 |     200 |     203 | 財(cái)政部    |

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

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

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

|      6 | F        |   38 |     204 |     203 | 財(cái)政部    |

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

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

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

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

下面是一個(gè)內(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;

    #就是以左邊的表為基準(zhǔn)

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

| 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 | 財(cái)政部    |

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

 3.全外鏈接:

全外連接是將左外鏈接和右外鏈接做一個(gè)結(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é)果做個(gè)一個(gè)拼接。

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

union all : 沒有去重功能。

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

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

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.多表子查詢。

子查詢,就是將一個(gè)查詢的sql語(yǔ)句,嵌套在另一個(gè)查詢的sql語(yǔ)句中。

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

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

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

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

包含在department表中dept_id字段中,才會(huì)顯示。

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 |

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

使用比較運(yùn)算符:

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

查詢包含年齡大于等于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)鍵字時(shí),內(nèi)層查詢語(yǔ)句不返回查詢的記錄,而是返回一個(gè)真假值。Ture或False,當(dāng)返回Ture時(shí),外層查詢語(yǔ)句將進(jìn)行查詢;當(dāng)返回值為False時(shí),外層查詢語(yǔ)句不進(jìn)行查詢。

例:

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

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

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

本文標(biāo)題:補(bǔ)12.關(guān)于mysql的多表查詢
文章地址:http://muchs.cn/article26/ighjcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、用戶體驗(yàn)App開發(fā)、外貿(mào)建站網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)