目录
前言
一、高级sql语句
1、按关键字排序
二、区间判断 ——且/或
三、 distinct 查询不重复记录
四、对结果进行分组
五、限制结果条目——limit
六、设置别名(alias ——>as)
七、通配符
八、子查询
前言
当我们对mysql数据库进行了查询后,除了基本查询,有时候更需要对查询的结果集进行再次处理。比如统计个数,对结果进行排序,只查看部分数据等等。
一、高级sql语句
1、按关键字排序
命令格式:SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ...
排序 | 效果 |
desc | 按降序方式进 行排列,ORDER BY 前面也可以使用 WHERE 子句对查询结果进一步过滤。 |
asc | 按照升序进行排序,是默认的排序方式,可以省略,未指定则以asc方式排序 |
结合where进行具体属性排列 | |
按学生的住址进行分数的降序排列 | |
首先按学生的兴趣进行降序排列,其次id也进行降序排列 | |
首先按学生的兴趣进行降序排列,其次id也进行升序排列 | |
注意:ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定,但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义
二、区间判断 ——且/或
命令格式:SELECT "字段" FROM "表名" WHERE "条件1" {[AND|OR] "条件2"}+ ;
选项 | 效果 |
and | 查询分数在70到90区间 |
or | 查询分数在70分以下或大于等于90的 |
and /or嵌套 | 查询分数在70分和90之间的或者小于60的 |
三、 distinct 查询不重复记录
命令格式:SELECT DISTINCT "字段" FROM "表名";
四、对结果进行分组
通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。
命令格式:SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;
举例 | |
按hobbid相同的分组,计算相同分数的学生个数(基于name个数进行计数) | |
按hobbid相同的分组(基于name个数进行计数)结合where语句,筛选分数大于等于80的分组,计算学生个数 | |
按hobbid相同的分组(基于name个数进行计数)结合where语句,筛选分数大于等于80的分组,结合order by把计算出的学生个数按升序排列 | |
五、限制结果条目——limit
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT
命令格式:select 字段 from 表名 limit [offset,] number
如果不设定第一个参数,将会从表中的第一条记录开始显示。
第一条偏移量是0,第二条为1
offset 为索引下标
number 为索引下标后的几位
limit 的第一个参数是位置偏移量(可选参数),是设置 mysql 从哪一行开始
命令 | 效果 |
查询所有信息显示前4行 | |
从第四行开始,往后显示3行 | |
结合order by语句,按id的大小升序排列显示前三行 | |
输出前三行 | |
结合order by语句,按id的大小升序排列输出最后三行 | |
六、设置别名(alias ——>as)
使用场景:
1、对复杂的表进行查询的时候,别名可以缩短查询语句的长度
2、多表相连查询的时候(通俗易懂、减短sql语句)
命令格式:对于列的别名: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 之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名 或字段名是不会被改变的
举例 |
select name as 姓名,score as 成绩 from info; |
select i.name as 姓名,i.score as 成绩 from info as i; |
查询info表的字段数量,以number显示 |
|
AS 还可以作为连接语句的操作符,创建t1表,将info表的查询记录全部插入t1表 |
|
注意:
此处AS起到的作用:
1、创建了一个新表t1 并定义表结构,插入表数据(与info表相同)
2、但是”约束“没有被完全”复制“过来 #但是如果原表设置了主键,那么附表的:default字段会默认设置一个0
3、与克隆、复制表结构相似——create table t1 (select * from info);也可以加入where 语句判断——create table test1 as select * from info where score >=60;
4、在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突。
列的别名是在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用。
七、通配符
通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。
通常通配符都是跟like一起使用,并协同where子句共同来完成查询任务。
%:百分号表示零个、一个或多个字符
_:下划线表示单个字符
查询以什么开头的记录 |
查询名字里是h和i中间有一个字符的记录 |
查询名字中间有g的记录 |
查询li后面的三个字段 |
查询名字以h开头的记录 |
八、子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
多表查询,查询info表中的id,name,score ,其中的id来源于na表 |
IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用 <表达式> [NOT] IN <子查询> |
同表查询info表中name,score,id,其中分数大于80的记录 |
在t1里的记录里插入info表的记录 |
UPDATE 语句也可以使用子查询。UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列 |
将wangwu的分数改为50 |
|
除去na表中所有的id且大于1的其余id分数修改为100 |
删除分数大于80的记录——delete |
删除分数不是大于等于80的记录 在 IN 前面还可以添加 NOT,其作用与IN相反,表示否定(即不在子查询的结果集里面) |
EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE |
查询如果存在分数等于80的记录则计算info的字段数 |
查询如果存在分数小于50的记录则计算info的字段数,info表没有小于50的,所以返回0 |
注意:子语句可以与主语句所查询的表相同,也可以是不同表
子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。 若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需 求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的
子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其 他的表中