您好,登錄后才能下訂單哦!
首先先準備兩張表。
首先是員工信息表,表名為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 | 人事部 |
+----------+-----------+
三、外連接查詢。
左外鏈接:在內連接的基礎上增加左邊有右邊沒有的結果。
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)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。