mysql的查询、子查询及连接查询

一、mysql查询的五种子句

where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)

1、where常用运算符:

比较运算符

">", "<" , "=" , "!=" , "(< >)",">=","<="

in(v1,v2..vn)

between v1 and v2 在v1至v2之间(包含v1,v2)

逻辑运算符

not ( ! ) 逻辑非

or ( || ) 逻辑或

and ( && ) 逻辑与

模糊查询

like 通配符:

"%"任意字符

"_" 单个字符

2、group by 分组

在 MySQL 中,GROUP BY 子句用于将结果集中的行组合成基于一个或多个列的小组。这通常与聚合函数一起使用,以对每个组执行计算。

mysql中的五种统计函数:

  • max:求最大值
  • min:求最小值
  • sum:求总数和
  • avg:求平均值
  • count:求总行数

3、having 与where 的异同点

  • 相同点 都是SQL语句中的约束条件子句,用于筛选数据。
  • 不同点 HAVING是在分组后对数据进行过滤,而WHERE是在分组前对数据进行过滤;HAVING后面可以使用聚合函数,而WHERE后面不可以使用聚合函数;HAVING子句总是和GROUP BY子句配合使用,而WHERE子句可以不用任何子句的配合。

4、order by

于对查询结果集进行排序。你可以按照一个或多个列的值对结果进行升序(ASC)或降序(DESC)排序。

  • ORDER BY 子句通常放在查询语句的最后。
  • 如果没有明确指定 ASCDESCORDER BY 默认使用 ASC
  • ORDER BY 对结果集进行排序,这意味着它通常会增加查询的执行时间,特别是当处理大量数据时。
  • 如果查询中同时使用了 GROUP BYORDER BYGROUP BY 通常先执行,然后是 ORDER BY

5、limit

LIMIT子句用于限制查询结果返回的行数。

  • number:表示要返回的最大行数。
  • offset:表示从结果集中的哪一行开始返回数据。偏移量是基于0的索引,也就是说,OFFSET 0是结果集的第一行。

注意事项

  • LIMIT子句在查询的最后执行,这意味着它是在所有其他子句(如WHEREGROUP BYORDER BY)之后应用的。
  • LIMIT可以提高查询性能,因为它减少了从数据库表中检索的行数。
  • 在处理大量数据时,使用LIMIT进行分页通常比一次性检索所有数据然后在应用程序中进行分页更高效。

二、mysql子查询

1、where型子查询

(把内层查询结果当作外层查询的比较条件)

mysql 复制代码
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);

2、from型子查询

(把内层的查询结果供外层再次查询)

mysql 复制代码
select name from (select name,count(*) as gk from stu having gk >=2) as t;

3、exists型子查询

(把外层查询结果拿到内层,看内层的查询是否成立)

mysql 复制代码
select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);

三、union的用法

在MySQL中,UNION操作符用于合并两个或多个SELECT语句的结果集,并自动去除重复的行。如果你希望保留重复的行,你可以使用UNION ALL

基本语法

  1. UNION
scss 复制代码
sqlSELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
  1. UNION ALL
scss 复制代码
sqlSELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

异同点

  1. 相同点

    • 两者都用于合并多个SELECT语句的结果。
    • 合并的SELECT语句必须拥有相同数量的列。
    • 对应的列必须拥有相似的数据类型。
    • 列的顺序必须相同。
  2. 不同点

    • UNION 会自动去除结果集中的重复行,而UNION ALL会保留所有行,包括重复行。
    • 由于UNION 需要去除重复行,所以它的执行效率通常比UNION ALL低。

示例

假设有两个表:employees_ny(纽约的员工)和employees_sf(旧金山的员工),并且两个表的结构相同,都有first_namelast_name列。如果你想获取两个城市中所有不重复的员工名字,你可以使用UNION

sql 复制代码
sqlSELECT first_name, last_name FROM employees_ny
UNION
SELECT first_name, last_name FROM employees_sf;

如果你希望包括所有员工,包括重复的名字,你可以使用UNION ALL

sql 复制代码
sqlSELECT first_name, last_name FROM employees_ny
UNION ALL
SELECT first_name, last_name FROM employees_sf;

注意

  • 使用UNIONUNION ALL时,每个SELECT语句中的列数和数据类型必须匹配。
  • 如果希望按照特定的顺序对结果集进行排序,可以使用ORDER BY子句,但它应该放在最后一个SELECT语句之后。
  • 在某些情况下,使用UNION可能比使用多个单独的SELECT语句并在应用程序中合并结果集更为高效,因为它可以在数据库层面进行优化。

四、左连接,右连接,内连接

1、左连接 以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数

2、右连接 a left join b 等价于 b right join a 推荐使用左连接代替右连接

3、内连接

csharp 复制代码
查询结果是左右连接的**交集**,【即左右连接的结果去除null项后的并集(去除了重复项)】
mysql目前还不支持 外连接(即左右连接结果的并集,不去除null项)
语法:select n1,n2,n3 from ta inner join tb on ta.n1= ta.n2
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小白男神1 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
大勇前进1 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
yuzhi_liu1 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile1 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白801 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端