回顾:
DDL创库表,删库表
DML增删改
DQL查询(模糊查询、聚合函数、分页查询等等)
select from where gruop by having or between and limit count() sum() max()
学习内容:
1、数据的完整性及约束
2、联表查询的常用概念及表关系
3、连表查询
4、子查询
5、查询的其他操作符
6、SQL的DCL
外键约束的优点:保护数据的安全性
缺点:效率低
综合外键约束的优缺点:一般不建立外键约束。
一、多表概念
1、多表中常用概念
主表:当前表中主键列被其他的表引用,当前表叫主表,主表一定要有主键。
子表(从表):当前表中引用其他表中列,当前表叫子表。
公共列:俩个或以上表中表示相同意思的列叫公共列。一般情况下,公共列的列名相同
但是公共列的列名也可以不相同。
2、多表之间的关系
一对多:在多的一方的表中,引用一的一方表中主键来建立关系。
一个班级有多名学生,但是一个学生只属于一个班级。
一对一:在任何一方引用另一方表中主键都可以建立关系。
一个女人只能有一个老公,一个男人只能有一个老婆。
多对多:建立第三张表,在第三张表中引用俩张多的表中主键来建立关系。
一个老师可以教多名学生,一名也可以有多位老师。
二、联表查询:多张表连在一起共同查询数据,联表查询条件,表与表之间一定要有公共列,才能进行联表查询、
1、内连接:将2张或2张以上表进行联合查询数据,表与表之间的关系是平等的,2张表中有对应的数据就显示。
语法1:
select 列名列表 from 表名1 , 表名2, 表名3
where 表名1 .公共列=表名2.公共列
and 表名2.公共列=表名3.公共列
and 条件;
语法2:
select 列名列表 from 表名1
inner join 表名2 on 表名1.公共列=表名2.公共列
inner join 表名3 on 表名1.公共列=表名3.公共列
注意:n张表,只能建立n-1个桥梁(公共列关系)
公共列cid 主表 子表 联合查询
#内联接:查询所有学生姓名和班级名称。
select sname,cname from t_student,t_class where t_student.cid=t_class.cid;
select sname,cname from t_student inner JOIN t_class on t_student.cid=t_class.cid;
select sname,cname,t_student.cid
from t_student inner JOIN t_class on t_student.cid=t_class.cid;
2、外连接:2张或2张以上的表进行联合查询数据,注意查询表中数据全部显示,次要查询表中数据有对应的数据就显示,没有对应数据以空值显示,如果是次要查询表中有的数据,注意查询的表中没有之对应的数据就不显示。
2.1:左【外】连接:以左边的边为注意查询的表,右边的表为次要查询的表
语法:
select 列名列表 from 表名1
left [outer] join 表名2 on 表名1.公共列 = 表名2.公共列
left [outer] join 表名3 on 表名2.公共列 = 表名3.公共列
2.2右[外]连接:以右边的表为主要查询的表,左边的表为次要查询的表。
语法:select 列名列表 from 表名1
right [outer] join 表名2 on 表名1.公共列=表名2.公共列
right [outer] join 表名3 on 表名2.公共列=表名3.公共列
#外连接:查询所有学生姓名及与学生相关的班级名称
#分析:主要查询学生姓名,次要查询班级名称
select sname,cname from t_student s LEFT JOIN t_class c on s.cid=c.cid;
select sname,cname from t_class c RIGHT JOIN t_student s on c.cid=s.cid;
#外连接:查询所有班级及与班级相关的学生姓名
#分析:主要查询班级名称,次要查询学生姓名
SELECT sname,cname from t_class c LEFT JOIN t_student s on c.cid=s.cid;
select sname,cname from t_student s RIGHT JOIN t_class c on s.cid=c.cid;
三、子查询:一个查询结构中嵌套了另一个查询结构
注意:子查询的执行顺序是由内到外。
子查询可以多层嵌套,但是目前一般情况下,2层到3层嵌套比较多。
#子查询:查询NZJava1910班的所有学生姓名及班级编号
#先查询出NZJava1901班级编码
#再查询班级编号查询学生姓名及班级编号
SELECT s.sname,s.cid from t_student s
where cid=(select cid from t_class where cname='NZjava1901');
select s.sname,s.cid from t_student s INNER JOIN t_class c on s.cid=c.cid where c.cname='NZ1901';
注意:
1、能用子查询解决的问题一般情况下可以用联表查询解决。
能用联表查询的问题,不一定能用子查询解决
2、在查询语句中,能有精确查询的就不要用模糊查询。
3、在查询语句中,如果一个题目既可以用联表查询解决,也可以用子查询解决,
优先选用子查询解决
四、联合查询:将查询出来的结果集合并,前提条件:2个或以下查询结果的列名相同才能合并。
1、union和union all 都可以将查询结果合并。
不同是:union 合并结果集后要去除重复的元素,但是union all不能去除重复的元素。
#查询年龄小于20和年龄大于25岁的所有学生信息
select sid,sname,sage,sex,address from t_student WHERE sage<20 or sage>25;
#union(去重)/union all:查询年龄小于20和年龄大于17岁的所有学生信息
select sid,sname,sage,sex,address from t_student WHERE sage<20
union
select sid,sname,sage,sex,address from t_student WHERE sage>17;
#不去重
select sid,sname,sage,sex,address from t_student WHERE sage<20
union ALL
select sid,sname,sage,sex,address from t_student WHERE sage>17;
[] : 可选项
五.查询的总语法:
select 列名列表
from 表名1
[inner join 表名2 on 表名1.公共列=表名2.公共列]
[left/right join 表名3 on 表名2.公共列=表名3.公共列]
[where 条件] //边查询边筛选
[group by 列名1,列名2...] //得到查询结果再分组
[having 条件] //对结果集分组完成后再筛选
[order by 列名1 asc/desc,列名2 asc/desc....] //对结果进行排序
[limit 数字1 [,数字2]]
六.DCL:数据库控制语言.
1.创建用户:create user 用户名 identified by 密码;
2.删除用户:drop user 用户名;
3.给用户授权:grant 权限 on 库名.表名 to 用户名@主机名 identified by 密码;
4.撤消用户权限:revoke 权限 on 库名.表名 from 用户名@主机名;
eg:#创建用户
create user 'sx' IDENTIFIED by '123';
#删除用户
drop user 'sx';
#给用户授权
GRANT all on myschool.t_student to 'sx'@localhost IDENTIFIED by '123';
#撤消用户权限
REVOKE all on myschool.t_student from 'sx'@localhost;
5.数据库备份:
第一种用sql命令备份:用管理员身份运行cmd->cd MySql安装目录bin->输入命令:
mysqldump -u 用户名 -p 数据库名>文件路径文件名.sql;
第二种用Navicat备份:在Navicat中选中数据库名->右键->转存为Sql文件->选择文 件保存的文件夹->关闭.
6.数据库还原(还原数据库中表及数据):
第一种用sql命令还原:用管理员身份运行cmd->用sql命令登录MySql数据库->创建 数据库->use 数据库名->用命令还原数据:source 文件路径文件名.sql;
第二种用Navicat还原:在Navicat中选中链接->创建数据库->选中数据库->右键-> 运行Sql文件->选择之前备份的Sql文件->开始->关闭.
列:
从备份到还原
show databases; 查询当前所有数据库名称
create database xiaomi1; 创建数据库
select database();
use xiaomi;
source d:xiaomi.sql