mysql高阶语句

一、常用查询

对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等。

1、按关键字排序

PS:类比于windows 任务管理器

使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,可以使用 ORDER BY 语句来对语句实现排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段。

(1)语法

复制代码
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... 

在后面条件可以加入ASC或者DESC;其中ASC是默认的升序,DESC是降序。

实例:

复制代码
create table info (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));

insert into ky29 values(1,'liuyi',80,'beijing',2);
insert into ky29 values(2,'wangwu',90,'shengzheng',2);
insert into ky29 values(3,'lisi',60,'shanghai',4);
insert into ky29 values(4,'tianqi',99,'hangzhou',5);
insert into ky29 values(5,'jiaoshou',98,'laowo',3);
insert into ky29 values(6,'hanmeimei',10,'nanjing',3);
insert into ky29 values(7,'lilei',11,'nanjing',5);

select * from info;
升序查询id,名字和成绩,条件是成绩
select id,name,score from info order by score;
降序查询id,名字和成绩,条件是成绩
select id,name,score from info order by score desc;

order by 可以结合where进行条件过滤

复制代码
根据成绩倒序查询,条件是杭州
select name,score from info where address='hangzhou' order by score desc;

order by 可以进行多字段查询,每个字段可以选择各自的排序方式

复制代码
查询学生信息先按兴趣id降序排列,相同分数的,id也按降序排列
select id,name,hobbid from info order by hobbid desc,id desc;

查询学生信息先按兴趣id降序排列,相同分数的,id按升序排列
select id,name,hobbid from info order by hobbid desc,id;

(2),区间判断及查询不重复记录

and/or 且/或

复制代码
查询成绩在70和90之间的,包括90
select * from info where score >70 and score <=90;

查询成绩小于70或者大于等于90的
select * from ky19 where score >70 or score <=90;

嵌套+多条件

复制代码
查询成绩大于70或者成绩在75与90之间的
select * from info where score >70 or (score >75 and score <90);

多条件从左到右若有先生效的条件则后面的条件不会执行

distinct 查询不重复条件

复制代码
select distinct 字段 from 表名﹔

去重查询info表中hobbid项
select distinct hobbid from info;

对结果进行分组

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

复制代码
按照hobbid相同的分组,然后计算分组的学生个数
select count(name),hobbid from info group by hobbid;

筛选分数大于80的学生根据hobbid进行分组,计算学生个数
select count(name),hobbid from info where score>=80 group by hobbid;

结合order by把计算出的学生个数按升序排列
select count(name),score,hobbid from info where score>=80 group by hobbid order by count(name) asc;

限制结果输出条目

limit 限制输出的结果记录

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

复制代码
SELECT column1, column2, ... FROM table_name LIMIT [offset,] number

LIMIT 的第一个参数是位置偏移量(可选参数),是设置 MySQL 从哪一行开始显示。 如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,第一条记录的 位置偏移量是 0,第二条是 1,以此类推。第二个参数是设置返回记录行的最大数目。

查询所有信息显示前4行记录
select * from info limit 3;

从第4行开始,往后显示3行内容
select * from info limit 3,3;

结合order by语句,按id的大小升序排列显示前三行
select id,name from info order by id limit 3;

设置别名

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

复制代码
对于列的别名:SELECT column_name AS alias_name FROM table_name;
对于表的别名:SELECT column_name(s) FROM table_name AS alias_name;

列别名示例:
select i.name as 姓名,i.score as 成绩 from info as i;
查询info表的字段数量,以number显示
select count(*) as number from info;
mysql> select count(*) number from info;

使用场景:
1、对复杂的表进行查询的时候,别名可以缩短查询语句的长度
2、多表相连查询的时候(通俗易懂、减短sql语句)

此外,AS 还可以作为连接语句的操作符。

创建t1表,将info表的查询记录全部插入t1表
create table t1 as select * from info;
select * from t1;

as在这次作为连接语句的作用:
1、创建了一个新表t1 并定义表结构,插入表数据(与info表相同)
2、但是"约束"没有被完全"复制"过来 #但是如果原表设置了主键,那么附表的:default字段会默认设置一个0

