1. 程式人生 > >補12.關於mysql的多表查詢

補12.關於mysql的多表查詢

sql mysql select

首先先準備兩張表。

首先是員工信息表,表名為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);

#創建了6個員工。


然後是部門信息表。

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

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

insert into department values(200,‘人事部‘),(201,‘技術部‘),(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 | 技術部 |

| 202 | 銷售部 |

| 203 | 財政部 |

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


一、笛卡爾積查詢:

select * from employee,department;

結果:

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

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

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

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

| 1 | A | 19 | 200 | 201 | 技術部 |

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

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

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

| 2 | B | 26 | 201 | 201 | 技術部 |

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

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

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

| 3 | C | 30 | 201 | 201 | 技術部 |

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

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

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

| 4 | D | 24 | 202 | 201 | 技術部 |

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

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

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

| 5 | E | 20 | 200 | 201 | 技術部 |

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

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

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

| 6 | F | 38 | 204 | 201 | 技術部 |

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

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

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

顯然這種結果沒有任何的意義。


二、內連接查詢。

查詢兩張表中都有的關聯數據,相當於利用條件從笛卡爾積結果中篩選出了正確的結果。

下面是一個內連接查詢的例子:

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

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

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

| emp_name | dept_name |

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

| A | 人事部 |

| B | 技術部 |

| C | 技術部 |

| D | 銷售部 |

| E | 人事部 |

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



三、外連接查詢。

  1. 左外鏈接:在內連接的基礎上增加左邊有右邊沒有的結果。

    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 | 技術部 |

| 3 | C | 30 | 201 | 201 | 技術部 |

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

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

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


2.右外鏈接:在內連接的基礎上增加右邊有左邊沒有的結果。

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 | 技術部 |

| 3 | C | 30 | 201 | 201 | 技術部 |

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

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

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

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


3.全外鏈接:

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

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關鍵字將左鏈接和有鏈接的結果做個一個拼接。

union :去除所有重復的結果。

union all : 沒有去重功能。



4.多表復合條件查詢。

比如說現在想要查詢,公司年齡大於25歲的員工都在哪個部門中。

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

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

| dept_name |

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

| 技術部 |

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



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

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語句中。

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

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


IN關鍵字:這個關鍵字大概是包含的意思。

比如說,查詢employee表,但dept_id必須在department表中出現過。

包含在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 | 技術部 |

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


exists關鍵字:

EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄,而是返回一個真假值。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這條語句就可以執行了,主要就是做一個條件判斷。


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


本文出自 “reBiRTH” 博客,請務必保留此出處http://suhaozhi.blog.51cto.com/7272298/1932938

補12.關於mysql的多表查詢