目录
一、按关键字查询排序
1.按单字段排序
示例一:按单字段升序
示例二:按单字段降序
示例三:结合WHERE字句进行条件过滤
2.按多字段排序
示例一:按照学号和兴趣排序
示例二:按照地址和学号排序
3.区间判断及查询不重复记录
示例一:区间判断查询
示例二:查询不重复信息
二、对结果进行分组查询
示例一:按hobbid相同的分组,计算相同分数的学生个数
示例二: 结合where语句,筛选分数大于等于80的分组,计算学生个数
示例三:结合order by把分数大于等于80的学生计算出来并按升序排序
三、限制结果条目
示例一:查询所有信息显示前4行记录
示例二:从第4行开始,往后显示3行内容
示例三: 结合order by语句,按id的大小升序排列显示前三行
示例四:输出查询信息的最后3行(先降序排序)
四、设置别名
示例一: 查询info表的字段数量,以number显示
示例二:AS还可以作为连接语句的操作符
五、通配符
示例一: 查询名字是c开头的记录
示例二:查询名字里是c和i中间有一个字符的记录
示例三:查询名字中间有g的记录
示例四:查询tang后面3个字符的名字记录
示例五:通配符“%”和“_”不仅可以单独使用,也可以组合使用
六、子查询
示例一:select查询
示例二:IN 用来判断某个值是否在给定的结果集中
示例三:insert 语句
示例四:update 语句
示例五:delete 语句
示例六:exists 判断语句
示例七:别名as
七、视图
1.什么是MySQL视图
2.视图的特点和作用
3.视图和表的区别
4.视图和表的联系
5.视图操作
5.1创建视图
5.2修改数据
5.3删除视图
八、NULL值
九、连接查询
1.内连接
2.左连接
3.右连接
一、按关键字查询排序
前言:
我们常用的查询有(增、删、改、查),除了基本的查询外,有时候需要对查询的结果进行处理
今天我们将一块来学习MySQL的高级SQL语句
1.按单字段排序
在MySQL中,可以使用ORDER BY子句对查询结果进行排序。该语句可以按照一个或多个字段进行升序(ASC)或降序(DESC)排序
语法结构
SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
ASC和DESC
ASC:是按照升序进行排序的,是默认的排序方式,即ASC可以省略。SELECT 语句中如果没有指定具体的排序方式,则默认按ASC方式进行排序
DESC:是按降序方式进行排列。当然ORDER BY前面也可以使用WHERE子句对查询结果进一步过滤
环境准备:新建表并插入表数据
登录mysql数据库
mysql -u root -p123进入kgc数据库
use kgc;新建表
create table ky37 (id char(3) not null,name varchar(15) not null primary key,score decimal(4,2),address varchar(50) not null,hobbid char(3) not null);插入表数据,来进行查询
insert into ky37 values (1,'cxc','66','江苏南京',5);
insert into ky37 values (2,'xyk','97','江苏徐州',3);
insert into ky37 values (3,'xw','82','江苏泰州',2);
insert into ky37 values (4,'jjg','45','江苏无锡',3);
insert into ky37 values (5,'jhw','77','江苏宿迁',2);
insert into ky37 values (6,'wjh','92','江苏南京',1);
示例一:按单字段升序
按分数排序,默认不指定是升序排序
select id,name,score from ky37 order by score;
示例二:按单字段降序
分数按降序排列
select id,name,score from ky37 order by score desc;
示例三:结合WHERE字句进行条件过滤
结合WHERE进行条件过滤,筛选地址是南京的学生按分数降序排序
select name,score from ky37 where address='南京' order by score desc;
2.按多字段排序
示例一:按照学号和兴趣排序
查询信息先按兴趣降序排列,相同分数的,id也按降序排列
select id,name,hobbid from ky37 order by hobbid desc,id desc;
示例二:按照地址和学号排序
查询信息先按id降序排列,相同地址的,分数按升序排列
select id,name,address,hobbid from ky37 order by id desc,score;
3.区间判断及查询不重复记录
示例一:区间判断查询
筛选出分数在(70< x <=90)分的信息
select * from ky37 where score >70 and score <=90;
筛选出分数(x >70或x <=90)的信息
select * from ky37 where score >70 or score <=90;
嵌套/多条件判断
筛选出分数(x >70或75< x < 90)的信息
select * from ky37 where score >70 or (score >75 and score <90);
示例二:查询不重复信息
使用distinct语句
语法格式:
select distinct 字段 from 表名﹔
select distinct hobbid from ky37;
二、对结果进行分组查询
前言:
通过SQL查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理
语法格式
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;
示例一:按hobbid相同的分组,计算相同分数的学生个数
select count(name),hobbid from ky37 group by hobbid
示例二: 结合where语句,筛选分数大于等于80的分组,计算学生个数
select count(name),hobbid from ky37 where score>=80 group by hobbid;
示例三:结合order by把分数大于等于80的学生计算出来并按升序排序
select count(name),score,hobbid from ky37 where score>=80 group by hobbid order by count(name) asc;
三、限制结果条目
前言:
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句
语法格式
SELECT column1, column2, ... FROM table_name LIMIT [offset,] number
示例一:查询所有信息显示前4行记录
select * from ky37 limit 3;
示例二:从第4行开始,往后显示3行内容
select * from ky37 limit 3,3;
示例三: 结合order by语句,按id的大小升序排列显示前三行
select id,name from ky37 order by id limit 3;
示例四:输出查询信息的最后3行(先降序排序)
select id,name from ky37 order by id desc limit 3;
四、设置别名
前言:
在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性
语法格式
对于列的别名:
SELECT column_name AS alias_name FROM table_name;
对于表的别名:
SELECT column_name(s) FROM table_name AS alias_name;
示例一: 查询info表的字段数量,以number显示
select count(*) as number from ky37;
示例二:AS还可以作为连接语句的操作符
创建t1表,将info表的查询记录全部插入t1表
create table t1 as select * from ky37;
select * from t1;
五、通配符
前言:
通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。
通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务
示例一: 查询名字是c开头的记录
select id,name from ky37 where name like 'c%';
示例二:查询名字里是c和i中间有一个字符的记录
select id,name from ky37 where name like 'c_ic_i';
示例三:查询名字中间有g的记录
select id,name from ky37 where name like '%g%';
示例四:查询tang后面3个字符的名字记录
select id,name from ky37 where name like 'tang___';
示例五:通配符“%”和“_”不仅可以单独使用,也可以组合使用
查询名字以s开头的记录
select id,name from info where name like 's%_';
六、子查询
前言:
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤
示例一:select查询
单表查询
elect name,score from ky37 where id多表查询
create table kgc(id int);
insert into kgc values(1),(2),(3);
select id,name,score from ky37 where id in (select id from kgc);
示例二:IN 用来判断某个值是否在给定的结果集中
查询分数大于80的记录
select name,score from ky37 where id in (select id from ky37 where score>80);
示例三:insert 语句
将t1里的记录全部删除,重新插入ky37表的记录
insert into t1 select * from info where id in (select id from ky37);
示例四:update 语句
将xyk的分数改为100
update info set score=100 where id in (select * from ky37 where id=2);
select * from ky37;
示例五:delete 语句
删除分数大于80的记录
delete from t1 where id in (select id where score>80);删除分数不是大于等于80的记录
delete from t1 where id not in (select id where score>=80);
示例六:exists 判断语句
查询如果存在分数等于80的记录则计算ky37的字段数
select count(*) from ky37 where exists(select id from ky37 where score=80);查询如果存在分数小于50的记录则计算info的字段数,info表没有小于50的,所以返回0
select count(*) from ky37 where exists(select id from ky37 where score<50);
示例七:别名as
将结果集作为一张表进行查询的时候,需要用到别名
select id,name from (select id,name from ky37) a;
七、视图
1.什么是MySQL视图
视图(View)是MySQL中的一种虚拟表,基于SQL查询的结果集。它不像普通表那样存储数据,视图只是存储了查询逻辑,当你查询视图时,MySQL会执行这个查询并返回结果。因此,视图相当于一种对数据库表的“过滤”或“投影”,可以简化复杂查询、提升安全性和可重用性
2.视图的特点和作用
特点:
1. 虚拟表:视图并不存储实际数据,只存储一个SQL查询定义。查询视图时,MySQL会动态执行查询
2. 简化复杂查询:可以将复杂的SQL查询封装成视图,使得后续查询变得简单
3. 数据安全:通过视图,可以限制用户只能访问某些列或某些记录,而不是直接访问整个表的数据
4. 可复用性:视图提供了对底层数据的抽象,使查询逻辑可以被多次复用,减少重复代码作用:
1.简化复杂查询:视图可以将复杂的 `JOIN`、子查询等操作封装起来,后续查询只需调用视图即可
2.数据隔离:通过创建只包含部分字段或行的视图,可以隔离敏感数据,控制用户能看到的内容
3.增强安全性:通过给用户权限只访问视图,而不是底层表,限制用户只能获取特定的业务数据
4.抽象与封装:通过视图,业务逻辑可以与底层表结构隔离,哪怕底层表结构发生变化,只要视图的查询逻辑不变,使用者不会受到影响
3.视图和表的区别
1. 定义与存储:
视图:是一个基于SQL查询的虚拟表,是已经编译好的SQL语句。它不存储实际的数据,只存储查询逻辑
表:是数据库中存储实际数据的结构,包含行和列,并占用物理存储空间2. 物理记录:
视图:没有实际的物理记录,执行视图查询时,会动态生成结果集
表:有物理记录,数据实际存储在表中,可以直接进行CRUD(创建、读取、更新、删除)操作3. 空间占用:
视图:不占用物理空间,它是逻辑上的概念,所占用的空间主要是定义和存储视图的SQL语句
表:占用物理空间,因为它实际存储数据4. 修改:
表:可以直接通过SQL语句(如`INSERT`、`UPDATE`、`DELETE`)进行修改
视图:不能直接修改,必须通过原始表进行更新,只有在满足特定条件时,视图也可以是可更新的5. 安全性:
视图:提供了一种安全机制,可以隐藏基本表的复杂性和敏感信息。用户通过视图访问数据而不直接接触基本表
表:是直接存储数据的结构,用户可以直接查询和修改,通常需要更多的权限管理6. 模式归属:
表:是全局模式中的实体,属于实际数据存储的结构
视图:是局部模式的虚拟表,依赖于基础表的结构和数据7.影响范围:
视图的创建和删除仅影响视图本身,而不影响基础表的结构
对于可更新的视图,视图中所做的任何数据更新将会影响到对应的基本表
4.视图和表的联系
1. 数据来源:
视图是在基本表之上创建的,它的结构(列)和内容(数据行)都源于基础表。视图是基于基本表的逻辑表示2. 依赖关系:
视图依赖于基础表的存在,一旦基础表被删除,视图也将无效
视图可以涉及一个或多个基础表,可以通过JOIN查询将多个表的数据组合成一个视图3. 逻辑关系:
视图为基础表提供了一个逻辑上的抽象,简化了复杂查询的使用,可以将复杂的SQL查询封装为简单的视图4. 数据访问:
用户可以通过视图查询数据,就像查询普通表一样。这使得视图在数据访问层中起到了重要的作用,可以隐藏底层的复杂性
5.视图操作
5.1创建视图
分数大于等于80的学生展示在视图中
create view v_score as select * from ky37 where score>=80;查看视图
select * from v_score;
5.2修改数据
可以通过视图修改原表
update v_score set score='82' where name='xw';
5.3删除视图
语法格式
drop view [if exists] 视图名;
drop view v_score;
八、NULL值
在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失的值,也就是在表中该字段是没有值的
如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL
需要注意的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有值的。在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是 NULL 值
九、连接查询
1.内连接
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
语法格式
select 表1[2].字段1,表1[2].字段2,... from 表1 inner join 表2 on 表1.同名字段=表2.同名字段;SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
2.左连接
左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行
语法格式
select * from 表1 left join 表2 on 表1.同名字段=表2.同名字段;select * from info left join infos on info.name=infos.name;
3.右连接
右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
语法格式
select * from 表1 right join 表2 on 表1.同名字段=表2.同名字段;select * from info right join infos on info.name=infos.name;