MySQL多表查询

Posted rqy0526

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL多表查询相关的知识,希望对你有一定的参考价值。

今日知识

1. 数据库的完整性
2. 多表操作
3. 级联操作
4. 三大范式

数据完整性:

1. 实体完整性 (唯一性)
规定表的一行(即每一条记录)在表中是唯一的实体。实体完整性通过表的主键来实现。
2. 域完整性:
指数据库表的列(即字段)必须符合某种特定的数据类型或约束。比如NOT NULL
3. 参照完整性:保证一个表的外键和另一个表的主键对应。
4. 定义表的约束

1. 定义主键约束: primary key:不允许为空,不允许重复, (可以区分两条记录的唯一性)
    设置: alter table tablename modify id int primary key ;
     清除:alter table tablename drop primary key;

2. 定义主键自动增长: auto_increment


  设置: alter table tablename modify id int (primary key) auto_increment ;

    清除:alter table tablename modify id int;(主键还在)


3. 定义唯一约束:unique,值不能重复(但可以都为空)


     设置:alter table tablename modify email varchar(50) unique ;

    清除:alter table tablename drop index email ;


4. 定义非空约束:not null


     设置:alter table tablename modify name varchar(20) not null ;

    清除:alter table tablename modify name varchar(20) ;


5. 定义外键约束:解决数据冗余,关联表之间的关系,保证数据正确性
*创建外键:create table s(
...
列名(想要做外键的列),
constraint constraint_FK_name(不在表中显示,存在数据库中) foreign key(列名) references 主表名(主表的列)
)
*删除外键:alter table 表名 drop foreign key constraint_FK_name;

*创建完表,添加外键:
alter table 表名 add constraint constraint_FK_name(不在表中显示,存在数据库中) foreign key(列名) references 主表名(主表的列)

级联操作:

添加外键的时候,设置级联更新:
alter table 表名 add constraint constraint_FK_name(不在表中显示,存在数据库中) foreign key(列名) references 主表名(主表的列) on update cascade;
添加外键的时候,添加级联删除:
alter table 表名 add constraint constraint_FK_name(不在表中显示,存在数据库中) foreign key(列名) references 主表名(主表的列) on update cascade on delete cascade;(可以同时级联删除,和级联更新)

多表查询

1.笛卡尔积
* 有两个集合A,B .取这两个集合的所有组成情况。
        * 要完成多表查询,需要消除无用的数据
        格式:select * from student(表一) cross join dept(表二);
2.内连接
1.隐式内连接
语法:select * from 表一(a), 表二(b) where b.id=a.id;
2.显示内连接
语法:select * from 表一(a) inner join 表二(b) on b.id=a.id;
3.外连接:
*:分为左外连接(left outer join)、右外连接(right outer join)。与内连接不同的是,外连接不仅返回连接表中符合连接条件及查询条件的数据行,也返回左表(左外连接时)或右表(右外连接时)中仅符合查询条件但不符合连接条件的数据行。
1. 左外连接:
语法:select 字段列表 from1 left [outer] join2 on 条件;
*查询的是左表所有数据以及其交集部分。

2. 右外连接:
语法:select 字段列表 from1 right [outer] join2 on 条件;
* 查询的是右表所有数据以及其交集部分。
* 例子:查询所有部门信息,如果部门有员工,则查询员工讯息,没有员工,则不员工信息
SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;

4. 子查询:将第一次的查询结果,作为第二次查询的范围。
* 概念:查询中嵌套查询,称嵌套查询为子查询。
-- 查询工资最高的员工信息
-- 1 查询最高的工资是多少 9000
SELECT MAX(salary) FROM emp;

-- 2 查询员工信息,并且工资等于9000的
SELECT * FROM emp WHERE emp.`salary` = 9000;

-- 一条sql就完成这个操作。子查询
SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);

数据备份和恢复

数据备份cmd命令下:
·mysqldump -u root -p test(数据库名称)>test.sql
数据库恢复:
·先创建数据库并选择该数据库
·在cmd下:mysql -u root -p test<test.sql

三大范式

* 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
*分类:
1. 第一范式(1NF):每一列都是不可分割的原子数据项
2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

以上是关于MySQL多表查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL-04-笔记

mysql 多表联合查询啥用

MySQL数据库多表查询

MySQL数据库多表查询

sql mysql多表如何关联查询

MYSQL多表查询