数据约束
添加主键约束的方式
1.直接写在某一列的后面 CREATE TABLE stu( sid CHAR(6) PRIMARY KEY, sname VARCHAR(20), age INT, gender VARCHAR(10) ); 2.专门去指定某一列为主键列 CREATE TABLE stu( sid CHAR(6), sname VARCHAR(20), age INT, gender VARCHAR(10), PRIMARY KEY(sid) );
修改表时指定主键
ALTER TABLE stu ADD PRIMARY KEY(sid);
删除主键
ALTER TABLE stu DROP PRIMARY KEY;
主键自增长(AUTO_INCREMENT)
1.创建表时进行添加 CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20), age INT, gender VARCHAR(10) ); 2.修改表时设置主键自增长: ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT; 修改表时删除主键自增长: ALTER TABLE stu CHANGE sid sid INT;
唯一约束 unique(不重复 [ 但是可以为空])
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) UNIQUE, 对sname列设置了唯一约束 age INT, gender VARCHAR(10) );
非空约束:
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, 主键 自增长 sname VARCHAR(20) NOT NULL, 非空约束 对sname列设置了非空约束 age INT, gender VARCHAR(10)
默认值约束:
CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL, age INT, gender VARCHAR(10) default ‘男’ 对gender列设置了默认约束 不写性别就给一个默认值【男】
关系模型
1.数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
2.数据库一对一关系
在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
3.数据库多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
外键约束:foreign key
想给那个表设置外键约束,那就在这个表中添加外键
数据库表中的多对一关系
emp.deptno必须在dept表中是真实存在 create talbe emp ( empno int primary key, ... deptno int, CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno) ); 修改表时添加外键约束 ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno); 修改表时删除外键约束 DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/
数据库一对一关系
从表的主键即是外键
数据库多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
/*学生表*/ create table student( sid int PRIMARY KEY, ... ); /*老师表*/ create table teacher( tid int PRIMARY KEY, ... ); /*中间表*/ create table stu_tea( sid int, tid int, CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid), CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid) );
联合主键(复合主键):一张表中存在两个或两个以上的主键列
不建议大家这么去写,我们可以使用一个主键+n个唯一约束列,来代替
多表查询
笛卡尔积:
select * from emp,dept;
同时查询多张表,将行数相乘,完全多对多的关系
内连接
* 内连接查询出的所有记录都满足条件。
方式1
select e.ename,e.sal,d.loc from emp e INNER JOIN dept d ON e.deptno = d.deptno;
方式2
select e.ename,e.sal,d.loc from emp e ,dept d where e.deptno = d.deptno;
外连接
左外连接 以左表为准 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx select * from emp e LEFT OUTER JOIN dept d on e.deptno = d.deptno; 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL 右外连接 以右表为准 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx select * from emp e1 RIGHT OUTER JOIN dept d1 on e1.deptno = d1.deptno; 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
子查询
any,all关键字必须与一个比较操作符一起使用
select * from emp where sal >all (select sal from emp where deptno = 20);
all的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”
any关键词可以理解为“对于子查询返回的列中的任一数值,如果比较结果为true
数据库的备份及恢复
1. 数据库导出SQL脚本
备份数据库内容,并不是备份数据库!
> mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
> 例如:mysqldump -uroot -p123 mydb1>C:mydb1.sql (与mysql.exe和mysqld.exe一样, 都在bin目录下)
> 注意,不要打分号,不要登录mysql,直接在cmd下运行
> 注意,生成的脚本文件中不包含create database语句
2. 执行SQL脚本
第一种方式
> mysql -u用户名 -p密码 数据库<脚本文件路径
> 例如:
* 先删除mydb1库,再重新创建mydb1库
* mysql -uroot -p123 mydb1<C:mydb1.sql
> 注意,不要打分号,不要登录mysql,直接在cmd下运行
第二种方式
> 登录mysql
> source SQL脚本路径
> 例如:
* 先删除mydb1库,再重新创建mydb1库
* 切换到mydb1库
* source c:mydb1.sql
恢复数据库信息