3. 多表查询和dcl

一.多表概念

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和空字符串
在这里插入图片描述
批量新增
在这里插入图片描述
在这里插入图片描述
批量修改
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值