sql高阶语句

目录

按照关键字排序

order by

asc|desc

结合where使用

order by 多字段排序

区间判断

and / or (且/或)

嵌套

distinct  去重  

group by  分组

结合where使用

结合order by 使用

 聚合函数使用

limit 限制结果条数

alias 别名

使用空格 代替as

作为连接语句的操作符

通配符

子查询

配合insert使用

配合update使用

配合delete使用

not

exists

子查询别名

视图

视图和表的区别和联系

单表视图

多表视图

视图和表之间的联系

null

内连接,左,右连接

内连接

左,右连接

存储过程

查看存储过程具体信息

通过传参调用存储过程



按照关键字排序

order by

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

select 字段1,字段2,..... from 表名  order by 字段1,字段2,...;

asc|desc

asc:升序排列,你的select语句如果没有指定排序方式,则默认升序显示

desc:降序排列。

结合where使用

order by 多字段排序

order by 语句可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,order by 后面跟多个字段时,字段之间使用逗号(英文逗号)隔开

区间判断

and / or (且/或)

and /or 常用于 where  条件 

嵌套

distinct  去重  

distinct 不查询重复记录,注意distinct 只能作用于开头,放在其他位置报错

group by  分组

通过对sql查询的结果,还可以对其进行分组,使用group by 语句来实现,group by 通常配合聚合函数来使用 常用的聚合函数  计数(count)  求和(sum)平均数(avg)最大值(max) 最小值(min) ,group by 分组的时候可以按一个或多个字段的结果进行分组处理

结合where使用

结合order by 使用

 聚合函数使用

 count  计数

sum  求和

avg 求平均数

max 最大值

min(最小值)

limit 限制结果条数

limit 限制输出的结果记录

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

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

alias 别名

alias (as) 别名

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

表别名.字段名:这里的.字段名是  表别名对于的表内的  字段名
 

使用空格 代替as

作为连接语句的操作符

使用as作为表连接符,插入数据(无法复制主键等)

也可以使用where 插入部分数据

通配符

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

通常通配符都是跟 LIKE(模糊搜索) 一起使用的,并协同 WHERE 子句共同来完成查询任务。

常用的通配符有两个,分别是:

%:百分号表示零个、一个或多个字符          
_ : 下划线表示单个任意字符                                

%和_组合使用

子查询

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

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

in 用来判断某个值是否在给定的结果集中,通常结合子查询来使用

格式:select 字段1,字段2,... from 表名 where  字段  [not] in  (查询语句);

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

配合insert使用

配合update使用

将biao2表内的id=5的score修改成99

配合delete使用

删除biao2表内 score小于80的数据

在进行增删改操作时,使用自身做子查询可能会导致一些问题。这是因为在进行增删改操作时,数据库会对被操作的表进行锁定,以保证数据的一致性和完整性。而如果在子查询中使用了相同的表,就会导致表被重复锁定,可能引发死锁或者其他并发问题。

not

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


exists

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

子查询别名

select * from 表名 此为标准格式,而以上的查询语句,"表名"的位置其实是一个完整结果集,mysql并不能直接识别,而此时给与结果集设置一个别名,以”select a.id from a“的方式查询将此结果集视为一张"表",就可以正常查询数据了,如下:

视图

数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射
视图可以理解为镜花水月/倒影,动态保存结果集(数据)

作用场景:针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)

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

视图和表的区别和联系

区别:
视图是已经编译好的sql语句。而表不是

视图没有实际的物理记录。而表有。
show table status\G

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

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

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

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

联系:

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

单表视图

多表视图

所谓多表视图,就是在多个表内取数据,组成视图

视图和表之间的联系

视图修改数据,表也会随之改变,反之,亦是如此

null

在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。需要注意 的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。

在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是 NULL 值

null值与空值的区别(空气与真空)
空值长度为0,不占空间,NULL值的长度为null,占用空间
is null无法判断空值
空值使用"=“或者”<>"来处理(!=)
count()计算时,NULL会忽略,空值会加入计算

判断是否为空,不为空

内连接,左,右连接

内连接

MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表

语法

SELECT 字段1,字段2,...FROM 表1 INNER JOIN 表2 ON  表1.字段名 = 表2.字段名;

(两个字段名的内容要能对上)

左,右连接

左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配

左连接和右连接之间的区别,就是表内容的展示的区别。 

左连接 左表内容为主,顺带展示右表符合条件的内容,没有内容则显示null

右连接 右表内容为主,顺带展示左表符合条件的内容,没有内容则显示null

存储过程

介绍:存储过程是一组为了完成特定功能的SQL语句集合。  两个点 第一 触发器(定时任务) 第二个判断 


存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高

语法

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
<过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句
[ IN | OUT | INOUT ] <参数名><类型>
 

> delimiter $$   临时将 结束符号改成 $$
mysql> create procedure proc()     创建存储过程 名为proc
    -> begin                                         过程体以关键字 BEGIN 开始
    -> create table biao11 (id int,name char(10),score int);
    -> insert into biao11 values(1,'emmm',9);      过程体语句
    -> select * from biao11;
    -> end$$                                    
DELIMITER ;                             过程体以关键字 END 结束 

delimiter ;    将语句的结束符号恢复为分号

查看存储过程具体信息

show create procdurc [数据库.] 存储过程名

通过传参调用存储过程

修改存储过程
ALTER PROCEDURE <过程名>[<特征>... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES sQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。

DROP PROCEDURE IF EXISTS Proc;

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值