MySQL高阶语句之二

news2024/11/26 14:30:54

目录

​编辑

一、子查询 

 1.1语法

 1.2select

 1.3insert

 1.3update

 1.4delete

1.5 exists

 1.6别名as

二、MySQL视图

2.1功能

2.2区别

2.3联系

2.4 创建视图(单表)

2.5 创建视图(多表)

2.6修改原表数据

2.7修改视图数据

三、NULL值


一、子查询 

子查询也被称作内查询或者嵌套查询

是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。

子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

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

 1.1语法

语法:

<表达式> [NOT] IN <子查询>

<表达式>  IN <子查询>

当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。

若启用了 NOT 关键字,则返回值相反。

需要注意的是,子查询只能返回一列数据,如果需 求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的

 1.2select

#查询分数大于80的记录
mysql> select name,score from info3 where id in (select id info3 where score>80);
+-----------+-------+
| name      | score |
+-----------+-------+
| jiangshou | 88.00 |
| lisi      | 83.00 |
| tianqi    | 92.00 |
| wangwu    | 99.00 |
+-----------+-------+
4 rows in set (0.00 sec)

 1.3insert

子查询的结果集可以通过 INSERT 语句插入到其 他的表中,将t1里的记录全部删除,重新插入info表的记录

mysql> insert into t1 select * from info where id in (select id from info);
Query OK, 7 rows affected (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> select * from t1;                                                  
+----+-----------+-------+----------+-------+
| id | name      | score | address  | hobby |
+----+-----------+-------+----------+-------+
|  1 | shidapeng | 90.00 | nanjing  |  NULL |
|  2 | shangzhen | 80.00 | beijing  |  NULL |
|  3 | tangyan   | 98.00 | shanghai |  NULL |
|  6 | chengu    | 88.00 | nanjing  |  NULL |
|  7 | caicai    | 70.00 | hangzhou |  NULL |
|  8 | zhaokun   | 80.00 | hangzhou |  NULL |
|  9 | xiawenjie | 80.00 | hangzhou |  NULL |
+----+-----------+-------+----------+-------+
7 rows in set (0.00 sec)

 1.3update

UPDATE 内的子查询,在 set 更新内容时,可以是单独的一列,也可以是多列。

mysql> update info3 set score=100 where id  in (select * from info4 where id>1);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select  * from info3;                                   
+------+-----------+--------+------------+--------+
| id   | name      | score  | address    | hobbid |
+------+-----------+--------+------------+--------+
|    5 | hanmei    | 100.00 | nanjing    |      3 |
|    7 | jixiaoman | 100.00 | guizhou    |      5 |
|    6 | lilei     | 100.00 | kunshan    |      3 |
|    3 | lisi      | 100.00 | shandong   |      4 |
|    1 | luiyi     | 100.00 | beijing    |      2 |
|    4 | tangsan   | 100.00 | laowo      |      5 |
|    2 | wangwu    | 100.00 | shengzheng |      2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)

mysql> update info3 set score=101 where id not in (select * fromm info4 where id>1);
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select  * from info3;                                   
+------+-----------+--------+------------+--------+
| id   | name      | score  | address    | hobbid |
+------+-----------+--------+------------+--------+
|    5 | hanmei    | 101.00 | nanjing    |      3 |
|    7 | jixiaoman | 101.00 | guizhou    |      5 |
|    6 | lilei     | 101.00 | kunshan    |      3 |
|    3 | lisi      | 100.00 | shandong   |      4 |
|    1 | luiyi     | 101.00 | beijing    |      2 |
|    4 | tangsan   | 101.00 | laowo      |      5 |
|    2 | wangwu    | 100.00 | shengzheng |      2 |
+------+-----------+--------+------------+--------+
7 rows in set (0.00 sec)

 1.4delete

在 IN 前面还可以添加 NOT,其作用与IN相反,表示否定(即不在子查询的结果集里面)

删除分数不是大于等于80的记录

