MySQL 后from多個表_MYSQL回顧(多表查詢相關)

前言

簡單的數據我們可以直接從一個表中獲取,但在真實的項目中查詢符合條件的數據通常需要牽扯到多張表,這就不得不使用多表查詢。多表查詢分為多表連接查詢、符合條件鏈接查詢、子查詢。多表連接查詢包括內連接、外連接、全連接。符合條件連接查詢本質上是多表連接查詢+過濾條件。子查詢是將一個查詢語句嵌套在另一個查詢語句中,內層查詢語句的查詢結果作為外層查詢語句的數據源。

準備

# 建表

create table department(

id int,

name varchar(20)

);

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

);

# 插入數據

insert into department values

(1,'技術'),

(2,'財務'),

(3,'法律’);

# 此處省略員工表數據...

多表連接查詢

語法

SELECT 字段列表

FROM 表1 INNER|LEFT|RIGHT JOIN 表2

ON 表1.字段 = 表2.字段;

交叉連接

在介紹多表查詢的時候,有必要先介紹下交叉連接,如下select * from employee, department;查詢語句就是交叉連接查詢,可以看出,同一個數據在在employee表和department表交叉連接之后產生了重復記錄,其重復個數取決于department表的記錄個數。所以最后交叉連接之后的記錄個數是:count(employee) * count(department),即笛卡爾積。通常情況下,笛卡爾積的結果在工作中無實際意義,我們需要在笛卡爾積的基礎上進行篩選,找到employee.dep_id = department.id的那條記錄。

mysql> select * from employee, department;

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

| id | name | age | sex | position | salary | dep_id | id | name |

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

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 1 | 技術 |

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 2 | 財務 |

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 1 | 技術 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 2 | 財務 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 1 | 技術 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 2 | 財務 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 3 | 法律 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 1 | 技術 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 2 | 財務 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 3 | 法律 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 1 | 技術 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 2 | 財務 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 3 | 法律 |

| 6 | tony | 35 | male | RD | 100000000 | 1 | 1 | 技術 |

| 6 | tony | 35 | male | RD | 100000000 | 1 | 2 | 財務 |

| 6 | tony | 35 | male | RD | 100000000 | 1 | 3 | 法律 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 1 | 技術 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 2 | 財務 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 3 | 法律 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 1 | 技術 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 2 | 財務 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 3 | 法律 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 1 | 技術 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 2 | 財務 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 3 | 法律 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 1 | 技術 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 2 | 財務 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 3 | 法律 |

| 11 | james | 18 | male | NULL | 3000 | NULL | 1 | 技術 |

| 11 | james | 18 | male | NULL | 3000 | NULL | 2 | 財務 |

| 11 | james | 18 | male | NULL | 3000 | NULL | 3 | 法律 |

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

33 rows in set (0.00 sec)

內連接

內連接只會連接兩張表匹配的行,即取交集。找兩張表公共部分,相當于利用條件從笛卡爾積結果中篩選出了正確的結果

mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;

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

| id | name | age | sex | name |

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

| 1 | jack | 20 | male | 法律 |

| 2 | mark | 22 | male | 法律 |

| 3 | hank | 25 | male | 法律 |

| 4 | nick | 39 | male | 法律 |

| 5 | jenny | 26 | female | 法律 |

| 6 | tony | 35 | male | 技術 |

| 7 | emmy | 27 | female | 技術 |

| 8 | emmy | 23 | female | 財務 |

| 9 | lucy | 45 | female | 財務 |

| 10 | emmi | 20 | female | 財務 |

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

10 rows in set (0.00 sec)

上述內連接查詢語句等同于:

mysql> select employee.id,employee.name,employee.age,employee.sex,department.name

from employee,department

where employee.dep_id=department.id;

外連接

外連接分為左連接、右連接、全外連接

左連接

左連接在內連接的基礎上優先顯示左表全部記錄。即左連接=內連接+左表未符合條件的記錄

#以左表為準,即找出所有員工信息,當然包括沒有部門的員工

#本質就是:在內連接的基礎上增加左邊有右邊沒有的結果

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 |

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

| 6 | tony | 技術 |

| 7 | emmy | 技術 |

| 8 | emmy | 財務 |

| 9 | lucy | 財務 |

| 10 | emmi | 財務 |

| 1 | jack | 法律 |

| 2 | mark | 法律 |

| 3 | hank | 法律 |

| 4 | nick | 法律 |

| 5 | jenny | 法律 |

| 11 | james | NULL |

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

11 rows in set (0.00 sec)

右連接

又連接在內連接的基礎上優先顯示右表的內容。即右連接==內連接+右表未符合條件的記錄

#以右表為準,即找出所有部門信息,包括沒有員工的部門

#本質就是:在內連接的基礎上增加右邊有左邊沒有的結果

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 | jack | 法律 |

| 2 | mark | 法律 |

| 3 | hank | 法律 |

| 4 | nick | 法律 |

| 5 | jenny | 法律 |

| 6 | tony | 技術 |

| 7 | emmy | 技術 |

| 8 | emmy | 財務 |

| 9 | lucy | 財務 |

| 10 | emmi | 財務 |

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

10 rows in set (0.00 sec)

可以發現,左表(employee表)的第11條記錄沒有被查詢出來

全外連接

全外連接會在內連接查詢的基礎上顯示左表和右表的全部記錄

mysql> 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 | age | sex | position | salary | dep_id | id | name |

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

| 6 | tony | 35 | male | RD | 100000000 | 1 | 1 | 技術 |

| 7 | emmy | 27 | female | RD | 9999 | 1 | 1 | 技術 |

| 8 | emmy | 23 | female | finance | 5000 | 2 | 2 | 財務 |

| 9 | lucy | 45 | female | finance | 10000 | 2 | 2 | 財務 |

| 10 | emmi | 20 | female | finance | 20000 | 2 | 2 | 財務 |

| 1 | jack | 20 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 2 | mark | 22 | male | lawyer | 888889 | 3 | 3 | 法律 |

| 3 | hank | 25 | male | lawyer | 7777.8 | 3 | 3 | 法律 |

| 4 | nick | 39 | male | lawyer | 4438890 | 3 | 3 | 法律 |

| 5 | jenny | 26 | female | lawyer | 10000.8 | 3 | 3 | 法律 |

| 11 | james | 18 | male | NULL | 3000 | NULL | NULL | NULL |

| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 人力 |

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

12 rows in set (0.00 sec)

符合條件鏈接查詢

mysql> select employee.name, employee.age, department.name from employee inner join department

-> on employee.dep_id=department.id

-> where age > 30

-> order by age asc;

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

| name | age | name |

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

| tony | 35 | 技術 |

| nick | 39 | 法律 |

| lucy | 45 | 財務 |

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

3 rows in set (0.00 sec)

子查詢

子查詢是將一個查詢語句的嵌套在另一個查詢語句中

內層查詢語句的查詢結果作為外層查詢語句的數據源

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

注意被嵌套的查詢語句需要用( )包裹

查詢員工部門平均年齡大于30的部門信息

mysql> select * from department

-> where id in

-> (select dep_id from employee group by dep_id having avg(age) > 30);

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

| id | name |

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

| 1 | 技術 |

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

1 row in set (0.00 sec)

查詢技術部員工姓名

mysql> select name from employee

-> where dep_id in

-> (select id from department where name="技術");

+------+

| name |

+------+

| tony |

| emmy |

+------+

2 rows in set (0.00 sec)

查詢無員工的部門名(子查詢得到的是所有人的部門id,需要disctinct去除)

mysql> select name from department

-> where id not in

-> (select distinct dep_id from employee);

帶比較運算符的子查詢

查詢大于所有人平均年齡的員工名和年齡

mysql> select * from employee where age > (select avg(age) from employee);

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

| id | name | age | sex | position | salary | dep_id |

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

| 4 | nick | 39 | male | lawyer | 4438890 | 3 |

| 6 | tony | 35 | male | RD | 100000000 | 1 |

| 9 | lucy | 45 | female | finance | 10000 | 2 |

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

3 rows in set (0.00 sec)

不能這樣:在前面沒有group by的時后面不能使用分組函數

mysql> select * from employee where age > avg(age);

ERROR 1111 (HY000): Invalid use of group function

帶EXISTS關鍵字的子查詢

EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。

而是返回一個真假值。True或False

當返回True時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢

mysql> select * from employee

-> where exists

-> (select id from department where id=200);

MYSQL中可以把一個查詢語句用括號括起來使用as起一個別名當做一個表使用

查詢每個職位最新入職的員工

SELECT

*

FROM

emp AS t1

INNER JOIN (

SELECT

post,

max(hire_date) max_date

FROM

emp

GROUP BY

post

) AS t2 ON t1.post = t2.post

WHERE

t1.hire_date = t2.max_date;

查詢語句關鍵字執行順序

一個完整的mysql的查詢語句如下:

SELECT DISTINCT

FROM

JOIN

ON

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT

其關鍵字執行順序如下:

(7) SELECT

(8) DISTINCT

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) HAVING

