一、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
子句通常放在查询语句的最后。- 如果没有明确指定
ASC
或DESC
,ORDER BY
默认使用ASC
。 ORDER BY
对结果集进行排序,这意味着它通常会增加查询的执行时间,特别是当处理大量数据时。- 如果查询中同时使用了
GROUP BY
和ORDER BY
,GROUP BY
通常先执行,然后是ORDER BY
。
5、limit
LIMIT
子句用于限制查询结果返回的行数。
number
:表示要返回的最大行数。offset
:表示从结果集中的哪一行开始返回数据。偏移量是基于0的索引,也就是说,OFFSET 0
是结果集的第一行。
注意事项
LIMIT
子句在查询的最后执行,这意味着它是在所有其他子句(如WHERE
,GROUP BY
,ORDER BY
)之后应用的。LIMIT
可以提高查询性能,因为它减少了从数据库表中检索的行数。- 在处理大量数据时,使用
LIMIT
进行分页通常比一次性检索所有数据然后在应用程序中进行分页更高效。
二、mysql子查询
1、where型子查询
(把内层查询结果当作外层查询的比较条件)
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
2、from型子查询
(把内层的查询结果供外层再次查询)
select name from (select name,count(*) as gk from stu having gk >=2) as t;
3、exists型子查询
(把外层查询结果拿到内层,看内层的查询是否成立)
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
。
基本语法
sqlSELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
sqlSELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
异同点
相同点:
- 两者都用于合并多个
SELECT
语句的结果。 - 合并的
SELECT
语句必须拥有相同数量的列。 - 对应的列必须拥有相似的数据类型。
- 列的顺序必须相同。
不同点:
- UNION会自动去除结果集中的重复行,而UNION ALL会保留所有行,包括重复行。
- 由于UNION需要去除重复行,所以它的执行效率通常比UNION ALL低。
示例
假设有两个表:employees_ny
(纽约的员工)和employees_sf
(旧金山的员工),并且两个表的结构相同,都有first_name
和last_name
列。如果你想获取两个城市中所有不重复的员工名字,你可以使用UNION
:
sqlSELECT first_name, last_name FROM employees_ny
UNION
SELECT first_name, last_name FROM employees_sf;
如果你希望包括所有员工,包括重复的名字,你可以使用UNION ALL
:
sqlSELECT first_name, last_name FROM employees_ny
UNION ALL
SELECT first_name, last_name FROM employees_sf;
注意
- 使用
UNION
或UNION ALL
时,每个SELECT
语句中的列数和数据类型必须匹配。 - 如果希望按照特定的顺序对结果集进行排序,可以使用
ORDER BY
子句,但它应该放在最后一个SELECT
语句之后。 - 在某些情况下,使用
UNION
可能比使用多个单独的SELECT
语句并在应用程序中合并结果集更为高效,因为它可以在数据库层面进行优化。
四、左连接,右连接,内连接
1、左连接 以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数
2、右连接 a left join b 等价于 b right join a
推荐使用左连接代替右连接
3、内连接
查询结果是左右连接的**交集**,【即左右连接的结果去除null项后的并集(去除了重复项)】
mysql目前还不支持 外连接(即左右连接结果的并集,不去除null项)
语法:select n1,n2,n3 from ta inner join tb on ta.n1= ta.n2