SQL⾼阶语句
SQL⾼阶语句
⼀.mysql进阶查询
1.按关键字排序
使⽤order by 语句来实现排序。sql语句替换表中内容
排序可针对⼀个或多个字段。
语法:
select column1,column2,…… from table_name order by column1,column2,…… asc|desc;
ASC是按照升序进⾏排序的,是默认的排序⽅式,即ASC可以省略。select语句中如果没有指定具体的排序⽅式,则默认按ASC⽅式进⾏排序。
DESC是按降序⽅式进⾏排列。当然order by前⾯也可以使⽤where⼦句对查询结果进⼀步过滤。
创建⼀张数据表
create table info(id int(10) primary key not null auto_increment,name varchar(20) not null,score decimal(5,2),address char(40),hobby varchar(10)); insert into info values(1,'liuyi',80,'beijing','2');
insert into info values(2,'wangwu',90,'shenzheng','2');
insert into info values(3,'lisi',60,'shanghai','4');
insert into info values(4,'tinqi',99,'nanjing','5');
insert into info values(5,'jiaoshou',100,'laowo','3');
insert into info values(6,'xiaoming',10,'zhenjiang','3');
select *from info
(1)单字段排序
select name,score from info order by score [asc];
#按分数排序,默认不指定则为升序排列asc
select name,score from info order by score desc;
#按降序排列使⽤desc
(2)多字段排序
原则:order by之后的参数,使⽤“."分割,优先级是按先后顺序⽽定,例如:
select id,name,hobby from info order by hobby desc,id asc;
#优先降序排列hobby字段,然后正序排列id字段
⼩结:order by之后的第⼀个参数只有在出现相同的数值,第⼆个字段才有意义。
or/and —— 或/且
select *from info where score >70 and score <=90;
select *from info where score >70 or score <=90;
嵌套/多条件
select *from info where score >70 or (score >75 and score <90);
(3)查询不重复记录
select distinct 字段from表名;
例:
select distinct hobby from info;
1.distinct必须放在最开头
2.distinct只能使⽤需要去重的字段进⾏操作。也就是说distinct了name,hobby两个字段,后⾯想根据id进⾏排序是不可以的,因为只能name,hobby两个字段进⾏操作。
3.distinct去重多个字段时,含义是⼏个字段同时重复才会被过滤。
2.对结果进⾏分组
通过SQL查询出来的结果,还可以对其进⾏分组,使⽤group by 语句来实现,group by通常都是结合聚合函数⼀起使⽤的,常⽤的聚合函数包括:计数(count),求和(sum),求平均数(avg),最⼤值(max),最⼩值(min),group by分组的时候可以按⼀个或多个字段对结果进⾏分组处理。
select 字段,聚合函数from表名,(where 字段名(匹配)数值) group by 字段名;
例:
select count(name),level from player where level>=45 group by level;
对player进⾏分组,筛选范围/条件是level⼤于等于45的name,level相同的会默认分在⼀个组。
分组排序
select count(id),hobby from info group by hobby;
对info表中兴趣hobby相同的id进⾏数量统计,并按照相同hobby进⾏分组
select count(id),hobby from info group by hobby order by count(id) desc;
基于上⼀条操作,结合 order by 把统计的id数量按降序排列
3.限制结果条⽬
在使⽤mysql select语句进⾏查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第⼀⾏或者前⼏⾏,这时候就需要⽤到limit⼦句。
select 字段名from表名 limit offset,number
limit的第⼀个参数是位置偏移量(可选参数),是设置mysql从哪⼀⾏开始显⽰。
如果不设定第⼀个参数,将会从表中的第⼀条记录开始显⽰。需要注意的是,第⼀条记录的位置偏移量是0,第⼆条是1,以此类推。第⼆个参数是设置返回记录⾏的最⼤数⽬。
offset:索引下标。
number:索引下标之后的⼏位。
结合order by 排序:
select *from info order by id desc limit 3,4;
4.设置别名
在mysql查询时,当表的名字⽐较长或者表内某些字段⽐较长时,为了⽅便书写或者多次使⽤相同表,可以给字段列或者表设置别名。使⽤的时候直接使⽤别名,简洁明了,增强可读性。
语法:
对于列的别名:select column_name AS alias_name from table_name;
对于表的别名:select column_name(s)from table_name as alias_name;
as可以省略
在使⽤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;
相当于:
select info.name as姓名, info.score as成绩from info;
使⽤场景:
1.对复杂的表进⾏查询的时候,别名可以缩短查询语句。
2.多表相连查询的时候(通俗易懂,简短sql语句)
⽰例:
as作为连接语句
create table tmp as select *from info;
#此处as起到的作⽤:
1.创建⼀个新表tmp定义表结构,插⼊表数据(与info表相同)。
2.但是约束没有被复制过来,但是如果原表设置了主键,那么附表的default字段会默认设置⼀个0.
#相似:
克隆、复制表结构
create table tmp (select *from info);
#也可以加⼊where判断语句
create table test1 as select *from info where score >=60;
5.通配符
通配符主要⽤于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。
通常通配符都是跟like(模糊查询)⼀起使⽤的,并协同where⼦句共同来完成查询任务。常⽤的通配符有两个,分别是:
%:百分号表⽰零个、⼀个或多个字符
_:下划线表⽰单个字符
⽰例:
select *from info where name like ’l_%_';
6.⼦查询
(1)定义、⽰例
1.⼦查询也被称作内查询或者嵌套查询,是指在⼀个查询语句⾥⾯还嵌套这另⼀个查询语句。
2.⼦查询语句是先于主查询语句被执⾏的,其结果作为外层的条件返回给主查询进⾏下⼀步的查询过滤。
3.⼦语句可以与主语句所查询的表相同,也可以是不同表。
不同表
⽰例:
select name,score from info where id in(select id from info where score >80);
主语句:select name,score from info where id
⼦语句(结果集):select id from info where score >80)
in:将主表和⼦表关联起来的语法
需求:查询info表id为1,3,5,7的数据(通过⼦查询的⽅式)
单表查询⽅式:
select *from info where id in(1,3,5,7);
⼦查询⽅式:
create table num(id int(4));
insert into num values(1),(3),(5),(7);
select *from info where id in(select id from num);
1.⼦查询不仅可以在select语句中使⽤,在insert,update,delete中也同样适⽤。
2.⽀持多层嵌套。
3.in语句是⽤来判断某个值是否在给定的集合内(结果集),in往往和select搭配使⽤。
4.可以使⽤not in表⽰对结果集取反。
(2)⼦查询-别名as
先查询info表id,name字段
select id,name from info;
以上命令可以看到info表的内容(结果集)
将此结果作为⼀张表进⾏查询的时候,我们也需要⽤到别名,⽰例:
select id from(select id,name from info);
#此时会报错
ERROR1248(42000):Every derived table must have its own alias
#原因:
select *from表名,此为标准格式,⽽以上的查询语句,表名的位置其实是⼀个结果集,mysql并不能识别,⽽此时给与结果集设置⼀个别名,并且以select a.i d,name from a;的⽅式查询,将此结果集是为⼀张表,就可以正常查询出数据了。
#解决⽅法:
select a.id from(select id,name from info) a;
相当于:
select info.id,name from info;
(3)⼦查询-exist
select count(*)as number from info where exists(select id from info where name='zhangsan');
as number 将count统计的结果作为number(列名)返回。
exists:布尔值判断,后⾯的⼦查询语句(返回的结果集)是否成⽴。
where:之后跟条件判断
加exists:只是为了判断exists之后的条件是否成⽴,如果成⽴,则正常执⾏主语句的匹配,如果不成⽴,则不会执⾏主语句查询。
count为计数,sum为求和,使⽤sum求和结合exists,如⼦查询结果集不成⽴的话,使出为null。
7.视图
数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了映射,动态保存结果集(数据)。
视图我们可以定义展⽰的条件
⽰例:
将满⾜80分的学⽣展⽰在视图中。
#这个结果会动态变化,同时可以给与不同的⼈(例如权限范围)展⽰不同的视图。
#创建视图
create view v_score as select *from info where score >=80;
show table status\G
#查看视图
select *from v_score;
#修改原表数据
update info set score='60' where name='wangwu';
#查看视图
select *from v_score;
8.null值
(1)定义
在sql语句使⽤过程中,经常会碰到NULL这⼏个字符,通常使⽤NULL来表⽰缺失的值,也就是在表中该字段是没有值的。
如果在创建表时,限制某些字段不为空,则可以使⽤not null关键字,不适⽤默认可以为空。
在向表内插⼊记录或者更新记录时,如果该字段没有not null 并且没有值,这时候新记录的该字段将被保存为null。需要注意的是,null值与数字0或者空⽩(spaces)的字段是不同的,值为null的字段是没有值的在sql语句中,使⽤is null可以判断表内的某个字段是不是null 值,相反的使⽤is not null可以判断不是null值。
查询info表结构,id和name字段是不允许空值的。
null值和空值的区别(空⽓和真空)
1. 空值长度为0,不占空间
2. NULL值的长度为null,占⽤空间
3. is null ⽆法判断空值
4. 空值使⽤“=”或者“<>”来处理
5. count()计算时,NULL会被忽略,空值会加⼊计算
9.正则表达式
mysql正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。
mysql的正则表达式使⽤regexp这个关键字来指定正则表达式的匹配模式。
regexp操作符所⽀持的匹配模式如下:
^匹配⽂本的开始字符
$匹配⽂本的结束字符
.匹配任何单个字符
*匹配零个或多个在他前⾯的字符
+匹配前⾯的字符1次或多次
字符串包含指定的字符串
p1 l p2匹配p1或p2
[……]匹配字符集合中的任意⼀个字符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论