MySQL高级SQL语句

目录

一、按关键字排序查询

1、单字段排序

1.1、按某个字段升序排序

1.2、按某个字段升序降序

1.3、结合where进行条件过滤

2、多字段排序

2.1、按多字段升序排序

2.2、按多字段降序排序

3、区间判断及查询不重复记录

3.1、区间判断

3.2、查询不重复记录

二、对结果进行分组查询

1、count聚合函数

案例一

案例二

案例三

三、限制结果条目(limit)

1、查询前n行记录

2、查询前n行后m行记录

3、查询某个单独行的记录

四、设置别名alias

1、设置字段的别名

2、设置表的别名

3、as作为连接语句的操作符

五、通配符like

1、查询名字是c开头的记录

2、查询以某字符结尾的记录 

3、查询只要有某字符的记录

4、查询具体到任意单个字符的记录

六、子查询

1、select

 1.1、单表查询

1.2、多表查询

1.3、将子语句的结果取反not

2、insert

3、update

4、delete

5、exists

6、别名as

七、视图

1、视图的概念和作用

2、视图和表的区别和联系

3、具体操作

3.1、创建视图 

3.2、修改视图数据

3.3、删除视图

八、NULL值

九、连接查询

1、内连接

2、左连接

3、右连接


一、按关键字排序查询

1、单字段排序

使用 select 语句可以将需要的数据从 mysql 数据库中查询出来,如果对查询的结果进行排序操作,可以使用 order by 语句完成排序,并且最终将排序后的结果返回给客户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段

格式:​select 字段1,字段2,…… from 表名 order by 字段 asc|desc​;
 
#​其中asc|desc​
#​asc:是按照升序进行排名的,是默认的排序方式,即asc可以省略​
#​desc:是按照降序的方式进行排序的​
#当然 order by 前也可以使用 where 子句对查询结果进一步过滤

 部署环境:新建表,并插入表数据,方便进行查询

#登录mysql数据库
[root@localhost ~]#mysql -uroot -p123456
#进入cxc数据库
use cxc;
#新建表
create table info (id char(3) not null,name varchar(15) not null primary key,score decimal(4,2),address varchar(50) not null,hobbid char(3) not null);
#插入点表数据,来进行查询
insert into AAA values (1,'cxc','66','江苏南京',5);
insert into AAA values (2,'xyk','97','江苏徐州',3);
insert into AAA values (3,'xw','82','江苏泰州',2);
insert into AAA values (4,'jjg','45','江苏无锡',3);
insert into AAA values (5,'jhw','77','江苏宿迁',2);
insert into AAA values (6,'wjh','92','江苏南京',1);

1.1、按某个字段升序排序

格式:​select 字段1,字段2,…… from 表名 order by 字段 asc;
#​asc:是按照升序进行排名的,是默认的排序方式,即asc可以省略​

例如: 

select name,score from AAA order by score asc;
//按照分数升序排序,显示name和score的字段值

1.2、按某个字段升序降序

格式:​select 字段1,字段2,…… from 表名 order by 字段 desc;
//desc:是按照降序的方式进行排序的​

例如: 

select name,score from AAA order by score desc;
//按照分数降序排序,显示name和score的字段值

1.3、结合where进行条件过滤

select name,score,address from AAA where address='江苏南京' order by score;
//筛选地址为“江苏南京”的行数据,并按成绩进行升序排序,显示id,name、address字段

select name,score,hobbid from AAA where hobbid=3 order by score desc;
#筛选hobbid为3的行数据,并按成绩进行降序排序,显示name、score、hobbid字段

2、多字段排序

order by 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,order by 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定,但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义。

2.1、按多字段升序排序

格式:​select 字段1,字段2,…… from 表名 order by 字段1 asc,字段2 asc,……;
#​asc:是按照升序进行排名的,是默认的排序方式,即asc可以省略​
#order by之后的第一个参数只有在出现相同值时,第二个字段才有意义

2.2、按多字段降序排序

格式:​select 字段1,字段2,…… from 表名 order by 字段1 desc,字段2 desc,……;
#​desc:是按照降序的方式进行排序的​
#order by之后的第一个参数只有在出现相同值时,第二个字段才有意义

3、区间判断及查询不重复记录

3.1、区间判断

AND/OR:且/或的使用
格式:select 字段 from 表名 where 条件判断1 and/or 条件判断2

例如:

#筛选分数大于70且分数小于等于95的记录
select * from AAA where score > 70 and score <= 95;
#筛选分数小于70,或者分数大于等于95的记录
select * from AAA where score < 70 or score >= 95;

AND/OR嵌套使用

#筛选分数大于80,或者分数大于等于85且分数小于95的记录
select * from AAA where score > 80 or (score >= 85 and score < 95);

3.2、查询不重复记录

格式:select distinct 字段 from 表名﹔
 