通配符

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

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

%:百分号表示零个、一个或多个字符 *

_:下划线表示单个字符

复制代码
查询名字是c开头的记录
select id,name from info where name like 'c%';

查询名字里是c和i中间有一个字符的记录
mysql> select id,name from info where name like 'c_ic_i';

查询名字中间有g的记录
mysql> select id,name from info where name like '%g%';

查询tang后面3个字符的名字记录
mysql> select id,name from info where name like 'tang___';

通配符"%"和"_"不仅可以单独使用,也可以组合使用

查询名字以s开头的记录
mysql> select id,name from info where name like 's%_';

子查询

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

PS: 子语句可以与主语句所查询的表相同,也可以是不同表

复制代码
查询80分以上学生的名字和id(括号中的语句会先执行,把执行结果给前面的语句进行操作)
select name,score from info where id in (select id from info where score >80);

多表查询
create table t1(id int);
insert into t1 values(1),(2),(3);
select id,name,score from info where id in (select id from t1);


子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用
<表达式> [NOT] IN <子查询>

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

查询分数大于80的记录
select name,score from info where id in (select id from info where score>80);

子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其 他的表中。

将t1里的记录全部删除,重新插入info表的记录
insert into t1 select * from info where id in (select id from info);

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

将caicai的分数改为50
update info set score=50 where id in (select * from ky30 where id=2);

DELETE 也适用于子查询

删除分数大于80的记录
delete from info where id in (select id where score>80);

在 IN 前面还可以添加 NOT,其作用与IN相反,表示否定(即不在子查询的结果集里面)

删除分数不是大于等于80的记录
delete from t1 where id not in (select id where score>=80);

EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE

查询如果存在分数等于80的记录则计算info的字段数
select count(*) from info where exists(select id from info where score=80);

查询如果存在分数小于50的记录则计算info的字段数,info表没有小于50的,所以返回0
select count(*) from info where exists(select id from info where score<50);

二,视图

数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射。视图可以理解为镜花水月/倒影,动态保存结果集(数据 )。视图可以优化操作,强化安全,做到针对不同的权限提供不同结果集的表。

视图适合于多表连接浏览时使用!不适合增、删、改。而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率。

视图和表的区别:

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

②、视图没有实际的物理记录。而表有。

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

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

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

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

视图和表的联系:

视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。

复制代码
创建视图
create view v_score as select * from t14 where score>=80;

查看表状态
show table status\G;

查看视图
select * from v_score;

查看视图与源表结构
mysql> desc v_score;

#创建一个视图,需要输出id、学生姓名、分数以及年龄
创建test01表
create table test01 (id int,name varchar(10),age char(10));
insert into test01 values(1,'zhangsan',20);
insert into test01 values(2,'lisi',30);
insert into test01 values(3,'wangwu',29);

create view v_info(id,name,score,age) as select info.id,info.name,info.score,test01.age from info,test01 where info.name=test01.name;

修改原表数据
update info set score='60' where name='liuyi';
查看视图
select * from v_score;

通过视图修改原表
update v_score set score='120' where name='tianqi';
select * from v_score;

修改表不能修改以函数、复合函数方式计算出来的字段。

查询方便、安全性。

查询方便:索引速度快、同时可以多表查询更为迅速(视图不保存真实数据,视图本质类似select)。

安全性:我们实现登陆的账户是root ------》所拥有权限 ,视图无法显示完整的约束。

相关推荐
陈卓41011 分钟前
MySQL-主从复制&分库分表
android·mysql·adb
IT项目管理44 分钟前
达梦数据库DMHS介绍及安装部署
linux·数据库
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
大春儿的试验田1 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
Ein hübscher Kerl.1 小时前
虚拟机上安装 MariaDB 及依赖包
数据库·mariadb
长征coder2 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
醇醛酸醚酮酯2 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
ladymorgana2 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui2 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
GreatSQL社区3 小时前
用systemd管理GreatSQL服务详解
数据库·mysql·greatsql