mysql學習三:查詢
連線查詢
連線查詢:將多張表(大於等於 2 張表)按照某個指定的條件進行資料的拼接,其最終結果記錄數可能有變化,但欄位數一定會增加。
連線查詢的意義:在使用者查詢資料的時候,需要顯示的資料來自多張表。
連線查詢為join
,使用方式為:左表join
右表。
- 左表:
join
左邊的表; - 右表:
join
右邊的表。
連線查詢分類:在 SQL 中將連線查詢分為四類,分別為內連線、外連結、自然連線和交叉連線。
交叉連線
交叉連線:cross join
,從一張表中迴圈取出每一條記錄,每條記錄都去另外一張表進行匹配,匹配的結果都保留(沒有條件匹配),而連線本身的欄位會增加,最終形成的結果為笛卡爾積形式。
- 基本語法:
左表 cross join 右邊;
其結果與多表查詢相同。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行交叉連線
select * from student cross join class;
-- 將表 student 與 class 進行多表查詢
select * from student,class;
- 1
- 2
- 3
- 4
實際上,笛卡爾積形式(交叉連線和多表查詢)的結果並沒有什麼實際意義,應該儘量避免,其存在的價值就是保證連線這種結構的完整性。
內連線
內連線:inner join
,從左表中取出每一條記錄,和右表中的所有記錄進行匹配,並且僅當某個條件在左表和右表中的值相同時,結果才會保留,否則不保留。
- 基本語法:
左表 + [inner] + join + 右表 + on + 左表.欄位 = 右表.欄位;
其中,關鍵字on
表示連線條件,兩表中的條件欄位有著相同的業務含義。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行內連線
select * from student inner join class on student.grade = class.grade;
select * from student join class on student.grade = class.grade;
- 1
- 2
- 3
在這裡,值得注意的是:如果兩表中有某個表的條件欄位名唯一,那麼在書寫連線條件的時候,可以省略表名,直接書寫欄位名,MySQL 會自動識別唯一欄位名,但不建議這麼做
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行內連線,起別名
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c on s.grade = c.grade;
- 1
- 2
最後,內連線可以沒有連線條件,即可以沒有on
及之後的內容,這時內連線的結果全部保留,與交叉連線的結果完全相同。而且在內連線的時候可以使用where
關鍵字代替on
,但不建議這麼做,因為where
沒有on
的效率高。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行內連線,不加連線條件
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c;
-- 將表 student 與 class 進行交叉連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s cross join class as c;
-- 使用 on 關鍵字進行內連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c on s.grade = c.grade;
-- 使用 where 關鍵字進行內連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s inner join class as c where s.grade = c.grade;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
外連線
外連線:left\right join
,以某張表為主表,取出裡面的所有記錄,然後讓主表中的每條記錄都與另外一張表進行連線,不管能否匹配成功,其最終結果都會保留,匹配成功,則正確保留;匹配失敗,則將另外一張表的欄位都置為NULL
.
- 基本語法:
左表 + left\right + join + 右表 + on + 左表.欄位 = 右表.欄位;
其中,關鍵字on
表示連線條件,兩表中的條件欄位有著相同的業務含義。在這裡,以主表為依據,外連線分為兩種,分別為:
left join
:左外連線(左連線),以左表為主表;right join
:右外連線(右連線),以右表為主表。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行左連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s left join class as c on s.grade = c.grade;
-- 將表 student 與 class 進行右連線
select s.*,c.id as c_id,c.grade as c_grade,room from student as s right join class as c on s.grade = c.grade;
- 1
- 2
- 3
- 4
- 5
實際上,無論以那張表為主表,其外連線的結果(記錄數量)都不會少於主表的記錄總數。此外,雖然左連線與右連線有主表差異,但顯示的結果都是:左表的資料在左邊,右表的資料在右邊。
自然連線
自然連線:nature join
,自然連線其實就是自動匹配連線條件,系統以兩表中同名欄位作為匹配條件,如果兩表有多個同名欄位,那就都作為匹配條件。在這裡,自然連線可以分為自然內連線和自然外連線。
自然內連線
- 基本語法:
左表 + nature + join + 右表;
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行自然內連線
select * from student natural join class;
-- 將表 student 與 class 進行內連線,連線條件為 id 和 grade
select * from student inner join class on student.id = class.id and student.grade = class.grade;
- 1
- 2
- 3
- 4
- 5
觀察上圖,咱們會發現:自然連線自動使用同名欄位作為連線條件,而且在連線完成之後合併同名欄位。
自然外連線
- 基本語法:
左表 + nature + left/right + join + 右表;
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行自然左外連線
select * from student natural left join class;
-- 將表 student 與 class 進行自然右外連線
select * from student natural right join class;
- 1
- 2
- 3
- 4
- 5
實際上,自然連線並不常用。而且,咱們可以用內連線和外連線來模擬自然連線,模擬的關鍵就在於使用同名欄位作為連線條件及合併同名欄位。
- 基本語法:
左表 + inner/left/right + join + 右表 + using(欄位名);
其中,using
內部的欄位名就是作為連線條件的欄位,也是需要合併的同名欄位。
執行如下 SQL 語句,進行測試:
-- 將表 student 與 class 進行自然左外連線
select * from student natural left join class;
-- 用左外連線模擬自然左外連線
select * from student left join class using(id,grade);
- 1
- 2
- 3
- 4
- 5
溫馨提示:符號[]
括起來的內容,表示可選項;符號+
,則表示連線的意思。
相關推薦
mysql學習三:查詢
連線查詢 連線查詢:將多張表(大於等於 2 張表)按照某個指定的條件進行資料的拼接,其最終結果記錄數可能有變化,但欄位數一定會增加。 連線查詢的意義:在使用者查詢資料的時候,需要顯示的資料來自多張表。 連線查詢為join,使用方式為:左表join右表。 左表:joi
MySQL學習(三): 初識數據表
png 技術 rom 建立 .com 類型 ima ID mysq 打開數據庫: USE db_name : 打開數據庫。 創建數據表: 查看數據表: 查看數據表結構: 數據簡單的插入與查找: 插入:INSERT [INTO] tbl_name [(col_na
JAVA課程學習三:查詢日曆表
練習知識1:輸入輸出訓練 練習知識2:製表符的使用 思路:星期的概念是從1900年開始,進行計算的,通過當前日期到1900年的天數計算,然後求餘7得出星期幾,本次訓練,程式碼主要步驟為,通過計算年份到1900年的天數,以及本年的月的天數,最後通過列印輸出日曆表。 import
mysql數據庫(三):查詢的其他用法
font nth 於平 alt sql函數 where 最小 img 城市 一. 查詢—IN的用法 語法:select ... from 表名 where 字段 a in (值b, 值c, 值d...) 等價於 select ... from 表名 wher
MySQL學習筆記:基本資料型別與查詢操作
#客戶端將資料儲存到資料庫伺服器上的過程 1、連線到伺服器 mysql -u xxx -p xxx 2、選擇一個庫 use xxx 3、建立表或者修改表 &
MySQL學習筆記:資料庫基礎、MySQL基本操作、表的查詢
#選擇資料庫需要考慮的問題: 1、是否開源 開源軟體不一定免費:MySQL,MariaDB(這兩者語法差不多,MySQL可能閉源,但是MariaDB不會)MongoDB
Hibernate深入學習(三):繼承與多型查詢,joined-subclass與union-subclass
在上一篇中,我們對hibernate中3種繼承有了初步瞭解,並對subclass進行了測試,以及知道了它的諸多缺點,這些缺點導致subclass在開發中並不常用,接下來我們看看剩下的兩種繼承方式:joined-subclass與union-subclass 本
MySQL 學習三 關於轉義
方括號 處理 table PE 反斜杠 記錄 條件 sql select DB2 LIKE謂詞查詢語句中支持 百分號(%)、下劃線(_)的使用,不支持方括號([])(註:它會把方括號當成實際的值而非通配符),當我們需要在LIKE 查詢條件中將百分號(%)、下劃線(_)作為實
MySQL學習筆記:刪除存儲過程和函數
class pan 防止 mysql學習 col div pre 註意 warnings 刪除存儲過程、存儲函數主要使用drop語句: drop procedure —— 刪除存儲過程 drop function —— 刪除存儲函數 語法: DROP {P
MySQL學習筆記:調用存儲過程或函數報1418錯誤
creators HR erro reads term eterm 方法 過程 ini 問題 MySQL開啟bin-log後,調用存儲過程或者函數以及觸發器時,會出現錯誤號為1418的錯誤: ERROR 1418 (HY000): This function has
MySQL學習筆記:date_add
add tro XP 指定 日期 mysql lec 時間 間隔 date_add函數 作用:date_add()函數向日期添加指定的時間間隔 語法: date_add(date,INTERVAL expr type) date:日期表達式 type:時間間隔
MySQL學習筆記:循環生成5萬行id連續的數據
comm host RoCE pan spa $$ In () sele # ---- mysql循環生成5萬行id連續的數據 ---- /* id 1 2 3 4 …… */ CREATE TABLE tb( id INT(11) NOT NULL AUT
MySQL學習筆記:definer與sql security
proc gin clas 默認 value 操作 有關 col 存儲過程 在以下例子中,出現definer於sql security invoker,導致不解,遂學習一翻。 # 創建存儲過程 DELIMITER $$ CREATE DEFINER = Hider@l
MySQL學習筆記:floor、round —— 取整
style nbsp pre end 16px mysq 四舍五入 數值處理 span 在MySQL中做數值處理,需要取整或者四舍五入。 floor:函數只返回整數部分,小數部分舍棄; round:函數四舍五入; SELECT FLOOR(10.2); #
MySQL學習筆記:生成時間維度表2
RM -- date con xxx delet mage set 維度表 實現目的: 測試: # 測試 加一秒 SELECT DATE_SUB(DATE_ADD(CURRENT_DATE(), INTERVAL 1 SECOND), INTERVAL 1
MySQL學習筆記:計算機服務中找不到MySQL服務
技術分享 sql AS 目錄 exe class sql安裝 .com com 不知道什麽原因,連接了遠程服務器之後,本地服務就連接不上。 經排查,發現服務中的MySQL服務居然不見,一番搜索之後,在CMD中進入到MySQL安裝目錄的bin下執行以下語句: mys
JAVA多線程基礎學習三:volatile關鍵字
編譯 一定的 true AD throws 行操作 執行效率 操作 分享圖片 Java的volatile關鍵字在JDK源碼中經常出現,但是對它的認識只是停留在共享變量上,今天來談談volatile關鍵字。 volatile,從字面上說是易變的、不穩定的,事實上,也確實如此
Scala系統學習(三):Scala基礎語法
light The nload 兩種 return .com ide ref hello 如果您熟悉Java語言語法和編程,那麽學習Scala將會很容易。Scala和Java之間最大的句法差異在於行結束字符的分號(;) 是可選的。 當編寫Scala程序時,它可以被定義為通過
Mysql系列三:Centos6下安裝Mysql和Mysql主從復制的搭建
sso libc mage 進行 我們 服務器 後繼 lis list 一、Centos6下安裝Mysql 檢測下系統有沒有自帶的mysql:yum list installed | grep mysql, 如果已經有的話執行命令yum -y remove mysql-li
flask學習(三):flask入門(URL)
bsp mys style jinja2 mage 做的 新建 原因 容易 一. flask簡介 flask是一款非常流行的python web框架,出生於2010年,作者是Armin Ronacher,本來這個項目只是作者在愚人節的一個玩笑,後來由於非常受歡迎,進而成為