#distinct:必须放在最开头
#distinct:只能使用需要去重的字段进行操作
#distinct:去重多个字段时,几个字段同时重复时才能被过滤,会默认按左边第一个字段为依据

例如: 

#去除hobbid字段重复的值
select distinct hobbid  from AAA;

二、对结果进行分组查询

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。

格式:select 字段1, 聚合函数(字段2) from 表名 (where 字段名 (匹配) 数值) group by 字段1;

1、count聚合函数

案例一

按hobbid相同的分组,计算相同分数的学生个数(基于name个数进行计数)

select count(name),hobbid from AAA group by hobbid;

案例二

结合where语句,筛选分数大于等于80的分组,计算学生个数


#结合where,筛选分数大于等于80的分组,并计算各组学生的个数
select count(name),score from AAA where score >=80 group by score;

案例三

结合order by把计算出的学生个数按升序排列

#结合order by,筛选分数大于等于80的分组,并计算各组学生的个数,并且按学生个数升序排序
select count(name),score from AAA where score >=80 group by score oprder by count(name);

三、限制结果条目(limit)

  • limit 限制输出的结果记录
  • 在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅 需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句

1、查询前n行记录

案例一:查询前4行记录

select * from AAA limit 4;

案例二:查询前3行,分数大于70的记录,显示id、name、score列

select id,name,score from AAA where score >70 limit 3;

2、查询前n行后m行记录

案例一:查询前3行后的2行记录

select * from AAA limit 3,2;

案例二:按id升序排序,查询前三行后两行记录,显示id、name、score列

select id,name,score from AAA order by id limit 3,2;

3、查询某个单独行的记录

#查询第一行记录
select * from info limit 1;

#查询第四行记录
select * from info limit 3,1;

#查询第五行记录
select * from info limit 4,1;

四、设置别名alias

在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性

1、设置字段的别名

select 字段名 as 字段别名 from 表名;
#在使用 as 后,可以用 字段别名 代替 字段名,其中 as 语句是可选的。as 之后的别名,主要是为表内的列提供临时的名称,在查询过程中使用,库内实际的字段名是不会被改变的

案例一: 查询整个表共有多少条数据,以number字段显示

select count(*) as number from AAA;
select count(*) number from AAA;
#加不加as都能设置字段别名

案例二:为查询结果的字段设置别名

select name 姓名,score 成绩,address 地址 from AAA;

2、设置表的别名

select 字段 from 表名 as 表别名;
//在使用 as 后,可以用 表别名 代替 表名,其中 as 语句是可选的。as 之后的别名,主要是为表提供临时的名称,在查询过程中使用,库内实际的表名是不会被改变的
select i.name 姓名,i.score 成绩,i.address 地址 from info as i;

3、as作为连接语句的操作符

create table info2 as select * from info;

注:

此处AS起到的作用:

1、创建了一个新表info2并定义表结构,插入表数据(与info表相同)

2、但是”约束“没有被完全”复制“过来,但是如果原表设置了主键,那么附表的default字段会默认设置一个0

相似:和克隆、复制表结构相似  create table t1 (select * from info);

结合where语句来进行判断

create table info3 as select * from AAA where score >=70;

注:

在为表设置别名时,要保证别名不能与数据库中的其他表的名称冲突
列的别名是在结果中有显示的,而表的别名在结果中没有显示,只在执行查询时使用

五、通配符like

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。

通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务。常用的通配符有两个,分别是:

  • %:百分号表示零个、一个或多个字符        *
  • _:下划线表示单个字符 

1、查询名字是c开头的记录

​select 字段 from 表名 where 字段 like ‘确定字符%’;
select id,name,score from AAA where name like 'c%';

select id,name,score from AAA where name like 'x__';

2、查询以某字符结尾的记录 

​select 字段 from 表名 where 字段 like ‘%确定字符’;

3、查询只要有某字符的记录

​select 字段 from 表名 where 字段 like ‘%确定字符%’;
select id,name,score from AAA where name like '%x%';

4、查询具体到任意单个字符的记录

​select 字段 from 表名 where 字段 like ‘字符_字符__字符’;
mysql> select id,name,score from AAA where name like 'x_k';

mysql> select id,name,score from AAA where name like '__c';

六、子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。

IN操作符概念

允许在where子句中指定一个值列表,然后从表中选择列值与这个列表中任何一个值相匹配的行。简而言之,IN可以在单个查询中对多个值进行条件匹配

也用来判断某个值是否在给定的结果集中,通常结合子查询来使用

<表达式> [not] in <子查询>
 
#当表达式与子查询返回的结果集中的某个值相等时,返回 true,否则返回 false
#若启用了 not 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对
#多数情况下,子查询都是与 select 语句一起使用的

1、select

 1.1、单表查询

