日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql外键猫头,SQL进阶

發布時間:2025/3/15 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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进阶的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。