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;

相关推荐
apcipot_rain2 小时前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
辛一一4 小时前
neo4j图数据库基本概念和向量使用
数据库·neo4j
巨龙之路5 小时前
什么是时序数据库?
数据库·时序数据库
蔡蓝5 小时前
binlog日志以及MySQL的数据同步
数据库·mysql
是店小二呀6 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文
炒空心菜菜7 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
专注于大数据技术栈7 小时前
Mac上安装Mysql的详细步骤及配置
mysql
多多*7 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
爱喝酸奶的桃酥7 小时前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
数据库幼崽7 小时前
MySQL 8.0 OCP 1Z0-908 61-70题
数据库·mysql·ocp