Mysql之连接查询&&聚合函数

连接查询

MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。
首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接
环境准备

#创建
mysql> create table xiaohei (b_id int(10) default null,b_name varchar(15) default null,b_level int(10) default null);
Query OK, 0 rows affected (0.00 sec)
#插入信息
mysql> insert into xiaobai values (1,'一加',10);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaobai values (2,'二加',20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaobai values (3,'三加',30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaobai values (4,'四加',40);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaohei values (2,'二加',20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaohei values (3,'三加',30);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaohei values (5,'五加',50);
Query OK, 1 row affected (0.00 sec)

mysql> insert into xiaohei values (6,'六加',60);
Query OK, 1 row affected (0.00 sec)

mysql> select * from xiaobai;
+------+--------+---------+
| a_id | a_name | a_level |
+------+--------+---------+
|    1 | 一加   |      10 |
|    2 | 二加   |      20 |
|    3 | 三加   |      30 |
|    4 | 四加   |      40 |
+------+--------+---------+
4 rows in set (0.00 sec)

mysql> select * from xiaohei;
+------+--------+---------+
| b_id | b_name | b_level |
+------+--------+---------+
|    2 | 二加   |      20 |
|    3 | 三加   |      30 |
|    5 | 五加   |      50 |
|    6 | 六加   |      60 |
+------+--------+---------+
4 rows in set (0.00 sec)

inner join内连接

只返回两个表中联接字段相等的行
语法:SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段;
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
内连接
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。
通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。

mysql> select a_id,a_name,a_level from xiaobai a inner join xiaohei b on a.a_id=b.b_id;
+------+--------+---------+
| a_id | a_name | a_level |
+------+--------+---------+
|    2 | 二加   |      20 |
|    3 | 三加   |      30 |
+------+--------+---------+
2 rows in set (0.00 sec)

外连接(left左连接,right右连接)

左连接

左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。
左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
左表的记录会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL。

#左连接
mysql> select * from xiaobai left join xiaohei on a_name=b_name;
+------+--------+---------+------+--------+---------+
| a_id | a_name | a_level | b_id | b_name | b_level |
+------+--------+---------+------+--------+---------+
|    2 | 二加   |      20 |    2 | 二加   |      20 |
|    3 | 三加   |      30 |    3 | 三加   |      30 |
|    1 | 一加   |      10 | NULL | NULL   |    NULL |
|    4 | 四加   |      40 | NULL | NULL   |    NULL |
+------+--------+---------+------+--------+---------+
4 rows in set (0.00 sec)

右连接

右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。
右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足。

#右连接
mysql> select * from xiaobai right join xiaohei on a_name=b_name;
+------+--------+---------+------+--------+---------+
| a_id | a_name | a_level | b_id | b_name | b_level |
+------+--------+---------+------+--------+---------+
|    2 | 二加   |      20 |    2 | 二加   |      20 |
|    3 | 三加   |      30 |    3 | 三加   |      30 |
| NULL | NULL   |    NULL |    5 | 五加   |      50 |
| NULL | NULL   |    NULL |    6 | 六加   |      60 |
+------+--------+---------+------+--------+---------+
4 rows in set (0.00 sec)

数据库函数

数学函数

数据库内存储的记录,经常要进行一系列的算术操作,所以 MySQL 支持很多数学函数。 常用的数学函数如表所示

把mysql 中的表导出为excel格式

数学函数			                   描述
abs(x)			                返回 x 的绝对值
rand()			                返回 01 的随机数
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…)	                返回集合中最小的值
#5的绝对值
mysql> select abs(-5);
+---------+
| abs(-5) |
+---------+
|       5 |
+---------+
1 row in set (0.00 sec)
#0-1的随机数(0<=x<1) 返回 0 到 1 的随机数
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.6677741489073021 |
+--------------------+
1 row in set (0.00 sec)
#搭配运算符
mysql> select rand()*10;
+-------------------+
| rand()*10         |
+-------------------+
| 6.347451262499626 |
+-------------------+
1 row in set (0.00 sec)
#3除以2取余
mysql> select mod(3,2);
+----------+
| mod(3,2) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
#3的3次方
mysql> select power(3,3);
+------------+
| power(3,3) |
+------------+
|         27 |
+------------+
1 row in set (0.00 sec)
#最接近2的数值
mysql> select round(2.15);
+-------------+
| round(2.15) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)
#取2.345的后一位,四舍五入
mysql> select round(2.345,1);
+----------------+
| round(2.345,1) |
+----------------+
|            2.3 |
+----------------+
1 row in set (0.00 sec)
。。。不做案例了,自行看文案

聚合函数

MySQL 数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数。

聚合函数	描述
avg()	返回指定列的平均值
count()	返回指定列中非 NULL 值的个数
min()	返回指定列的最小值
max()	返回指定列的最大值
sum(x)	返回指定列的所有值之和
#求小白表中的level的和
mysql> select sum(a_level) from xiaobai;
+--------------+
| sum(a_level) |
+--------------+
|          100 |
+--------------+
1 row in set (0.00 sec)
#返回小白表中的id字段数
mysql> select count(a_id) from xiaobai;
+-------------+
| count(a_id) |
+-------------+
|           4 |
+-------------+
1 row in set (0.00 sec)
#返回小白表中level最大字段数
mysql> select max(a_level) from xiaobai;
+--------------+
| max(a_level) |
+--------------+
|           40 |
+--------------+
1 row in set (0.00 sec)
#返回小白表中level平均值
mysql> select avg(a_level) from xiaobai;
+--------------+
| avg(a_level) |
+--------------+
|      25.0000 |
+--------------+
1 row in set (0.00 sec)

字符串函数

字符串函数		描述
length(x)		返回字符串 x 的长度
trim()			返回去除指定格式的值
concat(x,y)		将提供的参数 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 个空格
replace(x,y,z)	将字符串 z 替代字符串 x 中的字符串 y
strcmp(x,y)		比较 x 和 y,返回的值可以为-1,0,1
substring(x,y,z)	获取从字符串 x 中的第 y 个位置开始长 度为 z 的字符串
reverse(x)		将字符串 x 反转
#length(x) 返回字符串 x 的长度
mysql> select length('qwer');
+----------------+
| length('qwer') |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)
#空格也占用一个字符
mysql> select length('qwe r');
+-----------------+
| length('qwe r') |
+-----------------+
|               5 |
+-----------------+
1 row in set (0.00 sec)
#去除空字符
mysql> select trim('   hello');
+------------------+
| trim('   hello') |
+------------------+
| hello            |
+------------------+
1 row in set (0.00 sec)
#拼接成一个字符串
mysql> select concat('qwe','er');
+--------------------+
| concat('qwe','er') |
+--------------------+
| qweer              |
+--------------------+
1 row in set (0.00 sec)
#小写变大写
mysql> select upper('qwe');
+--------------+
| upper('qwe') |
+--------------+
| QWE          |
+--------------+
1 row in set (0.00 sec)
#大写变小写
mysql> select lower('AAA');
+--------------+
| lower('AAA') |
+--------------+
| aaa          |
+--------------+
1 row in set (0.00 sec)
#返回字符串 qwert 的前 2 个字符
mysql> select left('qwert',2);
+-----------------+
| left('qwert',2) |
+-----------------+
| qw              |
+-----------------+
1 row in set (0.00 sec)
#返回字符串 qwert 的后 2 个字符
mysql> select right('qwert',2);
+------------------+
| right('qwert',2) |
+------------------+
| rt               |
+------------------+
1 row in set (0.00 sec)
。。。自行操作下面的

