建立一對多關系的表:邏輯外鍵從表的外鍵對應的都是主表的主鍵 外鍵設定的要求:大小、長度、類型必須與主鍵的一樣
添加外鍵 :alter table +(從表的表名) add constraint +外鍵的名字 +foreign key(從表的那個字段添加外鍵)+erferences+ 主表(對應的哪一個字段(一般是主表的主鍵))
例:ALTER TABLE student ADD CONSTRAINT fk_student FOREIGN KEY(gid) REFERENCES grade(gid);
删除外鍵
ALTER TABLE:修改表的定義
fk_student:外鍵名(自定義)
DROP:删除
FOREIGN KEY:外鍵限制
例:ALTER TABLE student DROP FOREIGN KEY fk_student;
添加層級關系
第一種層疊關系
ON DELETE CASCADE 在删除主表的同時把相關聯的從表的資料都幹掉
例:ALTER TABLE student ADD CONSTRAINT fk_h FOREIGN KEY(gid) REFERENCES grade(gid) ON DELETE CASCADE;
第二種層疊關系,在删除主表的同時把相關取的資料都設定為null
例:ALTER TABLE student ADD CONSTRAINT fk_a FOREIGN KEY(gid) REFERENCES grade(gid) ON DELETE SET NULL;
連接配接查詢分為:
内連接配接,外連接配接(左外連接配接,右外連接配接),字連接配接,等值連接配接,非等值連接配接
内連接配接:inner join+你要連接配接的表 on 比對的條件(兩表的交集資料)
例:SELECT s.StudentNo,s.StudentName,r.StudentResult FROM student s INNER JOIN result r ON s.StudentNo=r.StudentNo;
比對的原則是 左表的每一行資料 與右表的每一行資料進行比對,隻要on後面跟着條件滿足就把資料拿出來
左外連接配接:左表和交集的
用左外連接配接,左外連接配接的特點就是 以左表為基準 右表與左表一一進行比對,如果比對上 直接顯示出來
比對不上的,左表的資料依然顯示,右表的資料設定為null:
例:SELECT s.studentNo,s.studentName,r.studentNo,r.studentResult FROM student s LEFT JOIN result r ON s.studentNo=r.studentNo;
右外連接配接:
以右表為基準 左表一一進行比對,如果比對上則顯示所有的資料,如果比對不上,右表的資料依然顯示,左表的資料設定為Null;
總結:内連接配接取的就是交集 左外連接配接取的是左邊的記錄包括交集 ,右外連接配接相反
等值連接配接:
例:SELECT s.StudentNo,s.StudentName,r.SubjectNo,r.StudentResult FROM student s,result r WHERE s.StudentNo=r.StudentNo;
非等值連接配接:
例:SELECT s.studentNo,s.studentName,r.studentNo,r.studentResult FROM student s,result r;
子查詢:一個完整的查詢嵌套另一個完整的查詢
題:查詢課程為《高等數學-2》且分數不小于80分的學生的學号和姓名
SELECT s.studentNo,studentName FROM student s WHERE s.studentNo IN(
SELECT r.studentNo FROM result r WHERE r.subjectNo IN(
SELECT subjectNo FROM
subject
sub WHERE sub.subjectName=”高等數學-2”)
AND r.studentResult>=80
);
視圖: 就是一個 假表 作用: 看起來直覺 友善 ,便于我們對資料進行處理
建立一個視圖:
CREATE VIEW v AS SELECT studentNo,studentResult FROM result;
DESC v;
查詢視圖的結果集:SELECT * FROM v;
索引:友善我們快速查找,對SQL的優化非常有幫助 //并不是所有的字段都用索引
前提 這個字段經常被當作查詢對象操作,是一個表裡面不是索引越多越好,根據你具體的、
項目來進行設定。 一張表裡面與其他表裡面關系重合的,不适合加索引.
檢視所有的索引:
INDEX 代表索引的關鍵字, FROM 後面跟的是你要查詢的表
例:SHOW INDEX FROM result;
TABLE表:
1:第二個字段代表是否可以重複 如果是0 代表不可以重複如果是1代表可以重複
2:第三個參數 是索引的名字
3:第四個參數是索引的下表從1;
4:第五個就是我們字段名
5:第六個是 排序規則 預設是從a
建立一個主鍵索引 (唯一,不能為空,不一定是INT類型); id
請注意:在添加唯一索引的時候,資料亂碼是添加不成功
emp:表名
UNIQUE:唯一
例:ALTER TABLE emp ADD UNIQUE(ename);
顯示一下是否添加成功:SHOW INDEX FROM emp;
唯一索引 (主鍵索引在一張表裡面隻能有一個,唯一索引可以有多個)
删除索引
例:ALTER TABLE emp DROP INDEX ename;
全局索引:作用便于我們快速查找到某一行
ALTER TABLE emp ADD INDEX(epwd);
用在你的查詢語句裡面,隻有通過測試工具來看其性能
觸發器 :就相當你的鬧鐘
當你的emp表插入據的時候,另一個表績效同時也插入資料
TRIGGER 觸發器的關鍵字 + 觸發器的名字+在之前執行+INSERT(目前你的emp執行插入操作
例:CREATE TRIGGER t_money BEFORE INSERT ON emp
FOR EACH ROW
INSERT INTO jixiao VALUES(NEW.ename,NEW.salary*0.5);
例:INSERT INTO emp(eid,ename,salary) VALUE(11,"fu",20);
備份資料庫:
mysql dump -uroot -proot 庫名 >d:/mysqltextl.sql
查詢的先後順序
【】裡的内容可以要可以不要,如果要,必須按順序來
例:
SELECT [ALL|DISTINCT]
{*|table.*|[table.field1[AS alias1][,table.field2 [AS alias2]][,...]]}
FROM table_name [AS table_alias]
[LEFT|OUT|INNER JOIN table_name2] #聯合查詢
[where...] #指定結果需要滿足的條件
[GROUP BY ...] #指定結果按照哪幾個字段來分組
[HAVING ...] #過濾分組的記錄必須滿足的次要條件
[ORDER BY ...] #指定查詢記錄按一個或一個者多個條件排序
[LIMIT {[OFFSET,] ROW_COUNT |ROW_COUNT OFFSET OFFSET}];
#指定查詢的記錄從哪裡條至哪條