Mysql ---- SQL高级查询

  • 连接查询
    • 内连接
    • 外连接
  • 数据库函数
    • 数学函数
    • 聚合函数(给数据表用的)
    • 字符串函数(字符串用''格式)
    • 日期时间函数
  • 存储过程
    • 创建存储过程
      • 创建存储过程中的传递参数的介绍
      • 存储过程中的过程体的判断语句
    • 修改存储过程
    • 删除存储过程

连接查询

内连接

  • 内连接 :两张或多张表中同时符合某种条件的数据记录组合
  • from 子句中使用 inner join 关键字连接多张表,并使用 on 设置连接条件
  • 是系统默认的表连接方式,可以省略 inner 关键字
  • 多表支持连续使用 inner join,建议不超过三个表
语法结构:
select 字段名1,字段名2 from 表名1 inner join 表名2 on 表名1.字段名 = 表名2.字段名;示例:
select info.id,info.name from info inner join num on info.id=num.id;

外连接

  • 也称为左外连接、右外连接
  • 在 from 子句中使用 left join 关键字来表示左连接;使用 right join 关键字来表示右连接
  • 匹配左表中所有行及右表中符合条件的行
  • 以左边为主表,左表会完全展现出来,右表只有符合条件的行才会被展现
示例:左外连接
select info.id,info.name,hob.hob_name from info left join hob on info.hobby=hob.id;示例:右外连接
select info.id,info.name,hob.hob_name from info right join hob on info.hobby=hob.id;

数据库函数

  • 常用的函数分类:数学函数、聚合函数、字符串函数、日期时间函数

数学函数

abs(x)   :返回x的绝对值                   例:select abs(-10);       返回值为10
rand()   :返回0到1的随机数                  例: select rand();         返回值为任意不为1的数,只能无限接近1,但永远不为1
mod(x,y)   :返回x除以y以后的余数               例:select mod(7,2);       返回值为 余数1
power(x,y)   :返回x的y次方               例:select power(2,3);          返回值为 8
round(x)   :返回离x最近的整数              例:select round(1.4);   返回值为1 ;    select round(1.5);   返回值为2     ;        select round(1.48);    返回值为1
round(x,y)   :保留x的y位小数四舍五入后的值          例:select round(1.49,2);   返回值位1.49 ;       select round(1.4449,3);    返回值为1.445
sqrt(x)   :返回x的平方根           例:select sqrt(9);    返回值为3   ;      select sqrt(8);     开平方不满足整数,返回值为 小数
truncate(x,y)   :返回数字x截断为y位小数的值           例:select truncate(1.4449,3);       只保留小数点后3位,多余的丢弃,返回值为1.444
ceil(x)   :返回大于或等于x的最小整数              例:select ceil(1.1);       向上取整最小整数,要比1大,返回值为2
floor(x)   :返回小于或等于x的最大整数              例:select floor(x);           向下取最大整数,要比1小,返回值为1
greatest(x1,x2...)   :返回集合中最大的值
least(x1,x2)   :返回集合中最小的值函数嵌套:
随机输出1-100 :select ceil(rand()*100);
取余0、1、2     :select mod(ceil(rand()*100),3);

聚合函数(给数据表用的)

avg()   :返回指定列的平均值              例:select avg(score) from info;      统计info表中socre字段中数据的平均值
count()   :返回指定列中非null值的个数            例:select count(2);        返回值为 统计2 只有1个,不能为多个数字;         select count(name) from info;    统计info表中name列的个数;
min()   :返回指定列的最小值               例:select min(score) from info;           统计info表中socre字段中数据最低的那个人
max()   :返回指定列的最大值               例:select max(score) from info;        统计info表中socre字段中数据最高的那个人
sum()   :返回指定列的所有值值和           例: select sum(score) from info;      统计info表中socre字段中数据的总和函数嵌套:
查看表中成绩最高的三个人  :select score from where 1=1 order by score desc;       ###其中 where 也可以不用写

