MySQL外鍵和高級查詢(連接查詢、聯合查詢、子查詢、去重查詢)


MySQL的外鍵


什么是外鍵,很簡單保持數據一致性的一個約束鍵。如果你有兩張表,第一張是學生表,第二張表是一個成績表,我們來看看保持數據一致性,其實在Django等框架的模型中中也能做關聯獲取對象。

第一張表 成績表

第二張表 學生表

保持數據一致性

我們來看看,當鍵不一致的時候,數據是插不進去的哦,保證了數據一致性。

mysql> insert into student(sid,name) values("A0004","Tom");
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`school`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `score` (`sid`))
mysql> insert into student(sid,name) values("A0001","Tom");
Query OK, 1 row affected (0.00 sec)

mysql> insert into student(sid,name) values("A0002","Bill");
Query OK, 1 row affected (0.01 sec)

mysql> insert into student(sid,name) values("A0003","Jill");
Query OK, 1 row affected (0.00 sec)

高級查詢


還是用上面兩張表做例子

連接查詢

內連接

沒有on條件的時候就是笛卡爾積,有條件的時候按照條件執行,條件關鍵字on,使用where也可以,但是效率會低很多;

select * from student join score on student.sid=score.sid;

外鏈接

與內連接相似,但是條件不匹配的項會保留,不匹配字段填寫NULL,左和右指得的是以誰為主表
我們做個測試,為了體現不匹配的樣子,先向score插入一條數據

insert into score(sid,value) values("A0004",90);

內連接的狀態的

左連接

左表為主

select * from score left join student on student.sid=score.sid;

右連接

右表為主

select * from student right join score on student.sid=score.sid;

交叉連接

循環去每一條數據進行匹配,結果是笛卡爾積

select * from student cross join score;
#或者
select * from student,score;

自然連接

聯合查詢

將多次查詢(多條select語句), 在記錄上進行拼接(字段不會增加),就是這么簡單,但是注意,字段數量要一致,字段數量要一致,字段數量要一致,重要的事情說三遍。一般用於相同結構的多表查詢。

select id,name from student union select * from score;

子查詢

一般的from where exists后面都是子查詢
重點是from 后面可以接select語句、where后面也可以跟select語句,舉幾個例子

select * from (select sid from score) as a;
select * from score where sid in (select sid from student);


exists可以理解為一個函數,里面是一個條件,如果存在就是返回1,否則是0,exists放在where后面

去重查詢

SELECT DISTINCT column1,column2,... FROM table-name;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM