約束,表的操作
1.儲存引擎
2.建表的完整語句create table 表名 (欄位名 資料型別[(長度) 約束])長度 整型表示顯示寬度 字串表示儲存長度限制
3.資料型別 1.整型 tinyint smallint mediumint int bigint 1 2 3 4 8 2.浮點 FLOAT DOUBLE DECIMAL 4 8 手動指定長度 (m,d) m是整體長度 d是小數長度
3.字串 char定長 varchar變長
text 大文字 blob 沒有編碼的文字
* binary bigbinary 儲存二進位制資料
4.時間日期 time year date datetime timestamp 1970 - 2037
5.集合與列舉 共同點: 只能放字串型別 可以用序號來插入資料 不同點: 集合多選多 列舉多選一 集合使用序號插入時 只能插一個
重點劃分1.約束 not null default unique primary key ****** auto_increment ****** foreign key ******
2.表之間的關聯關係 ****** 1.一對一 2.多對一 3.多對多
多表查詢****** 子查詢******
索引原理******* 查詢優化*******
檢視圖 觸發器 事務****** 儲存過程 函式
約束 什麼是約束 除了資料型別以外額外新增的約束 為什麼要使用約束 為了保證資料的合法性 完整性
分類: not null 非空約束 資料不能為空 學生表的姓名欄位 create table student (id ind,name char(10) not null);
default 預設值約束 可以指定欄位的預設值 create table user (id ind,name char(10) not null,sex char(1) default "woman"); 美柚的性別欄位 預設為女 遊戲 註冊成功 送一萬金幣
unique 唯一性約束 該欄位的值不能重複 身份證 手機號 學號 unique其實是一種索引 索引是一種資料結構 用於提高查詢效率
可以為空 一張表中可以有多個唯一約束
單列唯一約束 create table t5(idcard char(18) unique); 多列聯合唯一約束 create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber)); 意思: 身份證相同 並且 手機號相同 那就叫相同
primary key ****** 稱之為主鍵約束 用於唯一標識表中一條記錄 如何能做到唯一標識 該欄位 只要是惟一的 並且不為空 即可 也就是說 從約束的角度來看主鍵約束 和 非空 加 唯一約束 沒有區別 那它們之間的區別是什麼? 唯一約束 是一種索引 必然存在硬碟上的某個檔案中 是物理層面(實實在在存在的資料) primary key 是一種邏輯意義上的資料 (實際上不存在) 換句話說 主鍵 就是由 唯一約束 和非空約束 組成的約束 就像 一男一女 可以組成夫妻 但是夫妻只是一種稱呼 不實際存在
語法: create table stu (stuid int primary key,name char(3)); create table t7(id int unique not null,name char(3));
有主鍵 和沒有主鍵的區別? 1.無法區分兩個相同記錄 比如班級裡有兩個人名字相同 2.有主鍵則意味有這索引 效率更高 3.可以建立關聯關係
多列聯合主鍵: create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));
要不要主鍵? 必須的 每個表都應該有主鍵 哪怕不用唯一標識 也應該考慮提升效率 主鍵的欄位名 幾乎都叫id 同一個表中可以不可以有多個主鍵? 不可以 沒有任何意義 主鍵的型別需要設定為整型,當然別的也行!建議你別這麼幹!
練習 建立一個員工表 裡面儲存 員工資訊 員工編號 姓名 年齡 性別 create table employee (id int primary key,name char(10) not null,age int not null,sex char(10) default "man"); 插入資料 INSERT INTO employee VALUES(1,"楊總",20),(2,"egon",49),(3,"wxx",28); 問題? 你很可能忘記上一次的id到第幾了 導致你要先檢視一下 麻煩影響效率 所以有了auto_increment
auto_increment ****** 中文 自動增長 作用 通常搭配主鍵欄位使用 可以自動為你的資料分配逐漸 如何分配的? 新增一條就自動加1 計數從1開始
語法: ****** create table t9(id int primary key auto_increment,name char(3));
如果主鍵是自動增長 你可以跳過這個欄位 也可以為它插入null 都可以
修改自動增長的起始位置 ** alter table t9 auto_increment = 7;
注意: 自動增長 只能用於整型
foreign key ******
需求 見圖1
以上資料 存在1.資料冗餘2.效率低下3.擴充套件性差通過分表可以解決上述問題新的問題? 不清楚員工是那個部門解決的辦法 在員工表中新增欄位儲存部門的編號
此時兩個表之間就產生了關係員工屬於 部門 部門包含員工可以稱為主從關係部門表叫主表 員工表叫從表
雖然有了關係 但是兩個表之間還是沒有任何物理聯絡,插一個不存在的部門也沒問題
mysql提供了 foreign key 專門用於為表和表之間 建立物理關聯
思考 表裡儲存的是一條條的記錄 兩個表之間能產生的關係有哪些? 現有 A B兩張表 1.多對一 2.一對一 3.多對多
在查詢表之間的關係時 要分別站在 不同表去思考 1. 從員工出發 員工對於部門來說 時 多個員工對應一個部門 2. 從部門出發 一個部門對應多個員工 如果兩個得到的關係不同 則認為 這種多對一關係是單向
先建立部門表 create table dept(id int primary key auto_increment,name char(10),manager char(10)); 在建立員工表 create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));
需求: 設計 學員表 和 班級表 五分鐘練習 兩個表多對一的關係 通過外來鍵來進行關聯 外來鍵加在誰身上? 加到從表上 create table class(id int primary key auto_increment,name char(10)); create table student(id int primary key auto_increment,name char(10),c_id int,foreign key(c_id) references class(id));
總結: 外來鍵的作用 表與表之間建立聯絡 新增外來鍵約束時: 產生的限制 被關聯的表需要先被建立 部門資料(主表)應該先插入 員工資料(從表)後插入 在刪除部門資料前(主表)前 要保證該部門的員工資料都刪除了 在更新部門編號前 要先保證沒有員工關聯到這個部門
簡單的說 外來鍵指的是 另一張的主鍵
外來鍵加上以後 主表中的資料 刪除 和更新時 都受到限制 解決的方案是為 外來鍵 新增 級聯操作
級聯操作 指的是就是同步更新和刪除 語法:在建立外來鍵時 在後面新增 on update cascade 同步更新 on delete cascade 同步刪除
例項: create table class(id int primary key auto_increment,name char(10));
create table student( id int primary key auto_increment, name char(10), c_id int, foreign key(c_id) references class(id) on update cascade on delete cascade );
insert into class value(null,"python3期"); insert into student value(null,"羅傲宇",1);
對主表的id進行更新 以及刪除某條主表記錄 來驗證效果
多對多關係的處理: 建立一個第三方表 專門儲存兩個表之間的關係 這個關係表 應該有兩個欄位 分別關聯學生的id 和老師的id 為了保證 資料的合法性 完整性 給這兩個欄位都新增外來鍵約束 例項: 見圖2 create table teacher (id int primary key auto_increment,name char(10)); create table student (id int primary key auto_increment,name char(10)); create table t_s (t_id int, s_id int, foreign key(t_id) references teacher(id), foreign key(s_id) references student(id) );
為了避免重複無用的關係資料 關係表加上關聯的主鍵約束 create table t_s (t_id int, s_id int, foreign key(t_id) references teacher(id), foreign key(s_id) references student(id), primary key(t_id,s_id) );
insert into student value(null,"lxx"); insert into teacher value(null,"exx"); insert into t_s value(1,1);