MySQL高级语句

目录

select

select---显示表中一个或多个字段

distinct---不显示重复的数据记录

where---有条件查询

in---显示已知的值得数据记录

between---显示两个值范围内的数据记录

[order by---关键字排序](#order by---关键字排序)

函数

数学函数:

聚合函数:

count函数

字符串行数

字符串的拼接contact

截取字符串substr

字符串的拼接||

去除指定格式的值trim

查看字符长度length

字符串替换replace

[group by](#group by)

having

子查询---连接表格

连接查询

右连接

左连接

内连接

内连接一

内连接二

union---联集

union

交集值

内连接

左连接

右连接

内查询

无交集值

存储过程

删除存储过程

存储过程的控制语句

[(1)条件语句if-then-else ···· end if](#(1)条件语句if-then-else ···· end if)

[(2)循环语句while ···· end while](#(2)循环语句while ···· end while)

正则表达式

视图

创建视图

删除视图


select

select---显示表中一个或多个字段

语法:SELECT "字段" FROM "表名";

select store_name,sales from store_info;

distinct---不显示重复的数据记录

语法:SELECT DISTINCT "字段" FROM "表名";

where---有条件查询

语法:SELECT "字段" FROM "表名" WHERE "条件";

in---显示已知的值得数据记录

语法:SELECT "字段" FROM "表名" WHERE "字段" IN ('值1', '值2', ...);

between---显示两个值范围内的数据记录

语法:SELECT "字段" FROM "表名" WHERE "字段" IN ('值1', '值2', ...);

order by---关键字排序

语法:SELECT "字段" FROM "表名" [WHERE "条件"] ORDER BY "字段" [ASC, DESC];

函数

数学函数:

abs(x) 返回 x 的绝对值
rand() 返回 0 到 1 的随机数
mod(x,y) 返回 x 除以 y 以后的余数
power(x,y) 返回 x 的 y 次方
round(x) 返回离 x 最近的整数
round(x,y) 保留 x 的 y 位小数四舍五入后的值
sqrt(x) 返回 x 的平方根
truncate(x,y) 返回数字 x 截断为 y 位小数的值
ceil(x) 返回大于或等于 x 的最小整数
floor(x) 返回小于或等于 x 的最大整数
greatest(x1,x2...) 返回集合中最大的值,也可以返回多个字段的最大的值
least(x1,x2...) 返回集合中最小的值,也可以返回多个字段的最小的值

聚合函数:

avg() 返回指定列的平均值
count() 返回指定列中非 NULL 值的个数
min() 返回指定列的最小值
max() 返回指定列的最大值
sum(x) 返回指定列的所有值之和

count函数

创建表

count(*) 包括了所有的列的行数,全表扫描在统计结果的时候,不会忽略列值为 NULL
count(列名) 只包括列名那一列的行数,在统计结果的时候,会忽略列值为 NULL 的行

字符串行数

trim() 返回去除指定格式的值
concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
substr(x,y) 获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同
substr(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
length(x) 返回字符串 x 的长度
replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
upper(x) 将字符串 x 的所有字母变成大写字母
lower(x) 将字符串 x 的所有字母变成小写字母
left(x,y) 返回字符串 x 的前 y 个字符
right(x,y) 返回字符串 x 的后 y 个字符
repeat(x,y) 将字符串 x 重复 y 次
space(x) 返回 x 个空格
strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
reverse(x) 将字符串 x 反转

字符串的拼接contact

SELECT concat(字段1, 字段2) FROM 表名 [WHERE 字段名 = '字段值'];

截取字符串substr

字符串的拼接||

SELECT 字段名 || 字段名 FROM 表名 [WHERE 字段名 = '字段值'];

SELECT Region || Store_Name FROM location;

#将location表的Region与Store_Name字段的值连接起来

SELECT Region || ' ' || Store_Name FROM location WHERE Store_Name = 'Boston';

#将location表中的Store_Name为Boston的Region与Store_Name字段的值连接起来,且字段之间可以加空格

去除指定格式的值trim

  1. SELECT TRIM ([ [位置] [要移除的字符串] FROM ] 字符串);

  2. #[位置]:的值可以为 LEADING (起头), TRAILING (结尾), BOTH (起头及结尾)。

  3. #[要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串。缺省时为空格。

查看字符长度length

字符串替换replace

group by

GROUP BY有两个作用为汇总与分组

对GROUP BY后面的字段的查询结果进行汇总分组,通常是结合聚合函数一起使用的
GROUP BY 有一个原则,凡是在 GROUP BY 后面出现的字段,必须在 SELECT 后面出现;
凡是在 SELECT 后面出现的、且未在聚合函数中出现的字段,必须出现在 GROUP BY 后面

语法:SELECT "字段1", SUM("字段2") FROM "表名" GROUP BY "字段1";

having

  • 用来过滤由 GROUP BY 语句返回的记录集,通常与 GROUP BY 语句联合使用
  • HAVING 语句的存在弥补了 WHERE 关键字不能与聚合函数联合使用的不足。
复制代码
语法:SELECT "字段1", SUM("字段2") FROM "表格名" GROUP BY "字段1" HAVING (函数条件);

子查询---连接表格

在WHERE 子句或 HAVING 子句中插入另一个 SQL 语句
语法:SELECT "字段1" FROM "表格1" WHERE "字段2" [比较运算符] #外查询
(SELECT "字段1" FROM "表格2" WHERE "条件"); #内查询
#可以是符号的运算符,例如 =、>、<、>=、<= ;也可以是文字的运算符,例如 LIKE、IN、BETWEEN

连接查询

  • inner join(内连接):只返回两个表中联结字段相等的行
  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录

右连接

左连接

内连接

内连接一

内连接二

union---联集

union

交集值

内连接

左连接

右连接

内查询

无交集值

存储过程

存储过程是一组为了完成特定功能的SQL语句集合。

存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。

存储过程的优点:

1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率

2、SQL语句加上控制语句的集合,灵活性高

3、在服务器端存储,客户端调用时,降低网络负载

4、可多次重复被调用,可随时修改,不影响客户端调用

5、可完成所有的数据库操作,也可控制数据库的信息访问权限

创建存储过程

DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)

CREATE PROCEDURE p_1() #创建存储过程,过程名为Proc,不带参数

-> BEGIN #过程体以关键字 BEGIN 开始

-> select * from Store_Info; #过程体语句

-> END $$ #过程体以关键字 END 结束

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

调用存储过程

CALL Proc;

查看存储过程

SHOW CREATE PROCEDURE [数据库.]存储过程名; #查看某个存储过程的具体信息

SHOW CREATE PROCEDURE Proc;

SHOW PROCEDURE STATUS [LIKE '%Proc%'] \G #查看存储过程状态

存储过程的参数

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

IN 输入参数

OUT 输出参数

INOUT 输入输出参数

删除存储过程

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

DROP PROCEDURE IF EXISTS Proc; #仅当存在时删除,不添加 IF EXISTS 时,如果指定的过程不存在,则产生一个错误

存储过程的控制语句

(1)条件语句if-then-else ···· end if

(2)循环语句while ···· end while

正则表达式

视图

视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。

临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。

语法:CREATE VIEW "视图表名" AS "SELECT 语句";

CREATE VIEW V_REGION_SALES AS SELECT A.Region REGION,SUM(B.Sales) SALES FROM location A

INNER JOIN Store_Info B ON A.Store_Name = B.Store_Name GROUP BY REGION;

创建视图

删除视图

SELECT * FROM V_REGION_SALES;

DROP VIEW V_REGION_SALES;

在创建视图表时,后面的select语句所查询的字段原表中的字段 时,视图表中的数据是可以修改的;

若在创建视图表时,后面的select语句所查询的字段 是通过聚合函数处理过的或被处理过的数据 ,视图表中的数据是不可以修改

相关推荐
一 乐4 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
鹏码纵横4 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
美林数据Tempodata5 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数
野槐6 小时前
node.js连接mysql写接口(一)
数据库·mysql
Zzzone6836 小时前
PostgreSQL日常维护
数据库·postgresql
chxii6 小时前
1.13使用 Node.js 操作 SQLite
数据库·sqlite·node.js
冰刀画的圈6 小时前
修改Oracle编码
数据库·oracle
这个胖子不太裤6 小时前
Django(自用)
数据库·django·sqlite
麻辣清汤7 小时前
MySQL 索引类型及其必要性与优点
数据库·mysql
2501_915374358 小时前
Neo4j 图数据库安装教程(2024最新版)—— Windows / Linux / macOS 全平台指南
数据库·windows·neo4j