sql-4

order by 排序子句

对结果进行排序的语句!

语法:

order by 字段名 [asc|desc], [字段名 [asc|desc],]

asc  升序   desc 降序

 

 

可按照多个字段进行排序

 

 

 

 

limit 子句

限制 结果记录数的子句!

所有的结果中 ,选择部分结果的 子句!

 

 

可以从 某个位置开始,取得多少条!

语法:

limit start, size;

start:起始位置

size,取得的记录数

 

 

 

注意,第二个参数是,长度,而不是 终止位置!

 

limit使用的最多的地方就是用在分页!

子查询,sub-query

概念

简单来说,所谓的子查询,就是一条select语句中又出现了其他的select语句

要求:子查询的语句必须用一对括号括起来!

 

 

需求:

找出学生表中身高最高的学生!

 

 

 

如果说表中出现了多条记录中的身高是一样的 上面的SQL语句就满足不了我们的需求!

我们可以先取得到

 

 

 

 

子查询的分类

分类的依据!

两种分类依据:

1, 依据 子查询出现的位置

where型子查询, 出现在where子句内!

from 型子查询, 出现在from子句内!

 

2, 依据 子查询的返回数据的格式

标量子查询,返回值是一个数据,称之为标量子查询!   一行一列的二维表

列子查询,返回一个列,多行一列的二维表

行子查询,返回一个行,一行多列的二维

表子查询,返回的是一个二维表

 

 

 

from型  表子查询

from型子查询一般就是当成一张表来使用,而且大部分出现在from之后,作为数据源!

需求:

查询,每个班级之内,最高的学生

先要让班级进行分组  然后再对身高进行排序

 

先对身高进行降序

 

 

 

 

列子查询

我们通常把列子查询的结果当成一个集合来使用!

所以,通常就是配合innot in来使用列子查询!

 

需求:

查询班级有女学生的男同学的信息

 

先应该把有女学生的班级ID找出来

 

 

 

 

 

查询有学生的班级

 

 

行子查询

一次性查出来一个行(多个行)使用 行进行匹配   

需求:

查找班级中最高的同时最有钱的学生   

 

 

 

 

 

 

 

exists型子查询

exists子查询的目的不是为了产生结果集,只是用来判断某个子查询是否查询到了数据!

exists子查询返回的是一个布尔值!

如果查询到了结果,就返回true1),如果没有查询到数据,就返回false0

exists出现在where条件里面

查询有学生的班级

 

 

 

连接查询,join

连接,多个表记录之间的连接

 

 

场景:

需要得到一个学生列表,要求是,展示:

学生姓名,性别,班级名字

 

 

此时 需要 不单从 学生表获取数据,还需要从 班级表获得数据!

 

语法:

from 表名1  join  表名2 on 连接条件

 

两个特殊的地方:

join ,连接

on ,连接条件

 

 

join 连接语法

内连接

外连接左外连接,右外连接,

交叉连接

自然连接

 

 

内连接,inner join