字符串函数(字符串用’'格式)

length(x)   :返回字符串x的长度           例:select length('abc');   返回值为3       ;       select length(' abc');     返回值为4   ;
trim()   :返回去除指定格式的值           例:select trim(' abc');        返回值为 abc   ;去除空格
concat(x,y)   :将提供的参数x和y拼接成一个字符串          例:select length(concat('abc','def'));       返回值为abcdef
upper(x)   :将字符串x的所有字母变成大写字母           例:select upper('acd');     返回值为 ABC
lower(x)   :将字符串x的所有字母变成小写字母           例:select lower('YdB');      返回值为 ydb
left(x,y)   :返回字符串x的前y个字符            例:select left('abc',3);     返回值为 abc   ;从左往右数3个
right(x,y)   :返回字符串x的后y个字符         例:mysql> select right('abcdef',3);       返回值为 def   ;从右往左数3个
repeat(x,y)   :将字符串x重复y次            例:select repeat('abc',3);    返回值为 abc abc abc
space(x)   :返回x个空格          例:select length(space(3));       返回值 为3,因为返回的空格不可见,所以增添长度函数配合使用
replace(x,y,z)   :将字符串z替代字符串x中的字符串y         例:select replace('abcdf','ab','cd');       返回值为cdcdf  ;将cd 替换字符串abcdf 中的 ab
strcmp(x,y)   :比较x和y,返回的值可以为-1,0,1           例:select strcmp(4,5);     返回值为-1 ;(5,5)  返回值为0  ; (6,5)  返回值为1
substring(x,y,z)   :获取从字符串x中的第y个位置开始长度为z的字符串           例:select substring('abcdefg',5,2);      返回值为ef   ;从字符串abcdefg的第5个位置开始取2个长度的字符
reverse(x)   :将字符串x反转            例:select reverse('mnbv');       返回值为 vbnm示例:
##length(x) :
select length('');        返回值为0
select length(null);        返回值为null
select length('null');          返回值为4
select length(' abc ');         返回值为5##trim():
select length(trim(' abc '))         返回值为3             ####去头尾空格
select length(trim(' a bc '))         返回值为4            ####不去中间空格##concat(x,y):
select length(concat('abc','def'));         返回值为6##space(x):
select concat('a',space(3),'b');        返回值为 | a   b                    |          ####并不是很方便

日期时间函数

curdate()   :返回当前时间的年月日
curtime()   :返回当前时间的时分秒
now()    :返回当前时间的日期和时间month(x)   :返回日期 x 中的月份值(从你输入的'年月日'中判断是几月份,注意是字符串)
week(x)   :返回日期 x 是年度第几个星期(从你输入的'年月日'中判断是第几周,注意是字符串)
hour(x)   :返回 x 中的小时值(从你输入的'时间'中判断是第几个小时,注意是字符串)minute(x)   :返回 x 中的分钟值(从你输入的'时间'中判断是第几分钟)
second(x)    :返回 x 中的秒钟值(从你输入的'时间'中判断是第几秒钟)dayofweek(x)   :返回 x 是星期几,1表示星期日,2表示星期一(显示的数字减一,为当前是星期几)
dayofmonth(x)   :计算日期 x 是本月的第几天
dayofyear(x)   :计算日期 x 是本年的第几天示例:
mysql> select curdate(),curtime(),now();
+------------+-----------+---------------------+
| curdate()  | curtime() | now()               |
+------------+-----------+---------------------+
| 2020-10-18 | 15:34:31  | 2020-10-18 15:34:31 |
+------------+-----------+---------------------+mysql> select month('2020-10-18'),week('2020-10-18'),hour('15:46');
+---------------------+--------------------+---------------+
| month('2020-10-18') | week('2020-10-18') | hour('15:46') |
+---------------------+--------------------+---------------+
|                  10 |                 42 |            15 |
+---------------------+--------------------+---------------+mysql> select hour(now());                ####可以做函数嵌套
+-------------+
| hour(now()) |
+-------------+
|          15 |
+-------------+mysql> select minute(now()),second(now());
+---------------+---------------+
| minute(now()) | second(now()) |
+---------------+---------------+
|            55 |            22 |
+---------------+---------------+mysql> select dayofweek(now());              ####1表示星期日
+------------------+
| dayofweek(now()) |
+------------------+
|                1 |
+------------------+mysql> select dayofweek(now()),dayofmonth(now()),dayofyear(now());            ####星期日,今月的第几天,今年的第几天
+------------------+-------------------+------------------+
| dayofweek(now()) | dayofmonth(now()) | dayofyear(now()) |
+------------------+-------------------+------------------+
|                1 |                18 |              292 |
+------------------+-------------------+------------------+

存储过程

存储过程的优点:
1、存储过程执行一次后,生成的二进制代码就驻留在缓冲区,之后如果再次调用的话,将直接掉用二进制代码
使得存储过程的执行效率和性能得到大幅提升。2、存储过程是SQL语句加上控制语句的集合,有很强的灵活性,可以完成复杂的运算。3、存储过程在服务器端,客户端调用时,直接在服务器端执行,客户端只是传输的调用语句,从而可以降低网络负载。4、存储过程被创建后,可以多次重复调用,它将多条SQL封装到了一起,可随时针对SQL语句进行修改,不影响调用它的客户端。5、存储过程可以完成所有的数据库操作,也可以通过编程的方式控制数据库的信息访问权限。6、增强数据库的安全性

创建存储过程

存储过程语法格式:
create procedure 过程名([过程参数[....]]) 过程体                 ####过程体就是 begin到 end $$ 之间的内容过程参数 :in   、out  、 inout
格式:
(过程参数 参数名 类型)要创建存储过程,必须要具有 create routine 权限show procedure status;             ####查看数据库中有哪些存储过程
show create procedure 存储过程名         ####查看某个存储过程的具体信息一、示例:(不带过程参数的)查看player表中三条数据use 数据库名;delimiter $$
create procedure playerRole()
begin
select id,name,level from player limit 3;
end $$
delimiter ;             ####delimiter后面加空格;
call playerRole();二、示例:(带过程参数的)查看info表中的zhangsan这条纪录
use 数据库名;mysql> desc info;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(5)      | NO   | PRI | NULL    |       |
| name  | varchar(50) | YES  |     |         |       |
| addr  | varchar(50) | NO   |     | NULL    |       |
| socre | varchar(48) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)mysql> delimiter $$
mysql> create procedure cok(in a varchar(50))-> begin-> select id,name,socre from info where name=a;-> end $$
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
mysql> call cok('zhangsan');            #####call cok('name字段下的某个名字');
+----+----------+-------+
| id | name     | socre |
+----+----------+-------+
| 12 | zhangsan | 100   |
+----+----------+-------+
1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)

