mysql高阶语句

mysql高阶语句

1.对结果排序

SELECT id,name,score FROM info; #由于对id设置了主键约束,默认排序按id的大小升序排序

select name,score from info order by score; #默认按升序(从小到大排序)

select name,score from info order by score DESC; #加了DESC就是降序排序(从大到小)

select name,score from info order by id,hobbid; #可以用多个字段进行排序,但是必须是第一个字段有相同的值时,第二个字段才有意义

2.区间判断,结合where

and 表示逻辑且,and的所有条件都要为真

or 表示逻辑或,只要有一个条件满足即为真

select * from info where score > 80 and score <=90; #在80~90分内

select * from info where score < 80 or score >90; #小于80分或者大于90分

区间嵌套

select * from info where score > 80 and ( score > 90 and score <95 );

#先满足外面的大于80,再满足括号里的在90~95内

3.分组查询group by

group by 都是和聚合函数一起使用的

count ( ) 统计行数

sum ( ) 求和

avg ( ) 取平均值

max ( ) 最大值

min ( ) 最小值

select count(name),hobbid from info group by hobbid; #统计每个爱好有多少人

#注意

不要使用聚合函数的字段来进行分组

要是有多个字段,按照非统计的字段来进行分组

#分组后面不能再跟where来过滤,只能用having语句,但是可以在分组之前使用where语句

select avg(score) ,hobbid from info group by hobbid HAVING avg(score) > 80;

#根据hobbid分组,计算平均分数,再用having语句来进行过滤,过滤出平均分数大于80的

4.limit和distinct

SELECT * from info ORDER BY score DESC LIMIT 3; #显示前三名高分

select distinct hobbid from info;

5.设置别名

select name as 姓名,score as 成绩 from info;

as就是用来起别名的命令,当表名和列名过长的时候,可以使用别名进行替代

尤其是在多表联查时,可以不用申明表名

select sex 性别,score 成绩 from info;

#as不一定要加

创建表时,根据另一张表的结果,直接创建

create table info1 as select * from info where score > 90;

#不能继承完整的表结构

6.通配符

% 表示0个,1个,多个字符

_ 表示单个字符

通配符一般是和like一起使用,并且配合where条件进行过滤

select id,name,score from info where name like '_徐';

#必须徐前面有1个字节才能匹配

select id,name,address from info where address like '%西路%';

#模糊匹配,address包含西路

7.子查询

又叫内查询或者叫嵌套查询,就是在查询语句当中又嵌套这另外一个select

先查询子语句,然后把子语句的结果再传给外面进行执行

select where ... ( select ... )

子查询的表可以是同一张表,也可以是不同的表

select name,score

from info

where id in ( select id from info where score > 85 ); #id的范围是分数大于85的

#如果在in 前面加上not就是取反

#多表联查不要超过3张

exists语句,判断子查询的结果集是否为空

不指定字段名称时,可以不使用group by

select count(*) from info where exists( select id from info where score > 85);

#判断返回的结果是真还是假

9.视图表

视图是一个虚拟表,数据是基于检索的查询结果

作用是把复杂的查询语句简单化的呈现给用户

查询视图就可以获取数据,避免找到真正的表,提高了数据安全。

create view test1 as select * from info where score > 65; #生成视图表

drop view test1; #删除视图表

view和table之间的区别

  • 存储方式,表都是实际数据,保存在硬盘,视图存储的不是数据行,而是结果的集合。
  • 数据更新,更新表可以更新视图,更新视图也可以更新表,一般情况下,视图仅仅用于展示数据。
  • 占用空间,表是实际空间,视图不占用数据库的空间,就是一个结果。

9.连接查询

create table test1 (

a_id int(11) default null,

a_name varchar(32) default null,

a_level int(11) default null);

create table test2 (

b_id int(11) default null,

b_name varchar(32) default null,

b_level int(11) default null);

insert into test1 values (1,'aaaa',10);

insert into test1 values (2,'bbbb',20);

insert into test1 values (3,'cccc',30);

insert into test1 values (4,'dddd',40);

insert into test2 values (2,'bbbb',20);

insert into test2 values (3,'cccc',30);

insert into test2 values (5,'eeee',50);

insert into test2 values (6,'ffff',60);

内连接 inner join

把两个或者三个表的记录行结合起来,基于这些表之间共同的字段,进行数据的拼接,首先确定一个主表的结果集(主表的列),然后把其他表的行进行选择性的连接到主表的结果上。

select a.a_id,a.a_name from testl a INNER JOIN test2 b on a.a_id=b.b_id;

左连接 left join

左外连接,在from之后使用left join 或者 LEET OUTER JOIN 用关键字来匹配左连接以左侧表为基础,接受左表所有的行,并用这些行,与右表一起参与,显示左表以及右表符合条件的行,不满足的显示为null。

select * from testl a left join test2 b on a.a_level=b.b_level;

#在left左边就是左表,左表显示全部,右表就显示两个表相交的部分

右连接 right join

右外连接,在from之后使用right join 或者 RIGHT OUTER JOIN 用关键字来匹配,右连接以右侧表为基础,接受右表所有的行,并用这些行,与左表一起参与,显示右表以及左表符合条件的行,不满足的显示为null。

select * from test1 a RIGHT JOIN test2 b on a.a_level=b.b_level;

相关推荐
Paraverse_徐志斌2 小时前
MySQL 线上大表 DDL 如何避免锁表(pt-online-schema-change)
数据库·mysql·ddl·mysql锁·锁表·pt-osc
哈哈幸运2 小时前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
愚公搬代码2 小时前
【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
数据库·爬虫·python
pwzs3 小时前
深入浅出 MVCC:MySQL 并发背后的多版本世界
数据库·后端·mysql
大熊猫今天吃什么3 小时前
【一天一坑】空数组,使用 allMatch 默认返回true
前端·数据库
双叶8363 小时前
(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)
c语言·数据库·单片机·嵌入式硬件·mongodb·51单片机·nosql
XY.散人3 小时前
初识Redis · C++客户端list和hash
数据库·redis·缓存
码上飞扬4 小时前
深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南
数据库·mysql
海洋与大气科学4 小时前
【matlab】地图上的小图
开发语言·数据库·matlab
Geek__19925 小时前
Sqlite3交叉编译全过程
jvm·数据库·sqlite