目录
一、子查询
1.1多表查询
1.2多层嵌套
1.3 insert语句子查询
1.4update语句子查询
1.5delete语句子查询
1.6EXISTS
1.7子查询,别名as
二、mysql视图
2.1mysql视图介绍
2.2mysql作用场景[图]:
2.3视图功能:
2.4视图和表的区别和联系
区别:
联系:
2.5创单表建视图
2.6多表创建视图
2.7修改视图数据与原表数据
2.7.1修改原表数据
2.7.2修改视图数据
7.3视图表中的数据是否能修改?(重点)
2.8删除视图
2.9NULL 值
2.9.1 count()计算时,NULL会忽略,空值会加入计算
2.9.2is null无法判断空值
2.9.3空值使用"=“或者”<>"来处理(!=)
三、连接查询⭐⭐⭐
3.1内连接 inner join
3.2左连接 left join
3.3右连接 right join
四、存储过程⭐⭐⭐
4.1概述
4.2存储过程介绍
4.3存储过程的优点
4.4存储过程语法
4.5调用存储过程
4.6查看存储过程
4.7存储过程的参数
4.8修改存储过程
4.9删除存储过程
一、子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
子查询:内查询、嵌套查询
是指一个查询语句中,还嵌套着另一个查询语句子查询(括号里的)优先于主查询
可以在相同表和不同表之间进行查询in 用来关联主表和子表(主查询和子查询)⭐⭐语法:in用来判断某个值是否在给定的 结果集 中,通常结合子查询使用示例:
select name,score from info where id in (select id from info where score >80);
主语句:select name,score from info where id
子语句(集合): select id from info where score >80
PS:子语句中的sql语句是为了,最后过滤出一个结果集,用于主语句的判断条件
子语句可以与主语句所查询的表相同,也可以是不同表
子查询:
select 字段1,字段2,... from 表1 where 条件字段 in (select 条件字段 from 表2 where 表达式);
插入:
insert into 表1 select * from 表2 where 条件字段 in (select 条件字段 from 表3);
更新:
update 表1 set 新表达式 where 条件字段 in (select 条件字段 from 表2 where 表达式);
删除:
delete from 表1 where 条件字段 in (select 条件字段 where 表达式);
关键字查询:
select 聚合函数(*) from 表1 where exists (select 字段 from 表2 where 表达式);
子查询别名:(假设定义表别名为a)
select a.字段1,a.字段2,... from (select 字段1,字段2,... from 表) a;
1.1多表查询
mysql> create table beixin (id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into beixin values(1,'zsc');
Query OK, 1 row affected (0.00 sec)
mysql> insert into beixin values(1,'zsc');
Query OK, 1 row affected (0.00 sec)mysql> select * from beixin; #beixin表
+------+------+
| id | name |
+------+------+
| 1 | zsc |
+------+------+
1 row in set (0.00 sec)mysql> select * from qhua; #qhua表
+----+------+-------+-----------+-------+---------+
| id | name | score | address | phone | hobbyid |
+----+------+-------+-----------+-------+---------+
| 7 | gwx | 15.00 | shenzheng | 64611 | 1 |
| 4 | khui | 79.00 | beijing | 66322 | 3 |
| 2 | lss | 90.00 | haidian | 44446 | 2 |
| 1 | sbk | 99.00 | tongzhou | 33333 | 2 |
| 6 | wql | 55.00 | xian | 64622 | 5 |
| 3 | xzz | 80.00 | qinghuay | 6666 | 3 |
| 8 | ym | 35.00 | shenzheng | 65653 | 1 |
| 5 | zgq | 66.00 | xian | 64622 | 5 |
+----+------+-------+-----------+-------+---------+
8 rows in set (0.00 sec)
①先准备两张表:
②两表查询:
⭐⭐ in: 将主表和子表关联/连接的语法
1.2多层嵌套
子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。
在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。
(1)语法IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用
语法:
<表达式> [NOT] IN <子查询>当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。 若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的
在 IN 前面还可以添加 NOT,其作用与IN相反,表示否定(即不在子查询的结果集里面)
查询分数大于等于90的记录
两表查询:
select id,name,score from qhua where name in (select name from haha3 where score >=99);
mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| beike |
| beixin |
| haha |
| haha2 |
| haha3 |
| qhua |
+-------------------+
6 rows in set (0.00 sec)mysql> select * from haha3;
+----+------+-------+----------+-------+---------+
| id | name | score | address | phone | hobbyid |
+----+------+-------+----------+-------+---------+
| 2 | lss | 90.00 | haidian | 44446 | 2 |
| 1 | sbk | 99.00 | tongzhou | 33333 | 2 |
+----+------+-------+----------+-------+---------+
2 rows in set (0.00 sec)mysql> select * from qhua;
+----+------+-------+-----------+-------+---------+
| id | name | score | address | phone | hobbyid |
+----+------+-------+-----------+-------+---------+
| 7 | gwx | 15.00 | shenzheng | 64611 | 1 |
| 4 | khui | 79.00 | beijing | 66322 | 3 |
| 2 | lss | 90.00 | haidian | 44446 | 2 |
| 1 | sbk | 99.00 | tongzhou | 33333 | 2 |
| 6 | wql | 55.00 | xian | 64622 | 5 |
| 3 | xzz | 80.00 | qinghuay | 6666 | 3 |
| 8 | ym | 35.00 | shenzheng | 65653 | 1 |
| 5 | zgq | 66.00 | xian | 64622 | 5 |
+----+------+-------+-----------+-------+---------+
8 rows in set (0.00 sec)mysql> select id,name,score from qhua where id in (select id from haha3 where score >=99);
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | sbk | 99.00 |
+----+------+-------+
1 row in set (0.00 sec)mysql> select id,name,score from qhua where name in (select name from haha3 where score >=99);
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | sbk | 99.00 |
+----+------+-------+
1 row in set (0.01 sec)mysql>
子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其 他的表中
1.3 insert语句子查询
三表查询:
insert into haha3 select * from qhua where id in (select id from beixin);
1.4update语句子查询
UPDATE 语句也可以使用子查询。UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列。
update haha3 set score=50 where id in (select id from qhua where id=2);
1.5delete语句子查询
DELETE 也适用于子查询
删除分数小于60的记录
确认数据后,再确认,然后进行删除,也可以在删除前,做备份哦
1.6EXISTS
EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE
exists 用于判断子查询的结果集是否为空;如果不为空,则返回 TRUE;反之,则返回 FALSE(0)例:
select count(score) from haha3 where exists(select id from haha3 where score> 90 );
#查询如果存在分数大于90的记录则计算haha3的字段数
select count(score) from haha3 where exists(select id from haha3 where score < 90 );
#查询如果存在分数小于90的记录则计算haha3的字段数;
查询如果存在分数大于90的记录则计算haha3的字段数
查询如果存在分数小于90的记录则计算haha3的字段数,haha3表中没有小于90的,所以返回0
1.7子查询,别名as
子查询,别名as
#查询info表id,name 字段
select id,name from info;
以上命令可以查看到info表的内容#将结果集做为一张表进行查询的时候,我们也需要用到别名,示例:
需求:从info表中的id和name字段的内容做为"内容" 输出id的部分
mysql> select id from (select id,name from info);
ERROR 1248 (42000): Every derived table must have its own alias
#此时会报错,原因为:
select * from 表名 此为标准格式,而以上的查询语句,"表名"的位置其实是一个完整结果集,mysql并不能直接识别,而此时给与结果集设置一个别名,以”select a.id from a“的方式查询将此结果集视为一张"表",就可以正常查询数据了,如下:
select a.id from (select id,name from info) a;
相当于
select info.id,name from info;
select 表.字段,字段 from 表;
二、mysql视图
2.1mysql视图介绍
- 视图:优化操作+安全方案 ⭐⭐
- 视图数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射
- 视图可以理解为镜花水月/倒影,动态保存结果集(数据)
2.2mysql作用场景[图]:
针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)
2.3视图功能:
- 简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
- 本质而言视图是一种select(结果集的呈现)
视图适合于多表连接浏览时使用!不适合增、删、改
而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率!
2.4视图和表的区别和联系
区别:
①视图是已经编译好的sql语句。而表不是
②视图没有实际的物理记录。而表有。
show table status\G
③表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
④视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
⑤表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表
⑥视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)
联系:
- 视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。
- 一个视图可以对应一个基本表,也可以对应多个基本表。
- 视图是基本表的抽象和在逻辑意义上建立的新关系
#创建视图(单表)
create view 视图名 as select * from 表名 where score>=80;create view v_qhua as select * from info where score>=80;#查看表状态
show table status\G#查看视图
select * from v_qhua;#查看视图与源表结构
desc v_qhua;
desc qhua; v_qhua视图名 看以什么字段创建,也可以用分数创建视图 v_score
视图表的作用是记录select语句
创建视图语法:create view 视图表名 as select 语句;
删除视图语法:drop view 视图表名;
保存的是select查询的结果,插入数据时要视图表与原表结构相同才可以插入,否则会报错
2.5创单表建视图
需求:满足80分的学生展示在视图中
PS:这个结果会动态变化,同时可以给不同的人群(例如权限范围)展示不同的视图
mysql> desc qhua;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(3) | NO | | NULL | |
| name | varchar(8) | NO | PRI | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| hobbyid | int(6) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)mysql> create view v_qhua as select * from qhua where score >=80; #创建视图
Query OK, 0 rows affected (0.00 sec)mysql> select * from v_qhua; #查看视图
+----+------+-------+----------+-------+---------+
| id | name | score | address | phone | hobbyid |
+----+------+-------+----------+-------+---------+
| 2 | lss | 90.00 | haidian | 44446 | 2 |
| 1 | sbk | 99.00 | tongzhou | 33333 | 2 |
| 3 | xzz | 80.00 | qinghuay | 6666 | 3 |
+----+------+-------+----------+-------+---------+
3 rows in set (0.00 sec)
mysql> show table status\G; #查看表状态
*************************** 1. row ***************************Name: beikeEngine: InnoDBVersion: 10Row_format: DynamicRows: 3Avg_row_length: 5461Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-03-28 14:42:51Update_time: 2024-03-28 14:44:42Check_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options: Comment:
*************************** 2. row ***************************Name: beixinEngine: InnoDBVersion: 10Row_format: DynamicRows: 2Avg_row_length: 8192Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-03-28 14:49:46Update_time: 2024-03-28 14:51:04Check_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options: Comment:
*************************** 3. row ***************************Name: hahaEngine: InnoDBVersion: 10Row_format: DynamicRows: 8Avg_row_length: 2048Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-03-27 10:52:36Update_time: NULLCheck_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options: Comment:
*************************** 4. row ***************************Name: haha2Engine: InnoDBVersion: 10Row_format: DynamicRows: 8Avg_row_length: 2048Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-03-27 11:02:34Update_time: NULLCheck_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options: Comment:
*************************** 5. row ***************************Name: haha3Engine: InnoDBVersion: 10Row_format: DynamicRows: 1Avg_row_length: 16384Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-03-27 11:07:25Update_time: 2024-03-28 16:41:56Check_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options: Comment:
*************************** 6. row ***************************Name: qhuaEngine: InnoDBVersion: 10Row_format: DynamicRows: 8Avg_row_length: 2048Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-03-27 04:21:38Update_time: NULLCheck_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options: Comment:
*************************** 7. row ***************************Name: v_qhuaEngine: NULLVersion: NULLRow_format: NULLRows: NULLAvg_row_length: NULLData_length: NULL
Max_data_length: NULLIndex_length: NULLData_free: NULLAuto_increment: NULLCreate_time: NULLUpdate_time: NULLCheck_time: NULLCollation: NULLChecksum: NULLCreate_options: NULLComment: VIEW
7 rows in set (0.00 sec)ERROR:
No query specifiedmysql> desc qhua; #查看qhua表结构
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(3) | NO | | NULL | |
| name | varchar(8) | NO | PRI | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| hobbyid | int(6) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)mysql> desc v_qhua; #查看视图表结构
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(3) | NO | | NULL | |
| name | varchar(8) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| phone | varchar(11) | YES | | NULL | |
| hobbyid | int(6) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)mysql>
2.6多表创建视图
[root@localhost ~]#mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.17-log Source distributionCopyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| anhui |
| beijing |
| henan |
| mysql |
| performance_schema |
| shanghai |
| sys |
+--------------------+
8 rows in set (0.00 sec)mysql> use beijing;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| beike |
| beixin |
| haha |
| haha2 |
| haha3 |
| qhua |
| v_qhua |
+-------------------+
7 rows in set (0.00 sec)mysql> create table haidian(id int,name varchar(10),age char(3)); #创建表haidian
Query OK, 0 rows affected (0.01 sec)mysql> select * from qhua;
+----+------+-------+-----------+-------+---------+
| id | name | score | address | phone | hobbyid |
+----+------+-------+-----------+-------+---------+
| 7 | gwx | 15.00 | shenzheng | 64611 | 1 |
| 4 | khui | 79.00 | beijing | 66322 | 3 |
| 2 | lss | 90.00 | haidian | 44446 | 2 |
| 1 | sbk | 99.00 | tongzhou | 33333 | 2 |
| 6 | wql | 55.00 | xian | 64622 | 5 |
| 3 | xzz | 80.00 | qinghuay | 6666 | 3 |
| 8 | ym | 35.00 | shenzheng | 65653 | 1 |
| 5 | zgq | 66.00 | xian | 64622 | 5 |
+----+------+-------+-----------+-------+---------+
8 rows in set (0.00 sec)mysql> insert into haidian values(1,'sbk',25); #插入数据 要与做视图的表qhua数据相同
Query OK, 1 row affected (0.01 sec)mysql> mysql> insert into haidian values(2,'lss',20);
Query OK, 1 row affected (0.01 sec)mysql> insert into haidian values(3,'xzz',18);
Query OK, 1 row affected (0.00 sec)mysql> insert into haidian values(4,'kongzi',16); #插入一条没有的数据
Query OK, 1 row affected (0.01 sec)mysql> select * from haidian;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 | sbk | 25 |
| 2 | lss | 20 |
| 3 | xzz | 18 |
| 4 | kongzi | 16 |
+------+--------+------+
4 rows in set (0.00 sec)mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| beike |
| beixin |
| haha |
| haha2 |
| haha3 |
| haidian |
| qhua |
| v_qhua |
+-------------------+
8 rows in set (0.00 sec)mysql> drop view v_qhua;
Query OK, 0 rows affected (0.00 sec)mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| beike |
| beixin |
| haha |
| haha2 |
| haha3 |
| haidian |
| qhua |
+-------------------+
7 rows in set (0.00 sec)mysql> create view v_qhua(id,name,score,age) as select q.id,q.name,q.score,h.age from qhua q,haidian h where q.name=h.name; #创建视图
Query OK, 0 rows affected (0.01 sec)mysql> select * from v_qhua; #查看视图
+----+------+-------+------+
| id | name | score | age |
+----+------+-------+------+
| 1 | sbk | 99.00 | 25 |
| 2 | lss | 90.00 | 20 |
| 3 | xzz | 80.00 | 18 |
+----+------+-------+------+
3 rows in set (0.00 sec)mysql>
create view v_qhua(id,name,score,age) as select q.id,q.name,q.score,h.age from qhua q,haidian h where q.name=h.name;
视图中的数据与原表相同,才会显示数据,不同不会显示数据
创建视图
单表创建视图: create view v_名称 as select * from 表 where 表达式; # 没有“约束” 多表创建视图: create view v_名称 (字段1,字段2,字段3,...) as select a.字段1,a.字段2,b.字段3,... from 表1 a,表2 b where a.同名字段=b.同名字段;
2.7修改视图数据与原表数据
2.7.1修改原表数据
2.7.2修改视图数据
- 修改表不能修改以函数、复合函数方式计算出来的字段
- 查询方便、安全性
- 查询方便:索引速度快、同时可以多表查询更为迅速(视图不保存真实数据,视图本质类似select)
- 安全性:我们实现登陆的账户是root ,所拥有权限 ,视图无法显示完整的约束
7.3视图表中的数据是否能修改?(重点)
能不能改看情况!!!
- 首先视图表的作用是保存select语句的,
- 通常来讲,select不涉及表数据的处理,那么视图表可以修改,且修改视图表会同时修改原表;
- 但是如果说select语句中包含有聚合函数,group by等等情况,视图表的数据不能修改,非要修改的话,那就去修改原表吧。。。。
2.8删除视图
drop view [if exists] 视图名; #删除视图
2.9NULL 值
- 在 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会忽略,空值会加入计算
表示缺失的值,即该字段没有值;与“0”或者“空白”的字段不同。null 与空值的区别:空值的长度为0,不占空间,null 值长度为1,占用空间。
select length(null),length(''),length('abc');
先添加2个字段:
2.9.1 count()计算时,NULL会忽略,空值会加入计算
2.9.2is null无法判断空值
2.9.3空值使用"=“或者”<>"来处理(!=)
select * from qhua where dianhua='' ;
select * from qhua where dianhua <> '' ;
三、连接查询⭐⭐⭐
MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接
来自两个或多个表的记录结合起来,基于表之间的共同字段进行拼接。使用较多的连接查询包括:内连接、左连接和右连接
环境准备:
mysql> select * from haha2;
+----+-------+-------+-----------+-------+---------+
| id | name | score | address | phone | hobbyid |
+----+-------+-------+-----------+-------+---------+
| 7 | gwx | 15.00 | shenzheng | 64611 | 1 |
| 4 | ngmt | 79.00 | beijing | 66322 | 3 |
| 2 | lss | 90.00 | haidian | 44446 | 2 |
| 1 | sbk | 99.00 | tongzhou | 33333 | 2 |
| 6 | wql | 55.00 | xian | 64622 | 5 |
| 3 | guohe | 80.00 | qinghuay | 6666 | 3 |
| 8 | ym | 35.00 | shenzheng | 65653 | 1 |
| 5 | zgq | 66.00 | xian | 64622 | 5 |
+----+-------+-------+-----------+-------+---------+
8 rows in set (0.00 sec)mysql> select * from qhua;
+----+------+--------+-----------+-------+---------+--------+---------+
| id | name | score | address | phone | hobbyid | cardid | dianhua |
+----+------+--------+-----------+-------+---------+--------+---------+
| 7 | gwx | 15.00 | shenzheng | 64611 | 1 | NULL | NULL |
| 4 | khui | 79.00 | beijing | 66322 | 3 | NULL | NULL |
| 2 | lss | 90.00 | haidian | 44446 | 2 | NULL | NULL |
| 1 | sbk | 66.00 | tongzhou | 33333 | 2 | NULL | NULL |
| 6 | wql | 55.00 | xian | 64622 | 5 | NULL | NULL |
| 3 | xzz | 100.00 | qinghuay | 6666 | 3 | NULL | |
| 8 | ym | 35.00 | shenzheng | 65653 | 1 | NULL | NULL |
| 5 | zgq | 66.00 | xian | 64622 | 5 | NULL | 2222 |
+----+------+--------+-----------+-------+---------+--------+---------+
8 rows in set (0.00 sec)
3.1内连接 inner join
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
select 表名1.字段1,表名1.字段2 from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段;
内连接就是两张或多张表中同时符合某种条件的数据记录的集合(可以理解为交集)
select h.id,h.name from haha2 h inner join qhua q on h.name=q.name;
内连查询:通过inner join 的方式将两张表指定的相同字段的记录行输出出来
3.2左连接 left join
左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
select 表名1.字段1,表名1.字段2 from 表名1 left join 表名2 on 表名1.字段 = 表名2.字段;
左连接以左侧的数据表作为基础表,接收左侧数据表中所有的行,并用这些行与右侧数据表进行匹配,也就是匹配到左侧数据表中的所有内容以及左数据表和右侧数据表符合条件的行。
select * from haha2 h left join qhua q on h.name=q.name;
连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL
3.3右连接 right join
右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
select 表名1.字段1,表名1.字段2 from 表名1 right join 表名2 on 表名1.字段 = 表名2.字段;
它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配,也就是匹配到右侧数据表中的所有内容以及右数据表和左侧数据表符合条件的行
select * from haha2 h right join qhua q on h.name=q.name;
在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足
四、存储过程⭐⭐⭐
4.1概述
前面学的 MySQL 相关知识都是针对一个表或几个表的单条 SQL 语句,使用这样的SQL 语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条 SQL 语句一起去处理才能够完成,这时候就可以使用存储过程, 轻松而高效的去完成这个需求,有点类似shell脚本里的函数
4.2存储过程介绍
- 存储过程是一组为了完成特定功能的SQL语句集合。 两个点 (第一 触发器(定时任务) 第二个判断 )
- 存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高
- 存储过程在数据库中创建并保存,它不仅仅是 SQ语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。
- 存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。
4.3存储过程的优点
(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
(2)SQL语句加上控制语句的集合,灵活性高
(3)在服务器端存储,客户端调用时,降低网络负载
(4)可多次重复被调用,可随时修改,不影响客户端调用
(5)可完成所有的数据库操作,也可控制数据库的信息访问权限
4.4存储过程语法
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
<过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句
[ IN | OUT | INOUT ] <参数名><类型>
- 存储过程的主体都分,被称为过程体
- 以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
- 以DELIMITER开始和结束
- DEL工M工TER $$ $$是用户自定义的结束符
- DELIMITER ; 分号前有空格
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 ; #将语句的结束符号恢复为分号例:
mysql> delimiter $$
mysql> create procedure proc()-> begin-> create table test (id int(10),name char(10),score int(10));-> insert into test values(1,'zhangsan',13);-> select * from test;-> end $$
Query OK, 0 rows affected (0.02 sec)mysql> delimiter ;
4.5调用存储过程
CALL Proc();
例:
call proc();
4.6查看存储过程
#查看某个存储过程的具体信息
SHOW CREATE PROCEDURE 数据库.存储过程名;
show create procedure proc\G#查看存储过程
SHOW PROCEDURE STATUS ;
show procedure status;#查看指定存储过程信息
SHOW PROCEDURE STATUS like '%proc%'\G;
show procedure status like '%proc%'\G;
show procedure status like '%proc%'\G;
4.7存储过程的参数
- 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)
4.8修改存储过程
ALTER PROCEDURE <过程名>[<特征>... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;MODIFIES SQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。
4.9删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。DROP PROCEDURE IF EXISTS Proc;
drop procedure if exists proc;
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
1.子查询
- In:查询已知的值数据记录
- Not In:表示否定,不存在子查询结果集里(相当于取反)
- Exists:判断查询结果集是否为空(空返回False,非空返回TRUE)
2.视图——View
无论修改视图还是原表数据,都会随之一起更改
3.null值与空值的区别(空气与真空)
- 空值长度为0,不占空间,NULL值的长度为null,占用空间
- is null无法判断空值
- 空值使用"=“或者”<>"来处理(!=)
- count()计算时,NULL会忽略,空值会加入计算
4.连接查询——内 左 右
内连接:Inner Join
左连接:Left Join
右连接:Right Join
5.存储过程——Procedure
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 ; #将语句的结束符号恢复为分号例:
mysql> delimiter $$
mysql> create procedure proc()-> begin-> create table test (id int(10),name char(10),score int(10));-> insert into test values(1,'zhangsan',13);-> select * from test;-> end $$
Query OK, 0 rows affected (0.02 sec)mysql> delimiter ;
6.查看存储过程
#查看某个存储过程的具体信息
SHOW CREATE PROCEDURE 数据库.存储过程名;
show create procedure proc\G#查看存储过程
SHOW PROCEDURE STATUS ;
show procedure status;#查看指定存储过程信息
SHOW PROCEDURE STATUS like '%proc%'\G;
show procedure status like '%proc%'\G;
7.删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。DROP PROCEDURE IF EXISTS Proc;
drop procedure if exists proc;