MySQL数据库----------探索高级SQL查询语句 (二)

目录

一、子查询

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
  1. 视图表的作用是记录select语句

  2. 创建视图语法:create view 视图表名 as select 语句;

  3. 删除视图语法:drop view 视图表名;

  4. 保存的是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: beike
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 3
 Avg_row_length: 5461
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-28 14:42:51
    Update_time: 2024-03-28 14:44:42
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 2. row ***************************
           Name: beixin
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 2
 Avg_row_length: 8192
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-28 14:49:46
    Update_time: 2024-03-28 14:51:04
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 3. row ***************************
           Name: haha
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 8
 Avg_row_length: 2048
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-27 10:52:36
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 4. row ***************************
           Name: haha2
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 8
 Avg_row_length: 2048
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-27 11:02:34
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 5. row ***************************
           Name: haha3
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 1
 Avg_row_length: 16384
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-27 11:07:25
    Update_time: 2024-03-28 16:41:56
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 6. row ***************************
           Name: qhua
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 8
 Avg_row_length: 2048
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2024-03-27 04:21:38
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 7. row ***************************
           Name: v_qhua
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
7 rows in set (0.00 sec)

ERROR: 
No query specified

mysql> 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 distribution

Copyright (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 -A

Database 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/494428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Component is not found in path “miniprogram_npm/@vant/

在微信小程序中使用vantUI库时&#xff0c;xxx.json内引入vant组件&#xff0c;报错Component is not found in path "miniprogram_npm/vant/checkbox/index &#xff0c;按报错路径查看&#xff0c;在报错目录下的包&#xff0c;文件完好存在&#xff0c;如下截图 找到n…

Etcd 基本入门

1&#xff1a;什么是 Etcd ? Etcd 是 CoreOS 团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法&#xff0c;Etcd基于 Go 语言实现。 名字由来&#xff0c;它源于两个方面&#xff0c;…

20240320-2-线性回归+逻辑回归

线性回归于逻辑回归面试题 1. 简单介绍一下线性回归。 **线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。**这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简…

V R社交平台的用处|虚拟现实体验馆加盟|V R设备在线价格

VR&#xff08;虚拟现实&#xff09;社交平台的用处可以体现在以下几个方面&#xff1a; VR社交平台不仅可以丰富用户的社交体验&#xff0c;还可以在教育、艺术、商务等领域发挥重要作用&#xff0c;为用户提供更加多样化、互动性强的社交平台体验。 VR游乐设备|VR娱乐设备|VR…

SEO 的未来:GPT 和 AI 如何改变关键词研究

谷歌Gemini与百度文心一言&#xff1a;AI训练数据的较量 介绍 想象一下&#xff0c;有一个工具不仅可以理解错综复杂的关键字网络&#xff0c;还可以预测搜索引擎查询的变化趋势。 这就是生成式预训练 Transformer (GPT) 和其他人工智能技术发挥作用的地方&#xff0c;以我们从…

37.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-解码器细化类的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;36.数据解码器的…

高阶SQL语句(二)

一 子查询 也被称作内查询或者嵌套查询&#xff0c;是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句 是先于主查询语句被执行的&#xff0c;其结果作为外层的条件返回给主查询进行下一 步的查询过滤。 ①子语句可以与主语句所查询的表相同&#xff0c;也可以是不…

29---Nor Flash电路设计

视频链接 Nor Flash硬件电路设计01_哔哩哔哩_bilibili NOR FLASH电路设计 1、NOR FLASH介绍 NOR Flash最早是由Intel公司于1988年开发出的。 NOR Flash虽容量小但速度快,最大特点是支持芯片内执行&#xff08;XIP&#xff09;&#xff0c;即程序可以直接在NOR flash的片内…

mac-git上传至github(ssh版本,个人tokens总出错)

第一步 git clone https://github.com/用户名/项目名.git 第二步 cd 项目名 第三步 将本地的文件移动到项目下 第四步 git add . 第五步 git commit -m "添加****文件夹" 第六步 git push origin main 报错&#xff1a; 采用ssh验证 本地文件链接公钥 …

Day23:事务管理、显示评论、添加评论

事务管理 事务的定义 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元&#xff0c;这系列操作要么全执行&#xff0c;要么全放弃执行。 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的最小执行体&#xff08;事务中部分执行失败就会回滚 。一致性(C…

AWS基础网络产品及协同架构-Networking

简介 一个完整的AWS网络架构图&#xff0c;包含了如下能力&#xff1a; Users (用户): 表示使用AWS服务的用户或系统。 SaaS (软件即服务): 表示在AWS上运行的软件服务&#xff0c;如企业微信可能作为SaaS提供。 example.com?: 这可能是一个示例域名&#xff0c;用于展示如何…

[2021]Zookeeper getAcl命令未授权访问漏洞概述与解决

今天在漏洞扫描的时候蹦出来一个zookeeper的漏洞问题&#xff0c;即使是非zookeeper的节点&#xff0c;或者是非集群内部节点&#xff0c;也可以通过nc扫描2181端口&#xff0c;获取极多的zk信息。关于漏洞的详细描述参考apache zookeeper官方概述&#xff1a;CVE-2018-8012: A…

KPCA-GWO-LSSVM,基于KPCA核主成分分析优化灰狼优化算法GWO结合最小二乘支持向量机LSSVM回归预测

基于KPCA核主成分分析优化灰狼优化算法&#xff08;KPCA-GWO&#xff09;结合最小二乘支持向量机&#xff08;LSSVM&#xff09;回归是一种用于回归分析的混合优化算法。下面我将简要介绍这个方法的步骤&#xff1a; 核主成分分析&#xff08;KPCA&#xff09;&#xff1a; KPC…

小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析

小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程_没有五级社区怎么解锁bl-CSDN博客 上次解析了小米有些出厂不是HyperOS系统的机型绕社区等级接bl锁的操作。目前有更新出厂为HyperOS系统的机型免社区登录等级限制 免答题解锁bl的操作。而且有网友在米14 平板6sp k70这些新…

解决kubesphere流水线docker登陆错误http: server gave HTTP response to HTTPS client

kubesphere DevOps流水线中&#xff0c;在登录私有的harbor仓库时&#xff0c;报以下错误 docker login 111.230.19.120:80 -u admin -p test123. WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from daemon: Get "https://…

Android JNI SO库和对应的CPU架构详解

Android JNI SO库和对应的CPU架构详解 文章目录 Android JNI SO库和对应的CPU架构详解一、前言二、Android CPU架构1、Android系统支持的CPU架构2、如查查看手机的CPU架构&#xff08;1&#xff09;Android13 大屏AML厂商的cpu信息&#xff1a;&#xff08;2&#xff09;电脑An…

前缀和算法(1)

目录 一维前缀和[模板] 一、题目描述 二、思路解析 三、代码 二维前缀和[模板] 一、题目描述 二、思路解析 三、代码 724.寻找数组的中心下标 一、题目描述 二、思路解析 三、代码 238.除自身以外数组的乘积 一、题目描述 二、思路解析 三、代码 一维前缀和[模…

数据结构——二叉搜索树详解

一、二叉搜索树定义 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 1.非空左子树上所有节点的值都小于根节点的值。 2.非空右子树上所有节点的值都大于根节点的值。 3.左右子树也都为二叉搜索树。 如下图所示&#xff1a…

上位机图像处理和嵌入式模块部署(qmacvisual区域提取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在图像处理中&#xff0c;有两部分比较重要&#xff0c;一个是区域分割&#xff0c;一个是区域提取。区域分割&#xff0c;比较好理解&#xff0c;…

IDEA的使用(概念,安装,配置,)以及什么是字符集,模版

目录 Intellij IDEA IDE的概念 IntelliJ IDEA的安装 IntelliJ IDEA的使用 基本配置 JDK配置 创建Module 基本用法 字体配置 主题配置 字符集 设置IDEA默认字符集 注释模板 字符集 字符集简介 常见字符集 Intellij IDEA 我们不可能一直使用记事本之类变成&#…
最新文章