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;

相关推荐
戒不掉的伤怀41 分钟前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql
cv高级工程师YKY1 小时前
服务器 - - QPS与TPS介绍
数据库
nbsaas-boot1 小时前
高可扩展属性建模设计:架构师的全局思考与落地方案
数据库
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
陈敬雷-充电了么-CEO兼CTO2 小时前
推荐算法系统系列>推荐数据仓库集市的ETL数据处理
大数据·数据库·数据仓库·数据挖掘·数据分析·etl·推荐算法
MeshddY2 小时前
(超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)
c语言·数据库·单片机
wuxinyan1232 小时前
Java面试题033:一文深入了解MySQL(5)
java·数据库·mysql·面试
笑衬人心。2 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
萧曵 丶3 小时前
Spring @TransactionalEventListener
java·数据库·spring·事务·transactional·异步
坤坤不爱吃鱼3 小时前
【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案
mysql·postgresql·oracle