(9) ORDER BY

(10) LIMIT

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373308.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

玩! 框架+ Google Guice

在我目前正在工作的項目中,我們開始使用Google Guice。 對于那些不知道的人, Google Guice是一個依賴項注入框架。 依賴項注入背后的基本思想是提供一個它依賴的類,而不是使依賴類負責實例化它所依賴的對象。 Play具有用于整合Guice的模塊&am…

java都要caps標點_第 1 章 管理 Java CAPS 用戶

第 1 章 管理 Java CAPS 用戶在此處列出的主題提供了有關如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用戶的信息。如果您有任何問題,請參見 http://goldstar.stc.com/ 中的 Java CAPS Web 站點。管理系統信息庫用戶此類別包含以下用…

基于OpenCV 的美顏相機推送直播流

程序流程: 1.圖像采集 先從opencv(2.4.10版本)采集回來攝像頭的圖像,是一幀一幀的 每一幀圖像是一個矩陣,opencv中的mat 數據結構。 2.人臉的美化 人臉美化,我們用的皮膚檢測,皮膚在顏色空間是特…

Linux驅動開發常用頭文件

頭文件目錄中總共有32個.h頭文件。其中主目錄下有13個&#xff0c;asm子目錄中有4個&#xff0c;linux子目錄中有10個&#xff0c;sys子目錄中有5個。這些頭文件各自的功能如下&#xff1a; 1、主目錄 <a.out.h>&#xff1a;a.out頭文件&#xff0c;定義了a.out執行文件格…

