mysql外键猫头,SQL进阶
SQL進階
1.約束之主鍵約束
非空、唯一、被引用
當表的某一列被指定為主鍵之后,該列就不能為空,不能有重復值出現。
創建表時指定主鍵的兩種方式:CREATE TABLE stu1(
sid CHAR(6) PRIMARY KEY,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
指定sid為主鍵列,既為sid添加主鍵約束CREATE TABLE stu3(
sid CHAR(6) ,
sname VARCHAR(20),
PRIMARY KEY(sid)
);
不能為空值:mysql> insert into stu3 values(null,'zhangsan');
ERROR 1048 (23000): Column 'sid' cannot be null
也可以在創建完表之后再指定主鍵:ALTER TABLE stu4 ADD PRIMARY KEY(sid);
刪除主鍵:ALTER TABLE stu4 DROP PRIMARY KEY;
2.主鍵自增長
因為主鍵的特性是:必須唯一、不能為空,所以通常會為指定主鍵類為整數型,讓其自增長。CREATE TABLE stu6(
sid INT PRIMARY KEY AUTO_INCREMENT ,
sname VARCHAR(20)
);insert into stu6 values(8,'zhangsan');
DELETE FROM stu6;
insert into stu6 values(null,'zhangsan');
新插入為sid為9
3.非空約束和唯一約束
(1)非空約束
因為某些列不能設置為NULL,所以可以對列添加非空約束CREATE TABLE stu6(
sid INT NOT NULL,
sname VARCHAR(20)
);
(2 ) 唯一約束CREATE TABLE stu6(
sid INT UNIQUE,
sname VARCHAR(20)
);
4.概念模型、對象模型、關系模型
(1)概念模型
當我們完成一個軟件系統時,需要把系統中的實體抽取出來,形成概念模型。
例如部門、員工都是系統的實體。概念模型中的實體最終會成為java中的類,數據庫中的表。
實體中還存在著關系,關系有三種:
1對多,1對1,多對多:
概念模型在java中成為實體類(javaBean)
類就使用成員變量來完成關系,一般都是雙向關聯。
多對一雙向中關聯,既員工關聯部門,部門也關聯員工class Employee{ //多方關聯一方
private Department;
}
class Department{ //一方關聯多方
peivate List emplayees;
}
class Husband {
private Wife wife;
}
class Wife {
private Husband husband;
}
class Student {
private List teacher;
}
class Teacher {
private List student;
}
(2)對象模型
對象模型可以雙向關聯,而且引用的是對象,而不是一個主鍵。
關系模型:只能多方引用一方,而且引用的是主鍵,不是一行記錄。
5.外鍵約束
外鍵必須是另一個表的主鍵的值(外鍵要引用主鍵)
外鍵可以重復
外鍵可以為空
一張表可以有多個外鍵
也可以自身關聯
6.一對一關系
在表中建立一對一的關系比較特殊,需要讓其中的一張表的主鍵,又是主鍵又是外鍵CREATE TABLE hasband(
hid INT PRIMARY KEY AUTO_INCREMENT,
hname VARCHAR(20)
);
INSERT INTO hasband VALUES(NULL,'劉備');
INSERT INTO hasband VALUES(NULL,'關羽');
INSERT INTO hasband VALUES(NULL,'張飛');
CREATE TABLE wife(
wid INT PRIMARY KEY AUTO_INCREMENT,
wname VARCHAR(50),
CONSTRAINT fk_wife_hasband FOREIGN KEY(wid) REFERENCES hasband(hid)
);
INSERT INTO wife VALUES(1,'楊貴妃');INSERT INTO wife VALUES(1,'妲己');
-- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
INSERT INTO wife VALUES(100,'妲己');
-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`wife`, CONSTRAINT `fk_wife_hasband` FOREIGN KEY (`wid`) REFERENCES `hasband` (`hid`))
從表的主鍵即使外鍵。
7.多對多關系CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50)
);
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(50)
);
CREATE TABLE stu_tea(
sid INT,
tid INT,
CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid),
CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid)
);INSERT INTO student VALUES(NULL,'李一');
INSERT INTO student VALUES(NULL,'李二');
INSERT INTO student VALUES(NULL,'李三');
INSERT INTO student VALUES(NULL,'李四');
INSERT INTO student VALUES(NULL,'李五');
INSERT INTO teacher VALUES(NULL,'老一');
INSERT INTO teacher VALUES(NULL,'老二');
INSERT INTO teacher VALUES(NULL,'老三');SELECT * FROM student;
SELECT * FROM student;
INSERT INTO stu_tea VALUES(1,1);
INSERT INTO stu_tea VALUES(2,1);
INSERT INTO stu_tea VALUES(3,1);
INSERT INTO stu_tea VALUES(4,1);
INSERT INTO stu_tea VALUES(5,1);
INSERT INTO stu_tea VALUES(2,2);
INSERT INTO stu_tea VALUES(3,2);
INSERT INTO stu_tea VALUES(4,2);
INSERT INTO stu_tea VALUES(3,3);
INSERT INTO stu_tea VALUES(4,3);
INSERT INTO stu_tea VALUES(5,3);
8.多表查詢
(1)合并結果集
要求被合并的表中,列的類型和列數相同
UNION 去除重復行
UNION ALL 不去除重復行CREATE TABLE ab(
a INT,
b VARCHAR(50)
);
INSERT INTO ab VALUES(1,'1');
INSERT INTO ab VALUES(2,'2');
INSERT INTO ab VALUES(3,'3');
CREATE TABLE cd(
c INT,
d VARCHAR(50)
);
INSERT INTO cd VALUES(3,'3');
INSERT INTO cd VALUES(4,'4');
INSERT INTO cd VALUES(5,'5');
SELECT * FROM ab
UNION ALL
SELECT * FROM cd;
SELECT * FROM ab
UNION
SELECT * FROM cd;
(2)連接查詢
(3)子查詢
9.連接查詢
(1)內連接
方言SELECT * FROM 表1 別名1 ,表2, 別名2 WHERE 別名1.xx=別名2.xx
標準SELECT * FROM 表1 別名1 INNER JOIN 表2, 別名2 ON 別名1.xx=別名2.xxSELECT *
FROM student,teacher;
笛卡爾積
{a,b,c} {1,2}+-----+-------+-----+-------+
| sid | sname | tid | tname |
+-----+-------+-----+-------+
| 1 | 李一 | 1 | 老二 |
| 1 | 李一 | 2 | 老三 |
| 1 | 李一 | 3 | 老一 |
| 2 | 李二 | 1 | 老二 |
| 2 | 李二 | 2 | 老三 |
| 2 | 李二 | 3 | 老一 |
| 3 | 李三 | 1 | 老二 |
| 3 | 李三 | 2 | 老三 |
| 3 | 李三 | 3 | 老一 |
| 4 | 李四 | 1 | 老二 |
| 4 | 李四 | 2 | 老三 |
| 4 | 李四 | 3 | 老一 |
| 5 | 李五 | 1 | 老二 |
| 5 | 李五 | 2 | 老三 |
| 5 | 李五 | 3 | 老一 |
+-----+-------+-----+-------+
可以用條件去除無用的笛卡爾積。SELECT *
FROM student,teacher
WHERE student.sid = teacher.tid;+-----+-------+-----+-------+
| sid | sname | tid | tname |
+-----+-------+-----+-------+
| 1 | 李一 | 1 | 老二 |
| 2 | 李二 | 2 | 老三 |
| 3 | 李三 | 3 | 老一 |
+-----+-------+-----+-------+
如果表名太長,也可以給表名起別名SELECT *
FROM student s,teacher t
WHERE s.sid = t.tid;
(2)外連接
左外鏈接
右外連接
全外連接(mysql不支持)SELECT e.ename,e.sal,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno
(3)子查詢SELECT * FROM emp EHERE sal = (SELECT MAX(sal) FROM emp);
總結
以上是生活随笔為你收集整理的mysql外键猫头,SQL进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目职责_项目经理的9个职责
- 下一篇: java concurrent int_