MySQL基础用法之子查询

news/2024/7/24 10:39:34

一、什么是子查询

      子查询(subquery)是指,嵌套在查询内部,出现在其他SQL语句内的select子句。例如:

SELECT * FROM table1 WHERE col1 = (SELECT col2 FROM table2);

      其中,SELECT col2 FROM table2就是子查询。

  • 子查询必须出现在圆括号内
  • 子查询可以包括多个关键字或条件
  • 子查询的外层查询可以是SELECT,INSERT,DELETE,UPDATE,SET,DO.
  • 子查询可以返回标量、一行、一列,甚至是子查询

二、子查询的分类

1、使用比较运算符的子查询

      例如,查询分数大于等于平均数的学生。

SELECT name FROM students WHERE score >= (SELECT ROUND(AVG(score),2) FROM students);

      当使用比较运算符的子查询中,返回的结果大于一个时,要使用ANY,SOME或ALL来修饰子查询,否则会出现错误。其中ANY和SOME是等价的,表示符合其中一个结果即可,ALL表示要符合全部结果。例如,查询分数大于A班分数的学生:

SELECT name FROM students WHERE score > ANY (SELECT score FROM students WHERE klass = 'A');

2、使用[NOT] IN的子查询

      与比较运算符的子查询类似,IN与=ANY等效,NOT IN与!=ALL等效。

3、使用[NOT] EXISTS的子查询

      如果子查询返回任何内容,则EXIST返回TRUE,否则返回FALSE。

三、子查询的应用

1、将查询到的结果写入数据表

      例如,从students表中,查询所有的班级,写入classes表中

INSERT classes(class_name) SELECT klass FROM students GROUP BY klass;

2、多表更新(参照另外的表来更新本表中的记录)

      例如,将students表中存储的班级klass,改为classes表中对应的class_id

UPDATE students INNER JOIN classes ON klass = class_name SET klass = class_id;

      若两个表中对应的字段名相同,需要指定是哪个表中的字段,可以通过起别名的方式实现,例如

UPDATE students AS s INNER JOIN classes AS c ON s.klass = c.class_name SET s.klass = c.class_id;

3、创建数据表并把查询的结果写入数据表

      例如,创建一个省份表provinces,并把students表中所有省份province写入到省份表中

CREATE TABLE provinces
(
province_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
province_name VARCHAR(20) NOT NULL
)
SELECT province FROM students GROUP BY province;

4、多表删除

      例如,删除students表中,姓名重复的记录。

DELETE s1 FROM students AS s1 LEFT JOIN (SELECT id,name FROM students GROUP BY name HAVING count(name)>=2) AS s2 ON s1.name = s2.name WHERE s1.id>t2.id;

 


http://www.niftyadmin.cn/n/1263726.html

相关文章

如何用Javascript将图片的绝对路径转换为base64编码

我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码;在这我们引用的是淘宝首页一张图片如下: 代码如下: var img “https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.jpg”; function getBase64Image(img) {var ca…

MySQL基础用法之函数

一、字符函数 CONCAT() 字符连接 SELECT CONCAT(MR,.,NIE); 可以连接多个字段,以上得到结果MR.NIE CONCAT_WS() 使用指定分隔符进行字符连接 SELECT CONCAT_WS(,,MR,NIE); 至少需要三个参数,第一个参数表示连接字段的分隔符,以上同样得到结…

前端json搜索

前端json搜索,无需连接后端: // index 输入的字段// save_search_result 搜索的全部json数组function indexSelect(index, save_search_result) {let arr save_search_result;// 前端json搜索// 输入内容为空 显示所有的内容if (index || index nu…

H5唤起应用商店或者应用市场

常用APP URL Scheme 常用app App Store: scheme: itms-apps:// 支付宝: packageName: com.eg.android.AlipayGphone, scheme: alipay://淘宝: packageName: com.taobao.taobao, scheme: taobao:// QQ: packageName: com.t…

elementUI表单验证的怪异问题-填入符合要求的数据校验不通过

一、现象 select选中选项后,提交表单,校验未通过 input填入符合要求的内容后,提交表单,校验未通过 二、代码 两个问题都是由于数据格式不匹配校验未通过,在select中,可以强制将option的value改为string类型…

前端性能优化之Yahoo军规

一、减少HTTP请求数 合并图片合并JavaScript合并CSS 二、使用内容分发网络(CDN) 三、添加Expire/Cache-Control头 expire存储一个时间值,即过期时间,若没超过过期时间,则继续使用本资源,不发送HTTP请求c…

编写 WebSocket 客户端应用

编写 WebSocket 客户端应用 WebSocket 客户端应用程序使用 WebSocket API 通过 WebSocket 协议与 WebSocket 服务器通信。 一、react 示例如下 // 消息监听const webSocketInit () > {const socket new WebSocket(ws://www.example.com/socketserver) // 连接地址// 打开…

Vue路由参数变化,页面不刷新

一、现象 下面两个页面的截图,URL参数不一样,页面切换时,内容却没有刷新。 二、解决方案 监听路由变化,控制app的刷新