约束
-
作用: 对表中的数据进行限定,保证数据的正确性、有效性、完整性!
-
分类:
主键约束: PRIMARY KEY
作用: 唯一+非空,一个表只允许一个主键(可以是联合主键),在数据库中用于标识唯一的数据使用
- 在建表时添加主键约束
CREATE TABLE USER(
id INT PRIMARY KEY
)
-
删除主键约束
ALTER TABLEuserDROP PRIMARY KEY -
建表后添加主键约束
ALTER TABLEuserMODIFY id INT PRIMARY KEY
主键自增约束(方言)
作用:主键为整数时,每次添加数据id自增1
注意:当删除掉某条记录,自增时不会补充该id,会按照删除前的id自增数继续自增
CREATE TABLE book(
bid INT PRIMARY KEY AUTO_INCREMENT
)
唯一约束: UNIQUE
作用: 作用于在列上,该列不允许出现重复的值
CREATE TABLE `user`(
`name` VARCHAR(20) UNIQUE
)
非空约束: NOT NULL
作用: 作用于在列上,该列不允许出现null值
CREATE TABLE `user`(
`name` VARCHAR(20) NOT NULL
)
外键约束: FOREIGN KEY
作用: 作用于一个特殊的字段上,此字段必须依赖于其他的表字段
当表与表之间的数据有相关联性的时候,如果没有相关的数据约束,则无法保证数据的准确性
外键列引用的父表中不存在的数据是冗余数据
引用外键约束后的常见问题:
1.子表的外键必须添加主表的主键存在的数据。
2.因为有外键约束,所以父标被引用的数据不能删除。如果想删除,需要将子表中引用的所有数据全部删除,再删除父标数据
3.因为有了外键约束,虽然保证了数据的安全性和完整性,但是导致父表数据操作非常繁琐,所以在日常开发中,经常不添加外键约束
- 建表时添加外键约束
CREATE TABLE `user`(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(20),
rid INT,
CONSTRAINT fk_user_room FOREIGN KEY (rid) REFERENCES room(id)
)
- 删除外键约束
ALTER TABLE `user` DROP FOREIGN KEY fk_user_room
- 建表后添加外键约束
ALTER TABLE `user`
ADD CONSTRAINT pk_user_room
FOREIGN KEY (rid)
REFERENCES room(id)
默认值约束: DEFAULT
作用: 作用于列上,此列不输入值的时候,会使用默认值
CREATE TABLE `user`(
sex VARCHAR(1) DEFAULT '男'
)
练习
●创建一张图书(book)表
要求:
- bid 为数字类型 要求主键自增
- bookname 书名 为字符串类型 长度30 不允许为空
- bookid 书籍编号 为字符串类型 长度15 唯一约束
CREATE TABLE book(
bid INT PRIMARY KEY AUTO_INCREMENT,
bookname VARCHAR(30) NOT NULL,
bookid VARCHAR(15) UNIQUE
)
表操作
格式:ALTER TABLE 表名 操作
往表中添加字段 column可以省略不写 添加一个price字段
ALTER TABLE 表名ADD COLUMN 字段名称 字段类型;
ALTER TABLE book ADD COLUMN price INT
修改表中字段的类型 将price的类型修改为varchar
ALTER TABLE 表名 MODIFY 字段名称 字段类型;
ALTER TABLE book MODIFY price VARCHAR(10000)
修改表中字段的名字 将price 修改为 money
ALTER TABLE 表名 CHANGE 旧列名 新列名 字段类型;
ALTER TABLE book CHANGE price money INT
删除字段 删除money字段
ALTER TABLE 表名 DROP 字段名称;
ALTER TABLE book DROP money
修改表名 将book改名为newbook
ALTER TABLE 旧表名 RENAME TO 新表名;
ALTER TABLE book RENAME TO newbook
表关系
一对多,多对多,一对一(特殊的一对多)
多表查询
内连接查询
- 显式内连接
SELECT *
FROM emp e
INNER JOIN dept d
ON e.dept_id=d.id
- 隐式内连接
SELECT *
FROM emp e,dept d
WHERE e.dept_id=d.id
外连接查询
不论是左外连接或者右外连接都是以一张表数据为主,将该表数据全部查询出来,再匹配另一张表,如果匹配不了则显示为null
- 左外连接
SELECT *
FROM emp e
LEFT OUTER JOIN dept d
ON e.dept_id =d.id
- 右外连接
SELECT *
FROM dept d
RIGHT OUTER JOIN emp e
ON e.dept_id=d.id
子查询
查询语句中嵌套了查询语句,我们就将嵌套的查询称为子查询
-
结果是单行单列的
查询作用:可以将查询的结果作为另一条语句的查询条件,使用运算符判断。 = > >= < <= 等。
查询工资最高的员工是谁?
SELECT *
FROM emp
WHERE salary=(SELECT MAX(salary)FROM emp)
-
结果是多行单列的
查询作用:可以作为条件,使用运算符 IN 或 NOT IN 进行判断。
查询工资大于5000的员工,来自于哪些部门的名字
SELECT NAME
FROM dept
WHERE id IN (SELECT emp.dept_id FROM emp WHERE emp.salary>5000)
-
结果是多行多列的
查询作用:查询的结果可以作为一张虚拟表参与查询。
SELECT *
FROM (SELECT * FROM emp WHERE join_date>2010-12-31) e
LEFT JOIN dept d
ON e.dept_id=d.id