1. 数据输入完整性:创建数据表时候给其添加约束条件:分类:实体完整性,域完整性,引用完整性
实体:即表中的一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复。主键;唯一标识数据库每一行这个一列,唯一标识数据库中每一条记录,每一个表中
约束条件: 主键约束(primary key)数据唯一,不能为NULL,先创建主键才能自增属性,主键value相同SQL报错
唯一约束(unique),自动增长(auto_increment)
2. 创建主键约束三种方式:
联合主键本质上一个主键 PRIMARY KEY(id,classid);
3.创建表之后在添加主键:ALTER TABLE student ADD PRIMARY KEY (id)
4. 唯一约束:性别 唯一: 这一列数值不能有重复元素,不能有多个NULL,允许空值
5.自动增长列:
3.引用完整性:外键:表中有其他表的主键,要想有外键,必须要现有主键,主键和外键类型必须一致
Student 是父表,Score是子表,对子表添加一个 外键约束:子表不允许出现主表之外数值:
外键关键字: FOREIGN Key constraint 关键字 外表之间进行外键约束 Constraint 约束名 主键
外键约束两种方式:创建时候 2.ALTER 修改:
例: CREATE TABLE student( sid int pirmary key, name varchar(50) not null, sex varchar(10) default ‘男’ ); create table score( id int, score int, sid int , -- 外键列的数据类型一定要与主键的类型一致 CONSTRAINT fk_score_sid foreign key (sid) references student(id) );
2. ALTER: 关键字 constarint 约束名称 references 关联
ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(sid);
4. 表与表之间的关系:
1、一对一关系:人与身份证之间关系,主从关系设计方案:t_person 表示人,t_card 表示身份证
① t_card 表中添加外键列,并且添加外键唯一约束
② 给t_card 表的主键添加外键约束,即 t_card 表主键也是外键,reference 和constain 关键字
2.一对多:对多和多对一,这是从哪个角度去看得出来的。t_user和t_section的关系,从t_user来看就是一对多,而从t_section的角度来看就是多对一!这种情况都是 在多方创建外键,从表sid不是主键
3.多对多:例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系,创建中间表,给出两个外键,一个对应t_stu,另外一个对应 t_tea
5. 为什么进行拆表:1.解决表的冗余数据,2.
-------------------------------------------------------------------------------------------------------------------------
1. 多表查询:1.合并结果集 UNION ,UNION ALL
2. 连接查询 JOIN 3.子查询
1.批量插入; INSERT INTO A VALUES(‘a‘,10),(‘b‘,20),(‘c‘,30);
合并查询集:SELECT * from table_A UNION select * FROM table_B;// 注意:合并查询 列数据类型必须一致
UNION vs UNION ALL区别:前者查询两种并集,UNION ALL 显示两个表所有的数据
2. 连接查询:非常重要:内连接,外连接,自然连接
连接查询求出多个表的乘积,t1*t2:
从之上结果显示出来看,直接连接查询 出现迪卡尔效应,出现多个扩展集合,出现非常多的重复集合,在查询过程中必须加入过滤条件通过关联关系 去除迪卡尔效应 通过主外键之间的关系去除冗余信息
1. 使用主外键关系做为条件来去除无用信息:注意:多表查询必须指定列的从属表:emp.deptno;
SELECT * from emp,dept, where emp.deptno=dept.deptno;
2.1 上面连接语句就是内连接,但是不是SQL中标准查询方式,在SQL中标准查询语句: ON 只用于内连接 MySQL默认的连接方式就是内连接
SELECT * FORM emp e INNER JOIN dept d ON e.deptno=d.deptno;// 内连接 关键字 INNERJOIN , ON e,d 别名,AS 省去,如果 * 换成 e.score,e.name
2.2 外链接: 从左连接,从右连接,全外连接
左外连接:
SELECT * FROM student s LEFT JOIN score c ON s.stuid=c.stuid;
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。左右表分开显示
连接查询心得:两张表至少一个主外键条件,三张表至少需要俩个主外键关系
连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。
两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。
3.自然连接:连接查询明显出现无用笛卡尔乘积,需要利用主外键之间关系去除无用,自然连接自动找到这一等式关系:条件:
1.两张表中名称与数据类型完全一致,在连接查询只需要数据类型一致就行,
4. 子查询:非常重要
一个SELECT 语句中嵌套另外一个SELECT,子查询就是一个嵌套查询,如果一条语句中存在两个或者两个以上SELECT,那么就是子查询
l 子查询出现的位置:
- where后,作为条为被查询的一条件的一部分;
- from后,作表;
l 当子查询出现在where后作为条件时,还可以使用如下关键字:
- any
- all
l 子查询结果集的形式:
- 单行单列(用于条件)
- 单行多列(用于条件)
- 多行单列(用于条件)
- 多行多列(用于表)
练习:
1.查询与SCOTT 同一个部门员工: 求出SCOTT属于哪一个部门
SELECT * FROM emp WHERE enam=‘SCOTT‘;//
SELECT deptno from emp where ename=‘SCOTT‘;
之上语句两条查询语句进行合并 SELECT * from emp WHERE deptno=(SELECT deptno from emp where enam=‘SCOTT‘);
2.查询工资 高于 JONES 的工资
SELECT sal FROM emp WHERE ename=‘JSON‘; SELECT * FROM emp WHERE sal>($第一步查询语句)
结果: SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename=‘JONES‘)
3. 工资高于30 部门所有人的信息;
SELECT * FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30);
4.查询工作和工资与MARTIN(马丁)完全相同的员工信息 多个相等值 用IN
SELECT * FROM emp WHERE (job,sal)IN (SELECT job,sal FROM emp WHERE ename=‘MARTN‘)
5. 查询员工编号为7788的员工名称、员工工资、部门名称、部门地址
SELECT e.ename,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND ename=‘7788‘; 这个
使用子查询: SELECT e.ename,e.sal,d.dname,d.locfrom emp,(SELECT * from dept) d WHERE e.deptno=d.deptno AND ename=‘7788‘;
6. 数据库备份:
生成SQL 脚本:mysqldump -uroot -p123 数据库名称>路径 mysqldump 保留数据库建立的代码,代码不存在创建数据库的语句
数据库为恢复:前提先有数据库 SOURCE c:\mysql.sql
采用这种方式 不使用Source mySQL -u root -p123 mydb1<d:\mydb1.sql;