一.多表概念
1.多表中常用概念
主表:当前表中主键列被其他的表引用,当前表叫主表.主表一定要有主键.
子表(从表):当前表中引用其他表中列,当前表叫子表.
公共列:两个或以上表中表示相同意思的列叫公共列.一般情况下,公共列的列名相同.但是公共列的列名也可以不相同.
2.多表之间的关系
一对多:在多的一方的表中,引用一的一方表中主键来建立关系.eg:一个班级有多名学生,但是一个学生只属于一个班级.
一对一:在任何一方引用另一方表中主键都可以建立关系.eg:一个女人只能有一个老公,一个男人只能有一个老婆.
多对多:建立第三张表,在第三张表中引用两张多的表中主键来建立关系.eg:一个老师可以教多名学生,一名也可以有多位老师.
二.联表查询:多张表连在一起共同查询数据.联表查询条件:表与表之间一定要有公共列,才能进行联表查询.
1.内连接:两张或两张以上的表进行联合查询数据,表与表之间的关系是平等,两张表中有对应的数据就显示.
语法一:select 列名列表 from 表名1,表名2,表名3
where 表名1.公共列=表名2.公共列
and 表名2.公共列=表名3.公共列
and 条件;
语法二:select 列名列表 from 表名1
inner join 表名2 on 表名1.公共列=表名2.公共列
inner join 表名3 on 表名1.公共列=表名3.公共列
注意:n张表,只能建立n-1个桥梁(公共列关系).
eg:#内联接:查询所有学生姓名和班级名称.
select sname,cname
from t_student,t_class
where t_student.cid=t_class.cid;
select sname,cname,s.cid
from t_student s
INNER JOIN t_class c on s.cid=c.cid;
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.公共列
eg:#外连接:查询所有学生姓名及与学生相关的班级名称
#分析:主要查询学生姓名,次要查班级名称
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 s.cid=c.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;
三.子查询:一个查询结构中嵌套了另一个查询结构.
一条SQL语句中包含两个查询,其中一个是父查询(外层查询),另一个是子查询(里层查询),子查询查询的结果作为父查询的条件。
注意:子查询的执行顺序是由内到外.
子查询可以多层嵌套,但目前一般情况下,两层到三层嵌套比较多.
eg:#子查询:查询NZjava1901班的所有学生姓名及班级编号
#先查询出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='NZjava1901';
注意项:1.能用子查询解决的问题一般情况下可以用联表查询解决.
能用联表查询的问题,不一定能用子查询解决.
2.在查询语句中,能用精确查询的就不要用模糊查询.
3.在查询语句中,如果一个题目既可以用联表查询解决,也可以用子查询解决, 优先选用子查询解决.
4.子查询除了order by后面不能用,其他关键字后面都可以用的.
四.联合查询:将查询出来的结果集合并.前提条件:两个或以下查询结果的列名相同才能合并.
1.union和union all 都可以将查询的结果合并,
不同的是:union合并结果集后要去除重复的元素,但是union all不能去除重复的元 素.
#union:查询年龄小于20和年龄大于25岁的所有的学生信息
select sid,sname,sage,sex,address
from t_student
where sage<20 or sage>25;
select sid,sname,sage,sex,address
from t_student
where sage<20
union
select sid,sname,sage,sex,address
from t_student
where 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文件->开始->关闭.
某一个字段不为null和空字符串
批量新增
批量修改