mysql> delete from t1 where id not in (select id where score>=80);
Query OK, 1 row affected (0.00 sec)

mysql> select id,name,score from t1;
+----+-----------+-------+
| id | name      | score |
+----+-----------+-------+
|  2 | shangzhen | 80.00 |
|  8 | zhaokun   | 80.00 |
|  9 | xiawenjie | 80.00 |
+----+-----------+-------+
3 rows in set (0.00 sec)

1.5 exists

EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE。

#查询如果存在分数等于80的记录则计算info的字段数
mysql> select * from info3 where exists(select id from info3 where ere score=80);
+------+-----------+-------+----------+--------+
| id   | name      | score | address  | hobbid |
+------+-----------+-------+----------+--------+
|    6 | husan     | 23.00 | nanjing  |      3 |
|    5 | jiangshou | 88.00 | laowo    |      3 |
|    3 | lisi      | 60.00 | shenzhen |      4 |
|    7 | liulei    | 18.00 | nanjing  |      5 |
|    1 | liuyi     | 80.00 | beijing  |      2 |
|    4 | tianqi    | 92.00 | hangzhou |      5 |
|    2 | wangwu    | 99.00 | shanghai |      2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)

mysql> select count(*) from info3 where exists (select id from innfo3 where score=80);
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.00 sec)

 1.6别名as

#将结果集做为一张表进行查询的时候,我们也需要用到别名,示例: 需求:从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“的方式查询将此结果集视为一张"表",就可以正常查询数据了,

mysql> select a.id from (select id,name from  info3) a;
+------+
| id   |
+------+
|    6 |
|    5 |
|    3 |
|    7 |
|    1 |
|    4 |
|    2 |
+------+
7 rows in set (0.00 sec)

二、MySQL视图

2.1功能

简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性 本质而言视图是一种select(结果集的呈现)

2.2区别

①、视图是已经编译好的sql语句。而表不是

②、视图没有实际的物理记录。而表有。 show table status\G

③、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

④、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

⑤、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。

⑥、视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的

2.3联系

视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。

2.4 创建视图(单表)

mysql> create  view v_sore as select * from info3 where  score>=80;
Query OK, 0 rows affected (0.00 sec)

mysql> desc v_sore;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | YES  |     | NULL    |       |
| name    | varchar(10)  | NO   |     | NULL    |       |
| score   | decimal(5,2) | YES  |     | NULL    |       |
| address | varchar(20)  | YES  |     | NULL    |       |
| hobbid  | int(5)       | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

mysql> desc info3;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | YES  |     | NULL    |       |
| name    | varchar(10)  | NO   | PRI | NULL    |       |
| score   | decimal(5,2) | YES  |     | NULL    |       |
| address | varchar(20)  | YES  |     | NULL    |       |
| hobbid  | int(5)       | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> select  * from  v_sore;
+------+-----------+-------+----------+--------+
| id   | name      | score | address  | hobbid |
+------+-----------+-------+----------+--------+
|    5 | jiangshou | 88.00 | laowo    |      3 |
|    1 | liuyi     | 80.00 | beijing  |      2 |
|    4 | tianqi    | 92.00 | hangzhou |      5 |
|    2 | wangwu    | 99.00 | shanghai |      2 |
+------+-----------+-------+----------+--------+
4 rows in set (0.00 sec)

mysql> show  table  status\G
.
.
.
.
.

*************************** 8. row ***************************
           Name: v_sore
         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
8 rows in set (0.01 sec)

2.5 创建视图(多表)

需求:需要创建一个视图,需要输出id、学生姓名、分数以及年龄

mysql> select * from  test01;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan | 20   |
|    2 | lisi     | 30   |
|    3 | wangwu   | 28   |
+------+----------+------+
3 rows in set (0.00 sec)

