SQL
简介
数据库查询是从数据库中检索数据的过程。它允许用户根据特定的条件和需求,从数据库表中获取需要的数据。
一. 基础查询
SELECT 语句:SELECT 语句是进行数据库查询的核心。它用于指定要查询的列、表、条件和排序等。通过 SELECT语句,可以选择性地指定要返回的列,可以使用通配符(*)查询所有列。SELECT 语句还可以使用 WHERE 子句设置查询条件,使用ORDER BY 子句对结果进行排序。
注意:不推荐使用 * ,尽量使用 字段名 进行查询
语法:
select 字段列表 from 表名;
# 基本查询
select * from person
# 使用字段名查询
SELECT id,name,age,sex,favourite from person
二. 条件查询
WHERE 子句用于在查询中设置过滤条件,从而根据条件筛选出满足要求的记录。可以使用比较运算符(例如等于、大于、小于)和逻辑运算符(例如 AND、OR、NOT)来构建复杂的条件。
# 用where表示查询的条件
SELECT id,name,age ,sex ,favourite from person where id BETWEEN 1 and 10
SELECT id,name,age ,sex ,favourite from person where id>5 and sex='男'
SELECT id,name,age ,sex ,favourite from person where id>5 or sex='男'
# %匹配0或多个字符,一般不用左模糊(%放在左边,导致索引失效,降低查询效率)
SELECT id,name,age ,sex ,favourite from person where name like '%豪'
# _代表匹配一个字符
SELECT id,name,age ,sex ,favourite from person where name like '_豪'
SELECT id,name,age ,sex ,favourite from person where name like '%二%'
三. 分页查询
分页查询是一种将查询结果划分为多个页面的查询方法,常用于在网页或应用程序中展示大量数据时,以提高用户体验和性能。分页查询的基本原理是根据指定的每页记录数和当前页码,从查询结果中获取对应页的数据。通常,分页查询需要使用 LIMIT 子句和 OFFSET 子句来实现。
语法:
SELECT 列1, 列2, ...
FROM 表名
LIMIT a,b
a用于指定每页的记录数量,即每页展示的数据行数。
b用于指定查询结果的起始偏移量,即从第几行开始查询数据。偏移量是基于零索引的,所以第一行的偏移量是 0,第二行的偏移量是 1,以此类推。
从 "students" 表中获取每页 10 条记录,从第 21 条记录开始
SELECT name, age
FROM students
LIMIT 10,20;
四. 排序
Order By
排序 order by 字段名 (ASC 升序,DESC降序)
实例代码:
SELECT id,name,age ,sex ,favourite from person ORDER BY age ASC;
SELECT id,name,age ,sex ,favourite from person ORDER BY age DESC;
五. 聚合函数
聚合函数用于对查询结果进行统计和汇总。常见的聚合函数有 COUNT、SUM、AVG、MAX、MIN 等。这些函数能够计算列中的总数、总和、平均值、最大值和最小值等。
- count() – 查询记录数量
- sum() – 查询总和
- avg() – 查询平均值
- max() – 查询最大值
- min() 查询最小值
select count(0) from person
select sum(age) from person
select avg(age) from person
select min(age) from person
select max(age) from person
六. 分组查询
group by
分组查询用于基于一或多个列对数据进行分组,并对每个分组应用聚合函数计算。通常使用 GROUP BY 子句指定分组的列。有时候还会使用 HAVING 子句对分组结果进行筛选。
# 分组查询 group by 字段
SELECT sex,count(0),avg(age) from person GROUP BY sex;
# having条件查询 where分组前,having分组后的条件
SELECT sex,count(0),avg(age) from person where age>8 GROUP BY sex having avg(age)>20;
七. 子查询
子查询是嵌套在另一个查询中的查询语句。它可以作为整个查询的一部分,常用于在主查询中使用子查询的结果进行进一步筛选或比较。
# 把查询到的结果当作另一个查询的条件
SELECT id,name,age ,sex ,favourite from person where id in (SELECT pid from dept where name='鼓励部')
八. 内连接
内连接(Inner Join)是一种数据库查询的方法,它用于将多个表中符合连接条件的记录进行组合,生成一个结果集。内连接基于两个或多个表之间的相同值连接列进行匹配,并返回符合连接条件的记录。
语法:
SELECT 列1, 列2, ...
FROM 表1
INNER JOIN 表2 ON 表1.列 = 表2.列;
其中,"表1" 和 "表2" 是待连接的两个表,"列" 是两个表中的连接列,即用来进行匹配的列。连接列一般是两个表中具有相同数据类型和相似数据的列。使用 ON 子句来指定连接条件,即连接列相等的条件。
# 笛卡尔积 查询出来的结果没有意义
select * from person,dept
# 显示内连接 inner可以省略
select * from person INNER JOIN dept on person.id=dept.pid
select * from person JOIN dept on person.id=dept.pid
select p.id,p.name,age,sex,favourite,birth,d.id deptid,d.name deptname,pid from person p JOIN dept d on p.id=d.pid
# 隐式内连接
select * from person,dept where person.id=dept.pid
注意:也可以给表名起别名,如果两个表中有相同的字段名称,那么需要用别名+点号来区别,否则报错。
九. 外连接
外连接(Outer Join)是一种数据库查询方法,它用于在连接两个或多个表时,返回包括不符合连接条件的记录在内的完整结果集。外连接允许我们获取左表或右表中所有记录,即使在另一个表中没有匹配的记录。
外连接一般分为左外连接、右外连接和全外连接三种类型。
左外连接(Left Outer Join):左外连接返回左表中的所有记录和右表中符合连接条件的记录。如果在右表中没有匹配的记录,将返回 NULL 值。
基本语法:
SELECT 列1, 列2, ...
FROM 左表
LEFT OUTER JOIN 右表 ON 左表.列 = 右表.列;
右外连接(Right Outer Join):右外连接返回右表中的所有记录和左表中符合连接条件的记录。如果在左表中没有匹配的记录,将返回 NULL 值。
基本语法:
SELECT 列1, 列2, ...
FROM 左表
RIGHT OUTER JOIN 右表 ON 左表.列 = 右表.列;
示例代码:
# 左外连接 left [outer] join 查询的是左边表的所有部分和右边表的交集
select p.id,p.name,age,sex,favourite,birth,d.id 部门id,d.name as deptname,pid from person p left outer join dept d on p.id=d.pid
select p.id,p.name,age,sex,favourite,birth,d.id 部门id,d.name as deptname,pid from person p left join dept d on p.id=d.pid
# 右外连接 right [outer] join 查询的是右边表的所有部分和左边表的交集
select p.id,p.name,age,sex,favourite,birth,d.id 部门id,d.name as deptname,pid from person p right outer join dept d on p.id=d.pid
总结
数据库查询是数据库管理系统中最常用和重要的功能之一。通过合理运用查询语句,可以从海量的数据中提取出需要的信息,满足不同的业务需求。