六天帶你玩轉mysql資料庫--第四天筆記
阿新 • • 發佈:2018-11-07
回顧:
列屬性:主鍵,自增長,唯一鍵 關係:一對一,一對多,多對多 正規化:規範資料庫的設計,三層正規化 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擴充套件在搭建伺服器的時候就已經載入開啟,不再進行擴充套件載入。