MySQL基础——DQL

DQL(Data Query Language,数据查询语言)是SQL中的一个子集,主要用于查询数据库中的数据。DQL的核心语句是 SELECT,它用于从一个或多个表中提取数据,并能够通过各种条件进行过滤、排序和聚合操作。下面是DQL的相关知识点及示例:

1. SELECT 语句

SELECT 是 DQL 中的核心语句,用于从表中查询数据。

基本语法:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 条件;
  • 列名1, 列名2:需要查询的列。
  • FROM:指定查询的表。
  • WHERE:可选的条件,用于过滤返回的行。
示例:

查询 users 表中的 nameemail 列:

SELECT name, email FROM users;
 设置别名
语法:SELECT 字段1 AS 别名1, 字段2 AS 别名2 ... FROM 表名;
示例:

name 列的别名设置为 username,将 email 列的别名设置为 user_email

SELECT name AS username, email AS user_email FROM users;
去除重复记录
语法:SELECT DISTINCT 字段列表 FROM 表名;
示例:

查询 users 表中不同的城市(去除重复的 city):

SELECT DISTINCT city FROM users;
示例2:

查询 users 表中不同的 emailcity 组合:

SELECT DISTINCT email, city FROM users;

2. SELECT * 查询所有列

使用 * 可以查询表中的所有列。

示例:

查询 users 表的所有列:

SELECT * FROM users;

3. WHERE 子句(条件查询)

WHERE 子句用于过滤查询结果,返回满足条件的行。

基本语法:
SELECT 列名 FROM 表名 WHERE 条件;
示例:

查询 users 表中 age 大于 25 的用户:

SELECT * FROM users WHERE age > 25;
2. 比较运算符

WHERE 子句中,常用的比较运算符包括:

  • =:等于
  • !=<>:不等于
  • >:大于
  • <:小于
  • >=:大于或等于
  • <=:小于或等于
示例:
# 查询 users 表中 age 等于 30 的用户:

SELECT * FROM users WHERE age = 30;

# 查询 users 表中 age 不等于 30 的用户:

SELECT * FROM users WHERE age != 30;
3. 逻辑运算符

逻辑运算符用于在 WHERE 子句中组合多个条件:

  • AND:所有条件都必须为真。
  • OR:只要有一个条件为真。
  • NOT:条件不成立时为真。
示例:
# 查询 users 表中 age 大于 25 且 city 为 'New York' 的用户:

SELECT * FROM users WHERE age > 25 AND city = 'New York';

# 查询 users 表中 age 大于 25 或 city 为 'New York' 的用户:

SELECT * FROM users WHERE age > 25 OR city = 'New York';
4. BETWEEN 操作符

BETWEEN 用于筛选值在某个范围内的记录。

基本语法:
SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 最小值 AND 最大值;
示例:

查询 users 表中 age 在 20 到 30 岁之间的用户:

注意小的值在前,大的值在后,否则无法筛选

SELECT * FROM users WHERE age BETWEEN 20 AND 30;
5. IN 操作符

IN 用于筛选列值在给定列表中的记录。(相当于或)

基本语法:
SELECT 列名 FROM 表名 WHERE 列名 IN (值1, 值2, ...);
示例:

查询 users 表中 city 为 'New York'、'Los Angeles' 'Chicago' 的用户:

SELECT * FROM users WHERE city IN ('New York', 'Los Angeles', 'Chicago');
6. LIKE 操作符

LIKE 用于进行模糊匹配,常用于文本数据。通常结合通配符 %(表示零个或多个字符)和 _(表示一个字符)使用。

基本语法:
SELECT 列名 FROM 表名 WHERE 列名 LIKE 模式;
示例:

查询 users 表中 name 以 'A' 开头的用户:A%表示开头为A,其余的都行

SELECT * FROM users WHERE name LIKE 'A%';

查询 users 表中 name 中包含 'son' 的用户:

SELECT * FROM users WHERE name LIKE '%son%';
7. IS NULLIS NOT NULL

IS NULL 用于查找列中值为 NULL 的记录,IS NOT NULL 用于查找列中不为 NULL 的记录。

基本语法:
SELECT 列名 FROM 表名 WHERE 列名 IS NULL; SELECT 列名 FROM 表名 WHERE 列名 IS NOT NULL;
示例:

查询 users 表中 email 为空的用户:

SELECT * FROM users WHERE email IS NULL;

查询 users 表中 email 不为空的用户:

SELECT * FROM users WHERE email IS NOT NULL;

 4. 聚合函数:

通常对字段(列)进行操作

  • COUNT()
    • 计算选定列中不为 NULL 的记录数。
    • 示例:SELECT COUNT(*) FROM students; 计算 students 表中记录的总数。
  • SUM()
    • 返回选定列的数值总和。
    • 示例:SELECT SUM(salary) FROM employees; 计算 employees 表中所有员工的工资总和。
  • AVG()
    • 返回选定列数值的平均值。
    • 示例:SELECT AVG(age) FROM users; 计算 users 表中用户的平均年龄。
  • MAX()
    • 返回选定列中的最大值。
    • 示例:SELECT MAX(price) FROM products; 找到 products 表中价格最高的商品。
  • MIN()
    • 返回选定列中的最小值。
    • 示例:SELECT MIN(price) FROM products; 找到 products 表中价格最低的商品。
