1. 程式人生 > >mysql學習三:查詢

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

01

實際上,笛卡爾積形式(交叉連線和多表查詢)的結果並沒有什麼實際意義,應該儘量避免,其存在的價值就是保證連線這種結構的完整性。

內連線

內連線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

innerjoin

在這裡,值得注意的是:如果兩表中有某個表的條件欄位名唯一,那麼在書寫連線條件的時候,可以省略表名,直接書寫欄位名,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

alias

最後,內連線可以沒有連線條件,即可以沒有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

onon 
whereon

外連線

外連線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

outer

實際上,無論以那張表為主表,其外連線的結果(記錄數量)都不會少於主表的記錄總數。此外,雖然左連線與右連線有主表差異,但顯示的結果都是:左表的資料在左邊,右表的資料在右邊

自然連線

自然連線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

natural

觀察上圖,咱們會發現:自然連線自動使用同名欄位作為連線條件,而且在連線完成之後合併同名欄位

自然外連線

  • 基本語法左表 + 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

naturalwai

實際上,自然連線並不常用。而且,咱們可以用內連線和外連線來模擬自然連線,模擬的關鍵就在於使用同名欄位作為連線條件及合併同名欄位。

  • 基本語法左表 + 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

moni


溫馨提示:符號[]括起來的內容,表示可選項;符號+,則表示連線的意思。

相關推薦

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下安裝MysqlMysql主從復制的搭建

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,本來這個項目只是作者在愚人節的一個玩笑,後來由於非常受歡迎,進而成為