记录与真实的记录连接,称之为内连接!(两条真实存在的记录的连接

mysql默认的连接就是 inner join

 

 

 

 

内连接,可以连接省略条件!

on可以省略:相当于连接条件永远成立!

返回值是一个 笛卡尔积!

 

 

 

外连接,left joinright join

分成:左外连接left join,右外连接right join!

 

连接的记录,可能是一方不存在的!(两条记录中,可能某条不存在

 

 

总结:内连接,外连接差别不大,只是外连接会将没有连接成功的记录,也出现最终的连接的结果内,而内连接,连接的结果只有连接成功的(两条记录都存在的)

 

 

左外连接

 

 

 

右外连接

 

 

 

注意左外与右外的区别:

区别在于,那个表的记录(指的是连接失败的记录),会最终出现在连接结果内?

 

什么是左表 右表?

join关键字前面的(左边的)左表,join关键字后边的(右边的)右表!

 

左外:如果出现左表记录连接不上右表记录的,左表记录会出现正在最终的连接结果内!而右表记录相应设置成NULL

右外:如果出现右表记录连接不上左表记录的,右表记录会出现正在最终的连接结果内!而左表记录相应设置成NULL

 

总结:左外连接它是以左表为主   右外连接它是以右表为主

左右外连接其实它们可以是一样的 ,只需要换表所在的位置  

 

工作中使用最多就是左外连接

 

 

 

问题:

统计 每个班级内,学生的数量!,在班级列表内:

班级名,教室,学生数量

 

 

外连接一定要有连接的条件:

 

 

 

 

交叉连接,cross join

 

结果与 内连接一致

内连接:

 

 

交叉连接:

 

 

 

有时,在获得笛卡尔积时,显式的使用 交叉连接!

 

交叉连接 相当于 没有条件的内连接!

 

 

 

自然连接,natural  join

自然连接它是拿多个表中相同的字段名来作为连接的条件

 

 

mysql,自动判断连接条件,帮助我们完成连接!

典型的条件就是,表中的同名字段!

 

 

 

连接条件,onusing

on,后面使用一个连接条件表达式!

 

 

using(连接字段),要求使用同名字段进行连接!

 

 

 

using 的特别地方:

会对字段列表做一次整理!将连接字段作为一次显示!

 

 

 

 

 

union查询,联合查询

多个查询的结果,并列到一个结果集合内!

将班级表中的男生与女生的数量联合起来!

 

 

 

 

先获取到班级中所有的男生 按身高降序  

然后获取到班级中所有的女生 按身高升序

把两个结果联合到一起   

 

 

 

 

 

 

union要求两个表中的字段的数量要一样

 

 

 

 

 

select语句的选项

distinct,取消相同的记录  去重

 

 

默认是 all,可以不写,表示所有的记录都出现!

 

 

删除数据,deletetruncate

delete时,支持 order by limit 来限制删除的数据记录!

 

 

 

如果清空表,此时可以独立使用 truncate 语句,完成清空表

 

 

 

 

 

truncate 表名 先将表给删除  然后再重新创建一张表

 

 

更新,update

类似于 删除,也可以使用 order by limit 确定更新的记录!

 

 

数据的备份

属于DCL:数据控制语言!

备份:就是将已有的数据复制一份,存放到其他的存储单元!

常见的有:文本备份,数据备份和sql备份

文本备份

文本备份是最简单的,复制——粘贴!

一般认为,只适合Myisam存储引擎的表!

因为Myisam引擎的表它会将表分为三个部分来进行存储

 

 

 

文本备份的缺点:

每次都需要备份整个全部文件,非常浪费磁盘空间!

 

数据备份

就是只备份一张表的数据部分!

采用这种备份方式,如果误删了表的全部记录,还可以还原(也就是误使用delete语句),但是如果将整个表都删除了(误使用drop),不能还原!

备份语法

select  *|字段列表  into  outfile 文件地址  from 表名;

 

 

 

 

 

还原语法

load data infile 文件路径  into table 表名[字段列表];

 

 

 

 

数据的导出工具,mysqldump

将表的结构和数据通过sql语句的形式进行备份!

 

 

 

mysql中有一个专门用来sql备份的客户端!

 

备份语法

备份一个库

 

mysqldump  hPup  -B  需要备份的数据库 > 指定的文件中  

 

 

 

注意,上面的语法,指的是 输出重定向!

 

备份表

备份库相比,多出了一个 表名的值

库名 表名

一次备份一个表

mysqldump  hPup   数据库 表名 > 指定的文件中  

 

 

一次备份多个表

mysqldump  hPup   数据库  表名1  表名2  表名n > 指定的文件中  

说明:

表名之间是使用空格分隔

 

 

还原语法

CMD窗口中 没有登录mysql客户端时

mysql hPup 数据库名 < 备份路径

 

 

 

select_stu.sql这个文件中内容导入到xyz数据库中

 

 

还原还有一个语法:

可以在mysql客户端登陆后,使用 source 指令,来强制执行一个文件内的sql语句!

 

 

source 备份路径;  

 

使用source这个命令导入文件时 文件名不需要加引号

用户权限管理

用户权限管理:在不同的项目中给不同的角色(开发者)不同的操作权限,为了保证数据库数据的安全。

 

通常,一个用户的密码不会长期不变,所以需要经常性的变更数据库用户密码来确保用户本身安全(mysql客户端用户)

 

用户管理

Mysql需要客户端进行连接认证才能进行服务器操作:需要用户信息。Mysql中所有的用户信息都是保存在mysql数据库下的user表中。

 

 

 

 

默认的,在安装Mysql的时候,如果不选择创建匿名用户,那么意味着所有的用户只有一个:root超级用户

 

 

mysql中,对用户管理中,是由对应的Host和User共同组成主键来区分用户。

User:代表用户的用户名

Host:代表本质是允许访问的客户端(IP或者主机地址)。如果host使用%代表所有的用户(客户端)都可以访问

 

 

创建用户

基本语法:create user 用户名 identified by ‘明文密码’;

用户:用户名@主机地址

主机地址:’’ | ‘%’

 

 

 

删除用户

注意:mysqluser是带着host本身的(具有唯一性)

基本语法:drop user 用户名@host;

 

 

修改用户密码

Mysql中提供了多种修改的方式:基本上都必须使用对应提供的一个系统函数:password(),需要靠该函数对密码进行加密处理。

 

 

1 使用专门的修改密码的指令

基本语法:set password for 用户 = password(新的明文密码);

 

2 使用更新语句update来修改表

基本语法:update mysql.user set password = password(‘新的明文密码’) where user = ‘’ and host= ‘’;

 

 

权限管理

mysql中将权限管理分为三类:

1 数据权限:增删改查(select|update|delete|insert

2 结构权限:结构操作(create|drop

3 管理权限:权限管理(create user|grant|revoke):通常只给管理员如此权限

授予权限:grant

将权限分配给指定的用户

基本语法:grant 权限列表 on库名.表名 to 用户;

权限列表:使用逗号分隔,但是可以使用all privileges代表全部权限

数据库.表名:可以是单表(数据库名字.表名),可以是具体某个数据库(数据库.*),也可以整库(*.*

 

 

取消权限:revoke

权限回收:将权限从用户手中收回

revoke 权限列表 on 库名.表名 from ‘用户名[@主机地址];

 

 

刷新权限:flush

Flush:刷新,将当前对用户的权限操作,进行一个刷新,将操作的具体内容同步到对应的表中。

基本语法:flush privileges;

密码丢失的解决方案

如果忘记了root用户密码,就需要去找回或者重置root用户密码

 

1 停止mysql服务  

 

 

2 重新启动服务:mysqld.exe  –skip-grant-tables //启动服务器但是跳过权限

 

 

3 当前启动的服务器没有权限概念:非常危险,任何客户端,不需要任何用户信息都可以直接登录,而且是root权限:新开客户端,使用mysql.exe登录即可

 

 

4 修改root用户的密码:指定 用户名@host

 

5 赶紧关闭服务器,重启服务

 

 

 

视图,view

视图,是一张表,但是虚拟表!

是通过 一条 查询语句 得到一个张虚拟表!

因此,认为视图,就是 select语句的结果!

 

创建视图

视图的本质是SQL指令(select语句)

基本语法:create  view 视图名字 as  select指令; //可以是单表数据,也可以是连接查询,联合查询或者子查询

 

 

 

 

 

 

 

查看视图结构:视图本身是虚拟表,所以关于表的一些操作都适用于视图

 

比如有一个用户是超级管理员  我们可以给其看到所有的数据  

 

普通用户我只想给其一个查看 学生姓名 、学生的所在班级  

 

 

使用视图

视图是一张虚拟表:可以直接把视图当做“表”操作,但是视图本身没有数据,是临时执行select语句得到对应的结果。视图主要用户查询操作。

 

 

基本语法:select 字段列表 from 视图名字 [字句];

 

修改视图

修改视图:本质是修改视图对应的查询语句

基本语法:alter view 视图名字 as select指令;

 

删除视图

基本语法:drop view 视图名字;

 

 

 

 

视图算法,执行方式 algorithm

场景

取得每个班级最高的学生信息

使用 from型子查询,可以,但是使用同样逻辑的视图不行!

 

 

 

视图 其实一共有三种执行方式:

merge,合并

temptable,临时表

undefined,未定义,就是默认的,mysql自己决定算法(从 merge,和temptable内选择)!

 

在创建视图的时候可以指定视图的算法  

 

 

 

视图用的非常少

posted @ 2017-10-06 22:31  奋斗的黑蜗牛1号  阅读(241)  评论(0)    收藏  举报