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;

相关推荐
Elastic 中国社区官方博客1 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪3 小时前
两次连接池泄露的BUG
java·数据库
南宫乘风4 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
TDengine (老段)5 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349845 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE5 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102166 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎6 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP6 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t6 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb