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

news2024/11/28 6:46:36

目录

一、子查询

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.coloradmin.cn/o/1560560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 个人笔记之三剑客 grep sed awk

文章目录 零、预一、grep 文本过滤工具基础篇实战篇 二、sed 字符流编辑器基础篇实战篇 三、awk 文本处理工具基础篇实战篇 四、附xargsuniq & sort基础篇实战篇 cut 零、预 bash 的命令行展开 {} $ echo file_{1..4} file_1 file_2 file_3 file_4$ echo file_{a..d} file_…

【攻防世界】unseping (反序列化与Linux bash shell)

打开题目环境&#xff1a; 1、进行PHP代码审计&#xff0c;通过审计得知需要用到PHP反序列化。找到输出flag的位置为 ping()函数。通过使用 exec() 函数来执行 $ip 并将结果保存在 $result 中&#xff0c;最终输出 $result。 2、接着寻找给 $ip 传参的位置&#xff0c;发现通过…

FastEI论文阅读

前言 研究FastEI有很长时间了&#xff0c;现在来总结一下&#xff0c;梳理一下认知。论文地址&#xff1a;https://www.nature.com/articles/s41467-023-39279-7&#xff0c;Github项目地址&#xff1a;https://github.com/Qiong-Yang/FastEI。 概要 这篇文章做的工作是小分子…

16.面向对象的软件测试技术

主要考点&#xff1a; 1、面向对象相关的基础概念&#xff1b;&#xff08;已经在软件工程的课程中讲过&#xff0c;要熟悉UML图&#xff0c;知道类和类之间的关系&#xff0c;这些知识也可能结合到下午题考察&#xff09; 2、面向对象的软件测试技术&#xff1b;&#xff08;大…

基于单片机汽车超声波防盗系统设计

**单片机设计介绍&#xff0c;基于单片机汽车超声波防盗系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机汽车超声波防盗系统设计概要主要涉及利用超声波传感器和单片机技术来实现汽车的安全防盗功能。以下是对…

辽宁梵宁教育:点亮大学生设计技能之光

辽宁梵宁教育作为专注于设计教育的线上机构&#xff0c;对大学生设计技能的提升和就业前景产生了深远的影响。在当前数字化时代&#xff0c;设计技能已逐渐成为各行各业不可或缺的重要能力&#xff0c;而梵宁教育正是抓住了这一机遇&#xff0c;致力于培养具备创新思维和实践能…

还在问如何入门 Python 爬虫?收藏这篇直接带你上路爬虫!!

“入门”是良好的动机&#xff0c;但是可能作用缓慢。如果你手里或者脑子里有一个项目&#xff0c;那么实践起来你会被目标驱动&#xff0c;而不会像学习模块一样慢慢学习。另外如果说知识体系里的每一个知识点是图里的点&#xff0c;依赖关系是边的话&#xff0c;那么这个图一…

Java毕业设计-基于springboot开发的致远汽车租赁系统平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、业务员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot…

LC 106.从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a; inorder [9,3,15,20,7], post…

STM32G系 编程连接不上目标板,也有可能是软件不兼容。

由于一直用的老版本STM32 ST-LINK Utility 4.20 &#xff0c;找遍了所有问题&#xff0c;SWD就是连不上目标板。 电源脚 VDDA 地线&#xff0c;SWD的四条线&#xff0c;还是不行&#xff0c;浪费了一天&#xff0c;第二天才想起&#xff0c;是不是G系升级了 SWD协议。结果下载…

安全访问多线程环境:掌握 Java 并发集合的使用技巧

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

[优选算法专栏]专题十五:FloodFill算法(二)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

【Vue3】el-checkbox-group实现权限配置和应用

一. 需求 针对不同等级的用户&#xff0c;配置不同的可见项 配置效果如下 &#xff08;1&#xff09;新增&#xff0c;获取数据列表 &#xff08;2&#xff09;编辑&#xff0c;回显数据列表 应用效果如下 &#xff08;1&#xff09;父级配置 &#xff08;2&#xff09;子级…

leetcode90. 子集 II

去重逻辑&#xff1a; 关键是画出递归树&#xff01;当我们即将进入第二个2的递归的时候&#xff0c;发现isVisit数组是100&#xff0c;也就是说这俩重复的数是False&#xff0c;并且这俩在nums值相同&#xff0c;所以写出去重逻辑&#xff01; class Solution { public:vector…

2024-2028年中国导电滑环市场行情及未来发展前景研究报告

导电滑环应用领域广泛 全球市场将保持增长趋势 导电滑环又称为集流环、集电环、导电环&#xff0c;是一种电气连接器件&#xff0c;用于在旋转部件和静止部件之间传输电能信号。导电滑环避免了传统导线在旋转中存在的磨损和扭伤&#xff0c;可提高机器运转效率和稳定性&#xf…

美易官方:通胀持续降温,美联储可能在6月份降息

近期&#xff0c;LPL首席经济学家在接受采访时表示&#xff0c;通胀持续降温&#xff0c;美联储可能在6月份降息。这一消息引起了市场的广泛关注和讨论。通胀一直是全球经济面临的难题之一&#xff0c;而美联储的货币政策也一直是市场关注的焦点。那么&#xff0c;通胀降温和美…

Discord绑VISA卡教程

Discord 是由美国 Discord Inc. 公司所开发的一款专为社群设计的免费网络实时通话软件与数字发行平台&#xff0c;主要针对游戏玩家、教育人士、朋友及商业人士&#xff0c;用户之间可以在软件的聊天频道通过讯息、图片、视频和音频进行交流 下面进行实际操作 1、登录discord …

【A-013】基于SSH的共享单车管理系统/共享单车出租系统

【A-013】基于SSH的共享单车管理系统/共享单车出租系统 开发环境&#xff1a; Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库&#xff1a; MySQL 适用于&#xff1a; 课程设计&#xff0c;毕业设计&#xff0c;学习等等 系统介绍&#xff1a; 基于SSH开发的共享单车管理系统/…

新质生产力:1核心,2摆脱,3关键,3因素,3特征;3要素,3措施

引言 新质生产力是指以科技创新为核心驱动力&#xff0c;通过提高全要素生产率、推动产业升级和转型&#xff0c;实现经济高质量发展的能力和水平。在当今全球经济竞争日趋激烈的背景下&#xff0c;新质生产力成为各国竞争力的关键之一&#xff0c;对于实现经济可持续发展、提…

CAN总线系列二:时序以及数据帧分析

由于CAN总线是异步的&#xff0c;也就是没有时钟线&#xff0c;像串口那样设置好波特率然后进行通信。因此使得其协议时序就很重要。 一、位时序 1、时序简介 为了实现位同步&#xff0c; CAN协议把每一个数据位的时序分解成SS段、 PTS段、PBS1段、 PBS2段&#xff0c;这四段…