日期时间函数

字符串函数		描述
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();
+------------+
| curdate()  |
+------------+
| 2021-10-29 |
+------------+
1 row in set (0.00 sec)
#显示当前时间
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 18:56:26  |
+-----------+
1 row in set (0.00 sec)
#显示当前完整时间
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2021-10-29 18:57:19 |
+---------------------+
1 row in set (0.00 sec)
#显示当前月份
mysql> select month('2021.10.29');
+---------------------+
| month('2021.10.29') |
+---------------------+
|                  10 |
+---------------------+
1 row in set (0.00 sec)
#显示当前第几周
mysql> select week('2021.10.29');
+--------------------+
| week('2021.10.29') |
+--------------------+
|                 43 |
+--------------------+
1 row in set (0.01 sec)
。。。后期自己操作

存储过程

概述
前面学习的 MySQL 相关知识都是针对一个表或几个表的单条 SQL 语句,使用这样的SQL 语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条 SQL 语句一起去处理才能够完成,这时候就可以使用存储过程, 轻松而高效的去完成这个需求,有点类似shell脚本里的函数

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

开发人员
存储过程在数据库中创建并保存,它不仅仅是 SQL 语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。

存储过程的优点:

(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
(2)SQL语句加上控制语句的集合,灵活性高
(3)在服务器端存储,客户端调用时,降低网络负载
(4)可多次重复被调用,可随时修改,不影响客户端调用
(5)可完成所有的数据库操作,也可控制数据库的信息访问权限

语法:
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
<过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句
[ IN | OUT | INOUT ] <参数名><类型>
##创建存储过程##
DELIMITER $$							#将语句的结束符号从分号;临时改为两个$$(可以自定义)
CREATE PROCEDURE Proc()					#创建存储过程,过程名为Proc,不带参数
-> BEGIN								#过程体以关键字 BEGIN 开始
-> create table mk (id int (10), name char(10),score int (10));
-> insert into mk values (1, 'wang',13);
-> select * from mk;			        #过程体语句
-> END $$								#过程体以关键字 END 结束
DELIMITER ;								#将语句的结束符号恢复为分号
##调用存储过程##
CALL Proc();

I    存储过程的主体都分,被称为过程体
II   以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
III  以DELIMITER开始和结束
mysgl>DEL工M工TER $$      $$是用户自定义的结束符 
省略存储过程其他步骤
mysql>DELIMITER ;  分号前有空格

mysql> use cat #进库
Database changed 
mysql> DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以自定义)
mysql> CREATE PROCEDURE Proc() #创建存储过程,过程名为Proc,不带参数
    ->  BEGIN #过程体以关键字 BEGIN 开始
    -> create table mk (id int (10), name char(10),score int (10));
    ->  insert into mk values (1, 'wang',13);
    ->  select * from mk;   #过程体语句
    ->  END $$   #过程体以关键字 END 结束
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER  ;  #将语句的结束符号恢复为分号
mysql> call proc();
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    1 | wang |    13 |
+------+------+-------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)
##查看存储过程##
格式:
SHOW CREATE PROCEDURE [数据库.]存储过程名;		#查看某个存储过程的具体信息
mysql> show create procedure proc\G
*************************** 1. row ***************************
           Procedure: proc
            sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER="root"@"localhost" PROCEDURE "proc"()
BEGIN 
create table mk (id int (10), name char(10),score int (10));
 insert into mk values (1, 'wang',13);
 select * from mk;
 END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
#查看存储过程
SHOW PROCEDURE STATUS 

#查看指定存储过程信息
mysql> mysql> SHOW PROCEDURE STATUS like '%proc%'\G
*************************** 1. row ***************************
                  Db: cat
                Name: Proc
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2021-10-29 19:32:52
             Created: 2021-10-29 19:32:52
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

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

即表示调用者向过程传入值,又表示过程向调用者传出值(只能是变量)


举例:
mysql> delimiter @@
mysql> create procedure proc (in inname varchar(40))     #行参
    -> begin
    -> select * from info where name=inname;
    -> end @@
mysql> delimiter @@			
mysql> call proc2('wangwu');              #实参
+--------+-------+---------+
| name   | score | address |
+--------+-------+---------+
| wangwu | 80.00 | beijing |
+--------+-------+---------+
1 row in set (0.00 sec)




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


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

DROP PROCEDURE IF EXISTS Proc;

Guess you like

Origin blog.csdn.net/xiaobai316/article/details/121034099