mysql> select * from info3;
+------+-----------+-------+----------+--------+
| id   | name      | score | address  | hobbid |
+------+-----------+-------+----------+--------+
|    6 | husan     | 70.00 | nanjing  |      3 |
|    5 | jiangshou | 88.00 | laowo    |      3 |
|    3 | lisi      | 83.00 | shenzhen |      4 |
|    7 | liulei    | 18.00 | nanjing  |      5 |
|    1 | liuyi     | 80.00 | beijing  |      2 |
|    4 | tianqi    | 92.00 | hangzhou |      5 |
|    2 | wangwu    | 99.00 | shanghai |      2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)


mysql> create view v_info3(id,name,score,age) as select a.id,a.name,a.score,b.age from info3 a,test01 b where a.name=b.name;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from v_info3;
+------+--------+-------+------+
| id   | name   | score | age  |
+------+--------+-------+------+
|    3 | lisi   | 60.00 | 30   |
|    2 | wangwu | 99.00 | 28   |
+------+--------+-------+------+
2 rows in set (0.00 sec)

2.6修改原表数据

修改原表,视图会发送变化。

mysql> select * from v_info3;
+------+--------+-------+------+
| id   | name   | score | age  |
+------+--------+-------+------+
|    3 | lisi   | 60.00 | 30   |
|    2 | wangwu | 99.00 | 28   |
+------+--------+-------+------+
2 rows in set (0.00 sec)

mysql> update  info3 set score=83 where name='lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from v_info3;
+------+--------+-------+------+
| id   | name   | score | age  |
+------+--------+-------+------+
|    3 | lisi   | 83.00 | 30   |
|    2 | wangwu | 99.00 | 28   |
+------+--------+-------+------+
2 rows in set (0.00 sec)

2.7修改视图数据

修改视图,原表也会发生随之改变。

 

#修改视图之前的表
mysql> select * from  info3;
+------+-----------+-------+----------+--------+
| id   | name      | score | address  | hobbid |
+------+-----------+-------+----------+--------+
|    6 | husan     | 70.00 | nanjing  |      3 |
|    5 | jiangshou | 88.00 | laowo    |      3 |
|    3 | lisi      | 83.00 | shenzhen |      4 |
|    7 | liulei    | 18.00 | nanjing  |      5 |
|    1 | liuyi     | 80.00 | beijing  |      2 |
|    4 | tianqi    | 92.00 | hangzhou |      5 |
|    2 | wangwu    | 99.00 | shanghai |      2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)

#修改视图之前的视图
mysql> select * from  v_info3;
+------+--------+-------+------+
| id   | name   | score | age  |
+------+--------+-------+------+
|    3 | lisi   | 83.00 | 30   |
|    2 | wangwu | 99.00 | 28   |
+------+--------+-------+------+
2 rows in set (0.00 sec)

#将wangwu的score改成38
mysql> pumysql> update v_info3 set score=38 where name='wangwu';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

#修改之后的视图
mysql> select * from  v_info3;
+------+--------+-------+------+
| id   | name   | score | age  |
+------+--------+-------+------+
|    3 | lisi   | 83.00 | 30   |
|    2 | wangwu | 38.00 | 28   |
+------+--------+-------+------+
2 rows in set (0.00 sec)

#修改之后的表
mysql> select * from  info3;
+------+-----------+-------+----------+--------+
| id   | name      | score | address  | hobbid |
+------+-----------+-------+----------+--------+
|    6 | husan     | 70.00 | nanjing  |      3 |
|    5 | jiangshou | 88.00 | laowo    |      3 |
|    3 | lisi      | 83.00 | shenzhen |      4 |
|    7 | liulei    | 18.00 | nanjing  |      5 |
|    1 | liuyi     | 80.00 | beijing  |      2 |
|    4 | tianqi    | 92.00 | hangzhou |      5 |
|    2 | wangwu    | 38.00 | shanghai |      2 |
+------+-----------+-------+----------+--------+
7 rows in set (0.00 sec)

三、NULL值

在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。

 NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。

