简介

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

外连接:分为左连接和右连接。

左外连接就是以左表为准,去匹配右表,左表有多少条数据,结果就是多少条数据。左表有的数据正常显示,右表没有的数据就用NULL显示。

mysql> create table chengji(id int(3) not null primary key auto_increment,age int(3) not null,name varchar(64) not null,scrore decimal(4,1));
mysql> insert into chengji(age,name,scrore) values(17,'zhangsan',60),(18,'lisi',70),(18,'wangwu',80),(17,'zhaoliu',95),(19,'tianqi',55);
mysql> select * from chengji;
+----+-----+----------+--------+
| id | age | name     | scrore |
+----+-----+----------+--------+
|  1 |  17 | zhangsan |   60.0 |
|  2 |  18 | lisi     |   70.0 |
|  3 |  18 | wangwu   |   80.0 |
|  4 |  17 | zhaoliu  |   95.0 |
|  5 |  19 | tianqi   |   55.0 |
+----+-----+----------+--------+
5 rows in set (0.00 sec)

mysql> create table sushe(id int(3) not null primary key,num int(3) not null);
mysql> insert into sushe values(1,305),(2,306),(3,307),(8,308),(9,309),(10,310);
mysql> select * from sushe;
+----+-----+
| id | num |
+----+-----+
|  1 | 305 |
|  2 | 306 |
|  3 | 307 |
|  8 | 308 |
|  9 | 309 |
| 10 | 310 |
+----+-----+
6 rows in set (0.00 sec)

内连接
mysql> select * from chengji c inner join sushe s on c.id=s.id;
+----+-----+----------+--------+----+-----+
| id | age | name     | scrore | id | num |
+----+-----+----------+--------+----+-----+
|  1 |  17 | zhangsan |   60.0 |  1 | 305 |
|  2 |  18 | lisi     |   70.0 |  2 | 306 |
|  3 |  18 | wangwu   |   80.0 |  3 | 307 |
+----+-----+----------+--------+----+-----+
3 rows in set (0.00 sec)

左连接
mysql> select * from chengji c left join sushe s on c.id=s.id;
+----+-----+----------+--------+------+------+
| id | age | name     | scrore | id   | num  |
+----+-----+----------+--------+------+------+
|  1 |  17 | zhangsan |   60.0 |    1 |  305 |
|  2 |  18 | lisi     |   70.0 |    2 |  306 |
|  3 |  18 | wangwu   |   80.0 |    3 |  307 |
|  4 |  17 | zhaoliu  |   95.0 | NULL | NULL |
|  5 |  19 | tianqi   |   55.0 | NULL | NULL |
+----+-----+----------+--------+------+------+
5 rows in set (0.00 sec)

右连接
mysql> select * from chengji c right join sushe s on c.id=s.id;
+------+------+----------+--------+----+-----+
| id   | age  | name     | scrore | id | num |
+------+------+----------+--------+----+-----+
|    1 |   17 | zhangsan |   60.0 |  1 | 305 |
|    2 |   18 | lisi     |   70.0 |  2 | 306 |
|    3 |   18 | wangwu   |   80.0 |  3 | 307 |
| NULL | NULL | NULL     |   NULL |  8 | 308 |
| NULL | NULL | NULL     |   NULL |  9 | 309 |
| NULL | NULL | NULL     |   NULL | 10 | 310 |
+------+------+----------+--------+----+-----+
6 rows in set (0.00 sec)

MySQL的存储过程

1.简介:

  • 是一组为了完成特定功能的SQL语句集合
  • 比传统SQL速度更快,执行效率更高

存储过程的优点

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

2.创建存储过程

  • 使用CREATE PROCEDURE语句创建存储过程
  • 创建存储过程的语法结构
    CREATE PROCEDURE <过程名> (过程参数[…])<过程体> [过程参数[…]] 格式 [IN|OUT|INOUT] <参数名> <类型>

3.参数分为

  • 输入参数:IN
  • 输出参数:OUT
  • 输入/输出参数:INOUT

4.存储过程的主体部分,被称为过程体
5.以BEGIN开始,以END结束,若只有一条SQL语句
6.以DELIMITER开始和结束
7.存储过程

mysql> delimiter $$
mysql> create procedure a()
    -> begin
    -> select * from chengji limit 3;
    -> end $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call a();
+----+-----+----------+--------+------+
| id | age | name     | scrore | num  |
+----+-----+----------+--------+------+
|  1 |  17 | zhangsan |   60.0 | NULL |
|  2 |  18 | lisi     |   70.0 | NULL |
|  3 |  18 | wangwu   |   80.0 | NULL |
+----+-----+----------+--------+------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> delimiter $$
mysql> create procedure p(in num1 int,out num2 int,inout num3 int)
    -> begin
    -> select num1,num2,num3;
    -> set num1=10,num2=20,num3=30;
    -> select num1,num2,num3;
    -> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call p(@num1,@num2,@num3);
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
|    1 | NULL |    3 |
+------+------+------+
1 row in set (0.00 sec)

+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
|   10 |   20 |   30 |
+------+------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
in和inout参数会将全局变量的值传入存储过程中,而out参数不会将全局变量的值传入存储过程中,在全局过程使用中,参数值in、out、inout都会发生改变


mysql> select @num1,@num2,@num3;
+-------+-------+-------+
| @num1 | @num2 | @num3 |
+-------+-------+-------+
|     1 |    20 |    30 |
+-------+-------+-------+
1 row in set (0.00 sec)
调用完存储过程后,发现in参数不会对全局变量的值引起变化,而out和inout参数调用完存储过程后,会对全局变量的值产生变化,会将存储过程引用后的值赋值给全局变量,in参数赋值类型可以是变量还有定值,而out和inout参数赋值类型必须是变量

8.修改存储过程

  • 存储过程的修改分为特征修改和内容修改
  • 特征修改的方法
    ALTER PROCEDURE <过程名> [<特征>…]
  • 内容修改可先删除原有存储过程,之后再创建方法

9、删除存储过程

  • 删除存储过程的语法
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>
  • 删除的过程
mysql> drop procedure a;
mysql> call a();
ERROR 1305 (42000): PROCEDURE score.a does not exist