#聚合函数
select count(IdCard) from user;#null值不参与聚合函数运算
select  avg(age) from user;
select  max(age )from user;
select  min(age) from user;
select sum(age) from user where adress='湖南';

5. GROUP BY 子句(分组查询)

GROUP BY 用于将查询结果按某个或多个列进行分组,常常与聚合函数(如 COUNTSUMAVG 等)一起使用。

基本语法
SELECT 列名, 聚合函数 FROM 表名 GROUP BY  列名;
示例:

统计 users 表中每个城市的用户数量:

SELECT city, COUNT(*) AS user_count FROM users GROUP BY city;
HAVING 子句:

HAVING 子句用于过滤 GROUP BY 的结果。它与 WHERE 类似,但 HAVING 主要用于过滤分组后的结果,而 WHERE 则用于在分组前过滤数据。

基本语法:
SELECT 列名, 聚合函数 FROM 表名 GROUP BY 列名 HAVING 条件;
示例:

查询 users 表中用户数量大于 10 的城市:

SELECT city, COUNT(*) AS user_count FROM users GROUP BY city HAVING user_count > 10;
#查询年龄小于等于60的,并且根据工作地址分组
#获取员工数量大于等于2的工作地址,其中adress_cnt是count的重命名
select adress,count(*) AS adress_cnt from user where age<=60 group by adress having adress_cnt>=2;

执行该查询时,步骤如下:

  • 过滤掉年龄大于 60 岁的用户(如 David)。
  • adress 分组
  • 统计每个组的人数

6. ORDER BY 子句(排序查询)

ORDER BY 用于对查询结果进行排序,可以按升序(ASC)或降序(DESC)排列。

基本语法:
SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];
示例:

查询 users 表中的用户,并按 age 列降序排列:

SELECT * FROM users ORDER BY age DESC;

支持多字段排序 

#根据年龄对公司员工进行升序排序
select *from user order by age asc;#asc可以省略
select *from user order by age ;

#降序排序
select * from user order by age desc;

#根据年龄升序排序,如果年龄相同就按照name大小的倒序排序
select *from user order by  age asc,name desc ;

7. LIMIT 子句(分页查询)

LIMIT 用于限制返回的结果集中的行数。通常用于分页查询。

基本语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;

LIMIT 起始索引, 查询记录数:通过 LIMIT 限制返回的行数。

  • 起始索引:表示从哪一行开始返回结果,索引从 0 开始计数。
  • 查询记录数:表示要返回的行数。

注意
起始索引从0开始,起始索引通常使用以下公式计算:

起始索引 = (页码 - 1) * 每页展示的记录数

举例:

假设你想要每页展示 5 条记录:

  • 第一页

    SELECT * FROM user LIMIT 0, 5;
    • 起始索引为 (1 - 1) * 5 = 0,显示第 1 到第 5 条记录。
  • 第二页

    SELECT * FROM user LIMIT 5, 5;
    • 起始索引为 (2 - 1) * 5 = 5,显示第 6 到第 10 条记录。
  • 第三页

    SELECT * FROM user LIMIT 10, 5;
    • 起始索引为 (3 - 1) * 5 = 10,显示第 11 到第 15 条记录。

分页查询是数据库的方言,不同的数据库有不同的实现

如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。 

也就是

SELECT 字段列表 FROM 表名 LIMIT 查询记录数;
示例:

查询 users 表中的前 5 行数据:

SELECT * FROM users LIMIT 5;

练习:

# 查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工
select * from employee where gender = '男' and age between 20 and 40 AND name like '__';

# 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender,count(*) from employee where age <= 60 group by gender;

# 查询所有年龄小于等于35岁员工的姓名和年龄,并且对查询结果按照年龄升序排序,
# 如果年龄相同就按照id升序排序
 select name,age from employee where age <= 35 order by age,id;

# 查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息对查询的结果按年龄降序排序,年龄相同按id值升序排序。
select * from employee where gender = '男' AND age between 20 and 40 order by age desc, id limit 5;

 

DQL的编写顺序和执行顺序:

这是我们通常按照 SQL 语法编写查询语句的顺序。一般的 SQL 查询编写顺序如下:

SELECT column1, column2
FROM table_name
WHERE condition
GROUP BY column
HAVING condition
ORDER BY column
LIMIT row_count OFFSET offset;

编写顺序解释

  1. SELECT:选择要返回的列。
  2. FROM:指定数据表的名称。
  3. WHERE:过滤条件,选择符合条件的数据。
  4. GROUP BY:将查询结果按某列分组。
  5. HAVING:对分组后的数据进行过滤,类似于 WHERE,但用于聚合结果。
  6. ORDER BY:对查询结果进行排序。
  7. LIMIT/OFFSET:限制返回的行数,分页查询中常用。
执行顺序:
  1. FROM employees:首先从 employees 表中读取所有的数据。
  2. WHERE age > 30:对表中的数据进行筛选,过滤出 age > 30 的记录。
  3. GROUP BY department:对筛选后的数据按照 department 列进行分组。
  4. HAVING COUNT(*) > 5:对分组后的数据进行过滤,保留员工数量超过 5 的部门。
  5. SELECT name, COUNT(*):根据查询条件返回指定的列,即部门名称和员工数量。
  6. ORDER BY COUNT(*) DESC:按员工数量进行降序排序。
  7. LIMIT 10:限制返回的记录数为 10 条。
  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值