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之后,作为数据源!

需求:

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

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

 

先对身高进行降序

 

 

 

 

列子查询

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

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

 

需求:

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

 

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

 

 

 

 

 

查询有学生的班级

 

 

行子查询

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

需求:

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

 

 

 

 

 

 

 

exists型子查询

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

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

如果查询到了结果,就返回true(1),如果没有查询到数据,就返回false(0)

exists出现在where条件里面

查询有学生的班级

 

 

 

连接查询,join

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

 

 

场景:

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

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

 

 

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

 

语法:

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

 

两个特殊的地方:

join ,连接

on ,连接条件

 

 

join 连接语法

内连接

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

交叉连接

自然连接

 

 

内连接,inner join

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

mysql默认的连接就是 inner join

 

 

 

 

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

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

返回值是一个 笛卡尔积!

 

 

 

外连接,left join,right join

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

 

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

 

 

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

 

 

左外连接

 

 

 

右外连接

 

 

 

注意左外与右外的区别:

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

 

什么是左表 和 右表?

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

 

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

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

 

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

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

 

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

 

 

 

问题:

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

班级名,教室,学生数量

 

 

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

 

 

 

 

交叉连接,cross join

 

结果与 内连接一致!

内连接:

 

 

交叉连接:

 

 

 

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

 

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

 

 

 

自然连接,natural  join

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

 

 

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

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

 

 

 

连接条件,on,using

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

 

 

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

 

 

 

using 的特别地方:

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

 

 

 

 

 

union查询,联合查询

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

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

 

 

 

 

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

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

把两个结果联合到一起   

 

 

 

 

 

 

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

 

 

 

 

 

select语句的选项

distinct,取消相同的记录  去重

 

 

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

 

 

删除数据,delete,truncate

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 ‘明文密码’;

用户:用户名@主机地址

主机地址:’’ | ‘%’

 

 

 

删除用户

注意:mysql中user是带着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号  阅读(249)  评论(0)    收藏  举报