Spring線程池服務

線程池對于執行同步和異步過程非常重要。 本文介紹如何使用Spring開發和監視線程池服務。 創建線程池已通過兩種替代方法進行了說明。 二手技術 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步驟1&#xff1a;建立已完成的專案 創建一個Maven項目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加強守衛,小狐貍背叛

雖然這句話很繞口&#xff0c;其實意思很簡單&#xff0c;那就是之前的隱身藥水沒有什么用&#xff0c;該被打還是被打。因為這個可是害慘了流浪商人&#xff0c;不過這次好了&#xff0c;流浪商人在喝了隱身藥水之后就能安全度過晚上了。NO.3 皮革馬鎧馬鎧是屬于馬的盔甲&…

歐萊雅眉筆banner個人設計

眉筆名稱&#xff1a;眉筆大師三頭塑形眉筆 &#xff0c;之所以沒用吧這個商品名稱放大&#xff0c;是我覺得它是一個名稱&#xff0c;而我把自己想的廣告詞“出彩只需一筆” 放大不僅能凸顯出這只筆的強大&#xff0c;還表示了一種有了我這支眉筆你會更出彩更漂亮&#xff0c…

使用帶有注釋和JQuery的Spring MVC 3的Ajax

與Ajax一起工作對我來說一直很有趣&#xff01; 是不是 &#xff1f; 我將使您輕松將Ajax與Spring MVC 3和JQuery結合使用。 這篇文章將向您說明如何在工業編碼的現實生活中使用Ajax。 和往常一樣&#xff0c;我們將在Spring MVC 3框架中以Ajax的實際示例為例&#xff0c;并將其…

ThinkPHP 3 的輸出

一、ThinkPHP 3 的輸出 &#xff08;重點&#xff09;a、通過 echo 等PHP原生的輸出方式在頁面中輸出b、通過display方法輸出想分配變量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置項TMPL_L_DELIM><{, //修改左定界符TMPL_R_DELIM>}>, //修…

java百度云文件上傳_關于如何在自己項目集成百度云BCE文件上傳STS方案