创建存储过程中的传递参数的介绍

  • in 输入参数 :表示调用者向过程传入值(传入值可以时字面量或变量)
  • out 输出参数 :表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • inout 输入输出参数 :既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
##in 输入参数
示例:
mysql> delimiter $$
mysql> create procedure lll(in n int)-> begin-> select a;-> set a=5;-> select a;-> end $$
mysql> delimiter ;
mysql> set @a=10;
mysql> call lll(5);
+------+
| n    |
+------+
|    5 |
+------+
1 row in set (0.00 sec)+------+
| n    |
+------+
|    5 |
+------+
1 row in set (0.00 sec)以上可以看出,a 在存储过程中被修改,但并不影响 a 的值,因为前者为局部变量,后者为全局变量##out 输出参数
示例:
mysql> delimiter $$
mysql> create procedure lt(out f int)-> begin-> select f;-> set a=5;-> select f;-> end $$
mysql> delimiter ;
mysql> call lt(@f);           ####用 out 过程参数 call的时候必须要带变量符号@
+------+
| f    |
+------+
| NULL |                                ####因为out是向调用者输出参数,不接收输入的参数,所以存储过程 f 为 NULL
+------+
1 row in set (0.00 sec)+------+
| f    |
+------+
|    5 |
+------+
1 row in set (0.00 sec)##inout 输入输出参数
示例:
mysql> delimiter $$
mysql> create procedure utf(inout ppd int)-> begin-> select ppd;-> set ppd=5;-> select ppd;-> end $$
mysql> delimiter ;
mysql> set @ppd=1;            ####用 inout 过程参数时,它可以接收输入的参数,不过需要给它定义一个全局变量
mysql> call utf(@ppd);+------+
|   ppd  |
+------+
|      1    |
+------+
1 row in set (0.00 sec)+------+
|  ppd  |
+------+
|     5    |
+------+
1 row in set (0.00 sec)

存储过程中的过程体的判断语句

一、条件语句

1)if-then;else 语句
示例:
mysql> delimiter $$
mysql> create procedure btup(in a int)-> begin-> declare var int;            ####在存储过程内申明变量,类型(局部变量,只作用在内部)-> set var=a+1;           ###给 var 赋值-> if var=0 then             ####如果 var=0,则插入17-> insert into t values(17);-> end  if;-> if a=0 then              ####如果 a=0,则修改 t 表中 s1+1-> update t set s1=s1+1;-> else                    ####否则修改 t 表中 s1+2-> update t set s1=s1+2;-> end if;-> end $$
mysql> delimiter ;2)case 语句
示例:
mysql> delimiter $$
mysql> create procedure potp(in a int)-> begin-> declare var int;-> set var=a+1;-> case var                   ####case var这个变量-> when 0 then             ####当0时,插入17;当1时插入18;否则插入19-> insert into t values(17)-> when 1 then-> insert into t values(18)-> else-> insert into t values(19)-> end case;-> end $$
mysql> delimiter ;

二、循环语句