mysql> select length(null),length(''),length(123);
+--------------+------------+-------------+
| length(null) | length('') | length(123) |
+--------------+------------+-------------+
|         NULL |          0 |           3 |
+--------------+------------+-------------+
1 row in set (0.00 sec)

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

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

相关文章

虚拟机ubuntu1804打开联合标定工具箱的步骤(toolkit)

1、运行roscore roscore 2、进入到calibration文件夹打开终端 source devel/setup.bash3、运行rosrun打开即可 rosrun calibration_camera_lidar calibration_toolkit

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项&#xff0c;设置 filters&#xff0c;可进行筛选&#xff0c;filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选&#xff0c;filterMethod 传入两个参数value和 row。 如果指定 filter…

基于异步FIFO的串口回环测试

文章目录 前言一、异步FIFO简介二、串口简介2.1 数据接收模块(RX)2.1 数据发送模块(TX) 三、IP核说明与配置2.1 PLL IP核2.2 FIFO IP核 四、数据关联 前言 当涉及到串口通信的硬件设计和软件开发时&#xff0c;进行有效的测试是至关重要的。串口回环测试是一种常见的测试方法&a…

GSV6201替代方案|CS5466设计资料|CS5466原理图|typec转HDMI_8k方案芯片

GSV6201是一款高性能、低功耗、高性能的&#xff0c;USB Type-C备用模式显示端口1.4至HDMI 2.1转换器。通过集成增强型微控制器&#xff0c;GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps&#xff08;HBR3&#xff0c;4通道&#xf…

美国SaaS管理平台Zluri完成2000万美元的B轮融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;SaaS运营(SaaSOps)平台Zluri今日宣布获得2000万美元的融资&#xff0c;帮助企业管理SaaS资产并降低风险。B轮融资由Lightspeed领投&#xff0c;参与融资的其他投资者包括MassMutual Ventures、End…

python 数学 中负数的取余的区别