1、 項目背景由于本人項目需要&#xff0c;需要在視頻點播服務之中需要加載字幕文件(通用格式srt)&#xff0c;經過比較好幾家的公有云服務&#xff0c;最后選擇只有百度云提供字幕服務。字幕&#xff1a;我們通常在觀看外語電影的是&#xff0c;沒有國語版時候只能通過下載字幕…

Java 7 – NIO文件革命

Java 7&#xff08;“項目代幣”&#xff09;已于去年7月問世。 此版本中的新增功能很有用&#xff0c;例如&#xff0c;嘗試使用資源–從try塊自動處理可關閉的資源&#xff0c;switch語句中的字符串&#xff0c;用于異常的multicatch以及用于使用泛型的<>運算符。 每個…

hdu 3507 Print Article(斜率優化DP)

題目鏈接&#xff1a;hdu 3507 Print Article 題意&#xff1a; 每個字有一個值&#xff0c;現在讓你分成k段打印&#xff0c;每段打印需要消耗的值用那個公式計算&#xff0c;現在讓你求最小值 題解&#xff1a; 設dp[i]表示前i個字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服務注冊與服務查詢

1、定義一個服務 https://www.consul.io/docs/agent/services.html 該方法是服務注冊中提供服務的最常用的方法。 關于服務的定義&#xff1a;服務的屬性我們會在后邊每出現一個總結一個&#xff0c;最后再做總結。 2、服務注冊 2.1、創建服務文件所存放的文件夾 說明&#xff…

coreos 安裝mysql_CoreOS 在 PC 上快速安裝方法指南

意義能夠以最快的速度安裝部署Linux操作系統。安裝快速簡單&#xff0c;幾乎不花時間就可以開始運行Docker。運行速度非常快。使用內存硬盤。我的情況win8 筆記本偶爾玩游戲&#xff0c;但是裝Linux雙系統可能需要我一天的時間來完成。我的所有業務都只需要在Docker中跑就可以了…

使用ycsb測試cassandra

參考 https://github.com/cloudius-systems/osv/wiki/Benchmarking-Cassandra-and-other-NoSQL-databases-with-YCSB https://github.com/brianfrankcooper/YCSB/tree/master/cassandra 創建 表頭 https://gist.github.com/pbailis/3978273  設置field參數 長度和個數 啟動和…

Session 的配置和特性

session的配置 對于session的配置是php.ini中配置 session數據都是保存在文本文件中 設置session文件的保存位置 說明&#xff1a; 默認是保存在windows/temp目錄 設置session保存作為客戶端標識的數據使用cookie 設置session保存客戶端標識的數據&#xff0c;只使用cookie 說明…

OAuth與Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 開放式身份驗證 &#xff09;是一種開放式身份驗證標準。 它允許用戶與其他站點共享存儲在一個站點上的私有資源&#xff08;例如照片&#xff0c;視頻&#xff0c;聯系人列表&#xff09;&#xff0c;而不必發出其憑據&#xff…

flex java 開發環境搭建_Flex+JAVA+BlazeDS開發環境配置(Java工程和Flex工程獨立)

FlexJAVABlazeDS開發環境配置(Java工程和Flex工程獨立)2019年12月07日閱讀數&#xff1a;7這篇文章主要向大家介紹FlexJAVABlazeDS開發環境配置(Java工程和Flex工程獨立),主要內容包括基礎應用、實用技巧、原理機制等方面&#xff0c;希望對大家有所幫助。[url]http://blog.csd…

1251 括號(遞歸小練)

1251 括號 時間限制: 1 s空間限制: 128000 KB題目等級 : 黃金 Gold題目描述 Description計算乘法時&#xff0c;我們可以添加括號&#xff0c;來改變相乘的順序&#xff0c;比如計算              X1, X2, X3, X4, …, XN的積&#xff0c;可以 (X1(X2(X3(X4(...(XN-1…

zabbix_agentd.conf配置文件詳解

Aliaskey的別名&#xff0c;例如 Aliasttlsa.userid:vfs.file.regexp[/etc/passwd,^ttlsa:.:([0-9]),,,,\1]&#xff0c; 或者ttlsa的用戶ID。你可以使用key&#xff1a;vfs.file.regexp[/etc/passwd,^ttlsa:.: ([0-9]),,,,\1]&#xff0c;也可以使用ttlsa.userid。備注: 別名不…