1)while ... end while
示例:
mysql> delimiter $$
mysql> create procedure dftp(in a int)-> begin-> declare b int;-> set b=0;-> while a<10 do-> insert into t values(a,b)-> set a=a+1                 ####不设置这个变量就死循环-> set b=b+2-> end while;-> end $$
mysql> delimiter ;
mysql> call dftp(1);

修改存储过程

  • 存储过程的修改分为特征的修改和业务内容的修改
语法结构:
alter procedure 过程名(特征 ...)存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程

删除存储过程

语法结构:
drop procedure 过程名;
1、需要注意的是:存储过程名称后面没有参数列表,也没有括号。
2、在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致与之关联的存储过程无法运行。示例:
mysql> drop procedure cok;
Query OK, 0 rows affected (0.00 sec)mysql> call cok('zhangsan');
ERROR 1305 (42000): PROCEDURE bbs.cok does not exist

最后提醒一句,生产环境下修改、删除存储过程是一件很危险的事情,一定要慎重抉择!!!!


数据库中SQL高阶查询到此结束,感谢浏览.

Mysql 数据库 -------- SQL语句进阶查询 ------- 后部分相关推荐

  1. Mysql数据库——sql语句进阶

    SQL语句进阶 1.查询字段: ----查询所有字段 select * from 表名; ----查询指定字段 select 字段名,字段名- from 表名; ----多数据表连接查询时 selec ...

  2. mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...

  3. PHP获取MySQL执行sql语句的查询时间

    PHP获取MySQL执行sql语句的查询时间 1. $t1=microtime(true); mysql_query($sql); echo microtime(true)-$t1; 2. //计时开 ...

  4. MysQL高级SQL语句|进阶语句|select语句(一)【图文细解】

    MysQL高级SQL语句 一.SQL语句的概述 SELECT DISTINCT WHERE AND.OR IN BETWEEN 通配符 LIKE ORDER BY GROUP BY HAVING 二. ...

  5. Java菜鸟补给站---MySQL数据库 SQL 语句补充( 一 )

    目录 SQL 语句 truncate 语句 不属于DML语句 1>作用 截断名 2>语法: truncate table 表名 3>和 delete 语句的区别 对于自增长字段,使用 ...

  6. MySQL数据库---SQL语句优化及性能优化

    文章目录 mysql的架构图 mysql的执行过程 sql语句执行计划 索引失效的情况 mysql性能调优: 分库分表 读写分离---主从复制 mysql的架构图 大致分为4层:连接层.服务层.引擎层 ...

  7. python调用mysql数据库sql语句过长有问题吗_python连接MYSQL数据库,调用update语句后无法更新数据,解决...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. mysql数据库sql语句大全

    mysql sql语句大全 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql se ...

  9. Mysql数据库Sql语句执行效率-Explain

    为什么80%的码农都做不了架构师?>>>    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语 ...

最新文章

  1. 重磅!AMD350亿美金收购赛灵思,「苏妈」终于出手啦!
  2. 关于MySQL内核,一定要知道的!
  3. 一个比较简单、非常简单的计算器
  4. 兼容单片机的CRC32查表计算程序的C语言实现
  5. 大数据创业难度大 五个值得关注的重点
  6. 「 每日一练,快乐水题 」2006. 差的绝对值为 K 的数对数目
  7. 【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得
  8. python pandas csv 追加 空行,python – Pandas:read_csv在空行后忽略行
  9. C语言、嵌入式重点知识:回调函数
  10. 计算机关机键桌面,电脑桌面按钮关机关不了怎么办? 爱问知识人
  11. 合并表格中同一列中相同的内容
  12. spark 部署方式
  13. 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
  14. 基于Python的贪吃蛇游戏设计
  15. JAVA观察者模式(买彩票案例)
  16. RGB与YIQ的转换
  17. Windows 更新错误 0x80073712
  18. 【基金申报】研究目标、内容、方案之间的区别,一文全了解
  19. java uc_UC浏览器Java通用版本uc Java通用版本java通用版本浏览器uc7
  20. 8583报文MAC验证实现过程

热门文章

  1. 三星S8/S8+ 解决微信消息不亮屏
  2. Windows Update失败 还原更改。请勿关闭计算机
  3. 学Linux到底学什么?未来职业到底是怎么样的?
  4. 精细化财务管理案例-蒙牛
  5. 身份证处理工具类(java)
  6. 51nod 1215 数组的宽度
  7. 蓝桥杯单片机CT107D AT24C02
  8. UML状态图 几种状态图
  9. java pattern 手机号_业余草 Java正则表达式,验证手机号和电话号码
  10. ec20 复位命令_EC20模块开启SIM卡热插拔及重启模块AT命令