目录
引言
在对 MySQL 数据库的增、删、改、查操作有一定了解之后,就可以学习一些 SQL 语句的高级使用方法。SQL语句的熟练使用,在平时的运维工作中可以提供不小的帮助,尤其是在一些规模较小的公司,运维身兼数职,可能会有不少数据库的相关工作。
一、MySQL进阶查询
1、按照关键字排序
使用order by语句来实现排序,排序可针对一个或多个地段,order by的语法结构:select column1, column2, ... from table_name order by column1, column2, ... asc|desc;
注:asc是按照升序进行排序的,是默认的排序方式,即asc可以省略。select 语句中如果没有指定具体的排序方式,则默认按asc方式进行排序。desc是按降序方式进行排列,当然order by前面也可以使用where子句对查询结果进一步过滤。
(1)单字段排序
①按照分数排序,默认不指定时升序排列(asc)
②按照分数降序排列,使用desc
(2)条件查询
order by还可以结合where进行条件过滤,筛选地址是南京的学生按分数降序排列
(3)多字段排序
order by之后的参数,使用“,”分割,优先级是按先后顺序而定
(4)区间判断及查询不重复记录(and/or:且/或)
①查询分数在70到90之间所有的学生
②查询分数在70分以下,90分以上的学生
③查询分数在60到70之间,95分以上的学生
2、查询不重复记录(distinct)
格式:select distinct 字段 from 表名;
(1)distinct必须放在最开头;
(2)distinct只能使用需要去重的字段进行操作;
(3)distinct去重多个字段时(几个字段同事重复才会被过滤)。
3、对结果进行查询
通过SQL查询出来的结果,还可以对其进行分组,使用group by语句来实现 ,group by通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),group by分组的时候可以按一个或多个字段对结果进行分组处理。
格式:select 字段,聚合函数from表名,(where字段名(匹配)数值)group by字段名;
select column_name,aggregate_function(column_name)from table_name where column_name operator value group by column_name;
对info进行分组,筛选范围/条件时score大于等于80的“name,score”相同的会默认分在一个组。
(1)分组排序
①对info表中兴hobby相同的id进行数量统计,并按照相同hobby进行分组
②基于上一条操作,结合order by把统计的id数量进行按降序序排列
(2)分组条件
结合where语句,筛选分数大于等于80的分组,计算学生个数按升序排列
4、限制结果条目(limit)
limit限制输出的结果记录,在使用MySQL select语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅 需要返回第一行或者前几行,这时候就需要用到limit子句。
格式:select column1, column2, ... from table_name limit [offset,] number
limit的第一个参数是位置偏移量(可选参数),是设置MySQL从哪一行开始显示。 如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,第一条记录的位置偏移量是0,第二条是1,以此类推。第二个参数是设置返回记录行的最大数目。
(1)查询所有信息显示前4行记录
(2)从第5行开始,往后显示3行内容
(3)结合order by语句,按id的大小升序排列显示前三行
(4)结合order by语句,按id的大小升序排列显示最后三行
5、设置别名(alias)
在MySQL查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性。
对于列的别名格式:select column_name as alias_name from table_name;
对于表的别名格式:select column_name(s) from table_name as alias_name;
在使用as后,可以用alias_name代替 table_name,其中as语句是可选的。as之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名或字段名是不会被改变的。
(1)列别名设置
(2)如果表的长度比较长,可以使用as给表设置别名,在查询的过程中直接使用别名(临时设置info的别名为i)
(3)查询info表的字段数量,以number显示
(4)不用as也可以,一样显示
使用场景:对复杂的表进行查询的时候,别名可以缩短查询语句的长度;多表相连查询的时候(通俗易懂、减短sql语句)。
(5)AS 还可以作为连接语句的操作符。创建t1表,将info表的查询记录全部插入t1表。
此处as起到的作用:创建了一个新表t1并定义表结构,插入表数据(与info表相同),但是“约束”没有被完全“复制”过来。如果原表设置了主键,那么附表的:default字段会默认设置一个0
(6)使用where语句判断
在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突。列的别名是在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用。
6、通配符
通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。通常通配符都是跟like(模糊查询)一起使用的,并协同where子句共同来完成查询任务。常用的通配符有两个,分别是:%(百分号表示零个、一个或多个字符);_(下划线表示单个字符)
(1)查询名字是l开头的记录
(2)查询名字里是c和i中间有一个字符的记录
(3)查询名字中间有g的记录
(4)查询hanmei后面3个字符的名字记录
(5)通配符“和“%”_”不仅可以单独使用,也可以组合使用
7、子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子语句可以与主语句所查询的表相同,也可以是不同表。
其中:主语句(select name,score from info where id);子语句(select id from info where score >80)。
子语句中的sql语句是为了,最后过滤出一个结果集,用于主语句的判断条件。 in是将主表和子表关联/连接的语法。
子查询不仅可以在select语句中使用,在insert、update、delete中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。子查询还可以用在insert 语句中。子查询的结果集可以通过insert语句插入到其他的表中。
update语句也可以使用子查询。update内的子查询,在set更新内容时,可以是单独的一列,也可以是多列。
(1)多表查询
(2)info表的记录插入到t1表里面
(3)将caicai的分数改为50
(4)删除分数大于80的记录
(5)删除分数不是大于等于80的记录
在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面)
(6)exists
exists这个关键字在子查询时,主要用于判断exists之后的条件是否成立,如果成立,则正常执行主语句的匹配,如不成立,则不会执行主语句查询,如子查询结果集不成立的话,输出为null。
①查询如果存在分数等于80的记录则计算info的字段数
②查询如果存在分数小于50的记录则计算info的字段数,info表没有小于50的,所以返回0
(7)别名as
8、视图
视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据。数据库种只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射,镜花水月/倒影,动态保存结果集(数据)。
(1)、视图的作用
①使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件。
②增加数据的安全性,通过视图,用户只能查询和修改指定的数据。
③提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。
使用视图的大部分情况是为了保障数据安全性,提高查询效率。
(2)创建视图
(3)查看视图
(4)修改原表数据
注:修改原表会改变视图中的数据
(5)修改视图数据
注:修改视图不会改变原表的数据
9、NULL值
在SQL语句使用过程中,经常会碰到null这几个字符。通常使用null来表示缺失的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用not null关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有not null并且没有值,这时候新记录的该字段将被保存为null。需要注意 的是,null值与数字0或者空白(spaces)的字段是不同的,值为null的字段是没有值的。在SQL语句中,使用is null可以判断表内的某个字段是不是null值,相反的用is not null可以判断不是null值。
null值与空值的区别(空气与真空);空值长度为0时不占空间,null值的长度为null时占用空间;is null无法判断空值;空值使用”=”或者”<>"来处理(!=);count()计算时null会忽略,空值会加入计算。
(1)查询info表结构,id和name字段是不允许空值的
(2)插入一条记录,分数字段输入null,显示出来就是null
(3)检测null是否会加入统计中
(4)将info表中其中一条数据修改为空值
(5)查询null值和不是null值
二、正则表达式
MySQL正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用regexp这个关键字来指定正则表达式的匹配模式,regexp操作符所支持的匹配模式如表所示。
1、regexp匹配参数含义
序号 |
匹配的参数 |
含义 |
1 |
^ |
匹配文本的开始字符 |
2 |
$ |
匹配文本的结束字符 |
3 |
. |
匹配任何单个字符 |
4 |
* |
匹配零个或多个在它前面的字符 |
5 |
+ |
匹配前面的字符 1 次或多次 |
6 |
字符串 |
匹配包含指定的字符串< |