select name,score from AAA where id in (select id from AAA where score >80);

#主语句:select name,score from info where id;
#子语句(集合):select id from info where score >80;
#子语句中的sql语句是为了最后过滤出一个结果集,用于主语句的判断条件

1.2、多表查询

select id,name,score from AAA where id in (select id from test);

1.3、将子语句的结果取反not

select id,name,score from AAA where id not in (select id from AAA where score >80);

2、insert

子查询还可以用在insert语句中,子查询的结果集可以通过insert语句插入到其它表中

insert into class select * from AAA where id in (select id from test);

3、update

update语句也可以使用子查询,update内的子查询,在set更新内容时,可以是单独的一行一列,也可以是多行单列

#更新单行单列数据
update info set score=100 where id in (select id from AAA where id=2);

4、delete

使用子查询的delete语句允许根据另一个查询的结果来删除记录。这种方式特别有用于删除那些满足特定关联条件的行,而这些条件可能需要通过查询其他表来确定

delete from BBB where id in (select id where score >80);

5、exists

exists这个关键字在子查询时,主要用于判断子查询的结果集是否为空,如果不为空,则返回true,反之则返回false
在使用exists时,当子查询有结果时,不关心子查询的内容,执行主查询操作;当子查询没有结果时,则不执行主查询操作

#当子语句查询结果不为空时返回true,立即执行主语句
select count(*) from AAA where exists(select id from AAA where score>70);

6、别名as

将结果集作为一张表进行查询的时候,需要用到别名

select id,name from (select id,name from AAA) a;

七、视图

1、视图的概念和作用

数据库中的虚拟表,不包含真实数据,只是映射;简化SQL语句,简化查询结果集、灵活查询,针对不同的用户呈现不同的结果集;只适合查询,不适合增删改。视图有表之后才能存在,它的内容都来自基本表,一个视图可对应一个或多个基本表。

2、视图和表的区别和联系

①、视图是已经编译好的sql语句。而表不是

②、视图没有实际的物理记录。而表有。show table status\G

③、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

④、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

⑤、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。

⑥、视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)


3、具体操作

#创建视图
create view 视图表名 as select * from 表名 where 条件;
#查看视图
select * from 视图表名;
#查看表和视图的状态信息
show table status\G;
#查看视图结构
desc 视图表名;
#修改视图
update 视图表名 set 字段=新值 where 条件判断;
#删除视图
drop view [if exists] 视图名;

3.1、创建视图 

#创建视图
create view 视图表名 as select * from 表名 where 条件;
#单表创建视图
create view v_sc as select * from AAA where score >70;

3.2、修改视图数据

格式:update 视图表名 set 字段=新值 where 条件判断;
#修改视图数据
update v_score set score=60 where name='cxz';

3.3、删除视图

格式:drop view [if exists] 视图名;
drop view v_1;

八、NULL值

在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失的值,也就是在表中该字段是没有值的。

如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。

如果在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。

NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有值的。在 SQL 语句中,使用 ls null 可以判断表内的某个字段是不是 NULL 值,相反的用 ls not null可以判断不是NULL值

NULL值与空值的区别:

  • 空值长度为0,不占空间,NULL值的长度为null,占用空间
  • ls null可判断是不是NULL值,却无法判断空值
  • 空值使用"=“或者”<>"来处理(!=)
  • count() 计算时,NULL会忽略,空值会加入计算 
#查看null值、空值、abc字符串的字符长度
select length(null),length(''),length('123');

alter table BBB add length varchar(50);
alter table BBB add age varchar(50) not null;

九、连接查询

在MySQL中,连接查询是一种用于检索数据的方法,它可以从一个以上的表中获取数据,并将它们关联起来。这种查询通常使用JOIN子句来实现

1、内连接

内连接就是两张或多张表中同时符合某种条件的数据记录的组合。

通常在 from 子句中使用关键字 inner join 来连接多张表,并使用 on 子句设置连接条件,内连接是系统默认的表连接,所以在 from 子句后可以省略 inner 关键字,只使用 关键字 join。同时有多个表时,也可以连续使用 inner join 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表

格式:select 表1[2].字段1,表1[2].字段2,... from 表1 inner join 表2 on 表1.同名字段=表2.同名字段;
select AAA.id,AAA.name,AAA.score from AAA inner join BBB on AAA.name=BBB.name;

2、左连接

左连接也可以被称为左外连接,在 from 子句中使用 left join 或者 left outer join 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行

格式:select * from 表1 left join 表2 on 表1.同名字段=表2.同名字段;
select * from AAA left join BBB on AAA.name=BBB.name;

3、右连接

右连接也被称为右外连接,在 from子句中使用 right join 或者 right outer join 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配

select * from 表1 right join 表2 on 表1.同名字段=表2.同名字段;
select * from info right join web on info.name=web.name;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值