😄 今天发现python中负数的取余操作和数学中的是有区别的,在此记录一下。 文章目录 1、python中负数取余:2、数学中负数取余:3、总结:1、python中负数取余: res = a%b, 例子: -5%7=25%-7=-2-5%-7=-5如果a或b是负数,python则是会让商尽可能的小(即采用的是向下取整的方…

JVM中的堆和栈到底存储了什么

JVM数据区 先上一张Java虚拟机运行时数据区中堆、栈以及方法区存储数据的概要图&#xff0c;如下所示&#xff1a; 然后我们来具体解析一下堆和栈 堆 堆是存储时的单位&#xff0c;对于绝大多数应用来说&#xff0c;这块区域是 JVM 所管理的内存中最大的一块。线程共享&#…

用java实现死锁,并且判断是否产生

目录 锁的概念 锁在多线程环境中的作用是&#xff1a; 在Java中&#xff0c;常见的锁机制有以下几种&#xff1a; 形成死锁的条件 用java写一个死锁 如何避免死锁&#xff1f; 锁的概念 首先我们要明确锁是什么&#xff0c;在Java语言中&#xff0c;锁&#xff08;Lock&…

think-on-graph: 基于知识图谱的大模型推理

概述 本文的研究背景是大规模语言模型在复杂推理任务中存在困难并展示了较低的性能&#xff0c;特别是在需要知识的追溯能力、及时性和准确性的场景中。 过去的方法主要面临两个问题&#xff1a;推理不负责任容易生成虚构或带有有害文本&#xff0c;以及模型在预训练阶段无法…

个人号的微信API接口,微信机器人二次开发

前段时间应公司需求&#xff0c;要开发一套自定义的微信机器人&#xff0c;具体需求是可以自己批量添加好友、批量打标签等进行好友管理&#xff0c;社群管理需要自动聊天&#xff0c;自动回复&#xff0c;发朋友圈&#xff0c;转发语音&#xff0c;以及定时群发等&#xff0c;…

visio 图片转换到 latex 中

调整图片大小 在Visio中&#xff0c;设计–>页面设置–>大小–>适应绘图&#xff0c;这样会自动去除多余空白&#xff0c;保留部分空白作为边界&#xff0c;无需使用Word。 2. 将新的Visio文件另存为pdf格式文件 3. latex 中插入pdf 格式图片

Python 算法基础篇之数组和列表:创建、访问、添加和删除元素

Python 算法基础篇之数组和列表&#xff1a;创建、访问、添加和删除元素 引用 1. 数组的概念和创建2. 列表的概念和创建3. 访问数组和列表中的元素4. 添加和删除元素 a ) 添加元素 b ) 删除元素 总结 引用 在算法和数据结构中&#xff0c;数组和列表是常见的数据结构&#xff…

MySQL备份与还原/索引/视图

MySQL备份与还原/索引/视图练习 文章目录 一、备份与还原1、使用mysqldump命令备份数据库中的所有表2、备份booksDB数据库中的books表3、使用mysqldump备份booksDB和test数据库4、使用mysqldump备份服务器中的所有数据库5、使用mysql命令还原第二题导出的book表6、进入数据库使…

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独立直播间等类型&#xff0c;满足讲师个性化直播场景需求&#xff1b;低延迟、双向视频&#xff0c;亲密互动&#xff0c;无论是互动、答疑&#xff0c;还是打赏、带货、…

简单了解UML类图

前言 大话设计中&#xff0c;多次使用UML类图来表示&#xff0c;并也给了基本的介绍&#xff0c;这里从书中选出UML图和代码做成笔记&#xff0c;以方便查找。 1、类 注意前面的符号&#xff1a; &#xff1a;public -&#xff1a;private #&#xff1a;protected 抽象类&…

华为认证 | 存储专家HCIE-Storage V3.0 正式发布!

华为认证存储专家HCIE-Storage V3.0&#xff08;中文版&#xff09;自2023年7月13日起&#xff0c;正式在中国区发布。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&#xff0c;华为公司打造了覆盖ICT领域的认证体系&#xff0c;包含IC…

秋招LeetCode刷题Day1 -- 前缀树专题

一个人的朝圣 — LeetCode打卡第 天 知识总结 Leetcode 208. 实现 Trie (前缀树)题目说明代码说明 Leetcode 211. 添加与搜索单词 - 数据结构设计题目说明代码说明 Leetcode 648. 单词替换题目说明代码说明 知识总结 今天重新学习了一下前缀树以及相关的知识 Leetcode 208. 实…

2023-07-19 平面坐标下判断三角形以及输出周长和面积

平面坐标下判断三角形以及输出周长和面积 前言一. 基本知识总结 前言 平面坐标下判断三角形以及输出周长和面积, 用线性代数的简单知识. 一. 基本知识 在平面坐标, 三个点就是三个向量, 可以通过两个向量同时减去第三个向量, 形成一个顶点在原点的三角形. 我们发现, 只有一种…

详解C#开发Android应用程序的流程

Android系统一下子铺天盖地而来&#xff0c;让人目不暇接。兴奋的同时也让部分开发人员犯难了&#xff01;要知道从熟知的Wince、Mobile开发语言C#跨越到RFID-Android的Java。可不是一朝一夕就能完成的。就好比你的乾坤大挪移已经第七层了&#xff0c;却忽然要你从易筋经从头练…

LiveGBS流媒体平台GB/T28181功能-报警信息报警订阅配置报警预案告警触发报警时截图及录像

LiveGBS国标GB/T28181报警信息报警订阅配置报警预案告警触发报警时截图及录像 1、报警信息1.1、报警查询1.2、配置开启报警订阅1.2.1、国标设备编辑1.2.2、选择开启报警订阅 1.3、配置摄像头报警1.3.1、配置摄像头报警通道ID1.3.2、配置摄像头开启侦测1.3.3、尝试触发摄像头报警…