1. 程式人生 > >六天帶你玩轉mysql資料庫--第四天筆記

六天帶你玩轉mysql資料庫--第四天筆記

回顧:

列屬性:主鍵,自增長,唯一鍵
關係:一對一,一對多,多對多
正規化:規範資料庫的設計,三層正規化
	1NF:欄位設計必須符合原子性
	2NF:不存在部分依賴(沒有複合主鍵)
	3NF:不存在傳遞依賴(實體單獨建表)
	逆規範化:效率與磁碟空間的博弈
高階資料操作:
	新增資料:主鍵衝突(更新和替換),蠕蟲複製
	更新操作:限制更新數量:limit
	刪除操作:限制刪除數量:limit,清空表(truncate)
	查詢操作:select 選項,欄位別名,資料來源(單表,多表,子查詢[別名]),where 子句(條件判斷:從磁碟),group  by子句
	(分組統計,統計函式,分組排序,多欄位分組,回溯統計),having 子句(判斷結果,針對分組統計的結果),order  by子句
	(排序,多欄位排序),limit 子句(限制記錄數,分頁)

連線查詢:

連線查詢:將多張表(可以大於兩張)進行記錄的連線(按照某個指定的條件進行資料拼接);最終結果是:記錄數有可能變化
欄位數一定會增加(至少兩張表的合併)
連線查詢的意義:在使用者查詢資料的時候,需要顯示的資料來自多張表。
連線查詢:join,使用方式:左表   join   右表
左表:在join關鍵字左邊的表
右表:在join關鍵字右邊的表

連線查詢的分類:

 SQL中將連線查詢分為四類:內連線,外連線,自然連線和交叉連線

交叉連線:

交叉連線:cross  join,從一張表中迴圈取出每一條記錄,每條記錄都去另外一張表進行匹配;匹配一定保留(沒有條件匹配)
而連線本身欄位就會增加(保留),最終形成的結果叫做:笛卡爾積。笛卡爾積本身沒有意義,應該儘量避免使用,交叉連線
存在的價值在於保證連線這種結構的完整性。

基本語法:左表  cross  join  右表;相當於from   左表,右表;
-- 交叉連線,my_student cross join my_class是一個數據源
select * from my_student cross join my_class

在這裡插入圖片描述
在這裡插入圖片描述

內連線:

內連線:[inner]  join,從左表中取出每一條記錄,去右表中與所有的記錄進行匹配,匹配必須是某個條件在左表中和右表中相同
最終才會保留結果,否則不保留。

基本語法:
左表 [inner]  join  右表  on  左表.欄位 = 右表.欄位;on表示連線條件,條件欄位就是代表相同的業務含義
(如my_student.c_id和my_class.id)

-- 內連線
select * from my_student inner join my_class on my_student.c_id = my_class.id;
-- 因為c_id是唯一的可以簡略表示
select * from my_student inner join my_class on c_id = my_class.id;
-- 但是id不是唯一的,簡略表示會報錯
select * from my_student inner join my_class on c_id = id;

在這裡插入圖片描述

但是上圖中可以看到有兩個name,兩個id,在PHP操作的時候會發生資料被覆蓋的問題。所以就需要欄位別名以及表別名的
使用,在查詢資料的時候,不同表有同名欄位。
-- 欄位和表別名
select s.*,c.name as c_name,c.room from -- 欄位別名
my_student as s inner join my_class as c -- 表別名
on s.c_id = c.id;

在這裡插入圖片描述
在這裡插入圖片描述

內連線可以沒有連線條件:沒有on之後的內容,這個時候系統會保留所有結果(笛卡爾積)

在這裡插入圖片描述

內連線可以使用where代替on關鍵字,where關鍵字沒有on效率高。因為where關鍵字是匹配所有,但是on關鍵字是匹配成功的。

在這裡插入圖片描述

外連線:

外連線:outer  join,以某張表為主,取出裡面的所有記錄,然後每條與另外一張表進行連線,不管能不能匹配上條件都會保留,
能匹配正確保留,不能匹配,其他表的欄位都置空NULL。
外連線分為兩種:是以某種表為主:有主表
	left  join:左外連線(左連線),以左表為主表
	right  join:右外連線(右連線),以右表為主表
基本語法:左表  left/right  join  右表  on  左表.欄位 = 右表.欄位;

左連線:

-- 左連線
select s.*,c.name as c_name,c.room from 
my_student as s left join my_class as c 
on s.c_id = c.id;

在這裡插入圖片描述
右連線:

-- 右連線
select s.*,c.name as c_name,c.room from 
my_student as s right join my_class as c 
on s.c_id = c.id;

在這裡插入圖片描述

雖然左連線和右連線有主表差異,但是顯示的結果,左表的資料在左邊,右表的資料在右邊。左連線和右連線可以
互相轉換,只需要將兩種表的位置對調即可。
-- 右連線
select s.*,c.name as c_name,c.room from 
my_student as s right join my_class as c 
on s.c_id = c.id;

select s.*,c.name as c_name,c.room from 
my_class as c left join my_student as s 
on s.c_id = c.id;

在這裡插入圖片描述

自然連線:

自然連線:natural  join,自然連線就是自動匹配連線條件:系統以欄位名字作為匹配模式(同欄位就作為條件,多個同名欄位
都作為條件)
自然連線的分類:自然內連線和自然外連線
自然內連線:左表  natural  右表;
-- 自然內連線
select * from my_student natural join my_class;

在這裡插入圖片描述

自然外連線:左表  natural  left/right  join  右表;
-- 自然左外連線
select * from my_student natural left join my_class;

在這裡插入圖片描述

其實:內連線和外連線都可以模擬自然連線:使用同名欄位合併欄位
左表  left/right/inner  join  右表  using(欄位名);  -- 使用同名欄位作為條件
-- 自然左外連線
select * from my_student natural left join my_class;

-- 外連線模擬自然外連線:using
select * from my_student left join my_class using(id);

在這裡插入圖片描述

PHP操作mysql:

事實上:PHP本身不可以操作Mysql,但是PHP有擴充套件可以實現操作mysql:PHP藉助擴充套件來實現操作mysql。
PHP操作mysql的擴充套件還挺多:mysql,mysqli,PDO擴充套件。
mysql擴充套件:純面向過程,裡面全是函式,載入擴充套件後可以呼叫函式。(當前只能使用面向過程)
mysqli擴充套件:面下過程+面向物件,裡面有函式也有類,載入擴充套件後可以選擇呼叫函式或者呼叫類操作。
PDO:純面向物件,只有類,載入後只可以呼叫類。
mysql擴充套件在搭建伺服器的時候就已經載入開啟,不再進行擴充套件載入。