DQL数据查询语言(一)

本文介绍了DQL(数据查询语言)的基础知识,包括SELECT关键字用于查询数据,模糊查询,过滤重复数据,字段表达式,字段别名,排序,数据完整性的概念如实体完整性、域完整性和参照完整性,并提供了相关的示例操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DQL(数据查询语言)(简单的)

DQL:Data Query Language
作用:查询数据
常用关键字:SELECT


创建一个学生表

create table stu
(
    id int,
    name varchar(30),
    sex char(2),
    age int,
    address varchar(50)
);

insert into stu values(1,'张无忌','男'20,'北京');
insert into stu values(2,'小龙女','女'18,'古墓');
insert into stu values(3,'黄蓉','女'15,'桃花岛');
insert into stu values(4,'韦小宝','男'24,'扬州');
insert into stu values(5,'乔峰','男'34,'雁门关');
insert into stu values(6,'张果老','男'34,'雁门关');
insert into stu values(7,'老张','男'38,'黑木崖');
insert into stu values(8,'黄药师','男'34,'桃花岛');
insert into stu values(9,'张','女'34,'桃花岛');
insert into stu values(10,'张','男'34,'桃花岛');

查看所有的数据

select * from stu;

查看小龙女的信息

select * from stu where id = 2;
select * from stu where name='小龙女';

查看年龄在20~30之间的人

select * from stu where age >= 20 and age <= 30;

//包括20和30
//select * from stu where age between 20 and 30;

查看所有人的姓名

select name from stu;

查看所有人的姓名,年龄,性别

select name,age,sex from stu;

模糊查询

select * from 表名 where 字段名 like 字段表达式

%表示任意字符数

_表示任意的一个字符


查询所有以“张”开头的人

select * from stu where name like '张%';

查询姓名中含有“张”这个字的人

select * from stu where name like '%张%';

查询姓名中含有“张”这个字并且姓名的长度是3个字的人

select * from stu where name like '张__' or name like '_张_' or name like '__张'; 

过滤重复的数据

查询表中总共有几种性别

select distinct sex from stu;

查询姓名和年龄整体都不同的记录

select distinct name,set from stu;

字段可以有表达式

创建新表分数表

create table score
(
    id int,
    sid int,
    china int,
    english int,
    history int
);

insert into score values(1,1,68,55,81);
insert into score values(2,3,86,23,34);
insert into score values(3,4,34,87,76);
insert into score values(4,6,98,99,93);
insert into score values(5,7,24,39,66);

把每人的china加上10分

select id,china+10,english,history from score; 

给字段起别名

as 可以省略

select id as 编号,china as 语文,english as 英语,history 历史 from score;

查看所有人考试的总分

select id,china + english + history 总分 from score;

查看所有总分大于200的人

select * from score where china+english+history > 200;

查询家在桃花岛或者黑木崖的人

select * from stu where address in('桃花岛','黑木崖');

查询没有参加考试的人

select id,name from stu where id not in(select sid from score);

查询没有地址的人

select * from stu where address is null;

查询地址不是空的人

select * from stu where address is not null;

排序(order by)

对考试的人的语文升序排序

select * from score order by china asc;

对考试的人的历史降序排序

select * from score order by history desc;

根据多个字段进行排序(语文升序,对语文成绩一样的人再进行历史降序)

select * from score order by china asc,history desc;

根据考试总分降序排序

select * from score order by china + english + history desc;

数据完整性

为了保证插入到数据中的数据是正确的,防止用户可能存在的输入错误

  • 实体完整性
    • 主键:唯一的去区分每一条记录的一列或者多列的值。
    • 特点:唯一,非空。
  • 域完整性

    指数据库表的列(即字段)必须符合某种特定的数据类型或约束。

  • 参照完整性

    保证一个表的外键和另一个表的主键对应

创建一个表

create table stu
(
    id int primary key,     #主键约束(唯一,非空)
    name varchar(30) unique,    #唯一约束(可以为空,但是只能有一个)
    sex char(2) not null,   #非空约束
    age int check(age > 0 and age < 100),   #检查约束(MySQL不支持)
    address varchar(50) default '北京'        #默认约束
)

再创建一个表和上表建立联系

create table score
(
    id int primary key,
    sid int,
    china int,
    english int,
    history int,
    constraint sid_FK foreign key(sid) references stu(id)
)

在表外创建引用约束

alter table score add constraint stu_score_FK foreign key (sid) references stu(id);

删alter table score drop foreign key stu_score_FK;d自动增长(系统帮你创建)

create table t
(
    id int primary key auto_increment,
    name varchar(20)
);

insert into t(name) values('张三');

注意:

  1. 添加记录时必须先添加主表中的记录,再添加子表中的数据
  2. 不能更改主表中具有外键约束的记录的主键
  3. 删除记录时不允许删除具有外键关系的主表中的记录(删除的顺序应当是先删除子表中的记录,然后删除主表中的记录)
<think>好的,用户想了解MySQL中DQL数据查询语言)的使用教程和示例。我需要先整理DQL的基本概念,然后分步骤讲解,并给出对应的示例代码。还要结合用户提供的引用内容,特别是引用1中的常见操作示例,引用2中的子查询,以及引用3中的排序查询部分。 首先,DQL的核心是SELECT语句,所以应该从基础查询开始,包括选择特定列、使用别名、去重等。然后逐步深入到条件查询,使用WHERE子句,包括比较运算符、逻辑运算符和模糊查询LIKE。接着是排序查询,根据引用3的内容,需要解释ORDER BY的用法和排序方式(ASC/DESC)。 接下来是聚合函数,这部分对数据分析很重要,比如COUNT、SUM、AVG等,要给出示例说明如何使用。分组查询GROUP BY和HAVING子句也是关键点,需要说明如何分组和过滤分组后的数据。 子查询部分需要参考引用2的内容,解释什么是子查询,如何在不同位置使用,比如在WHERE或FROM子句中。关联查询(JOIN)也是必须涵盖的,包括内连接、左连接、右连接的区别和应用场景。 分页查询LIMIT在引用3中也有提到,需要说明其语法和实际应用,尤其是在处理大量数据时的作用。组合查询UNION和UNION ALL的区别也需要简要说明。 最后,综合示例部分可以结合多个子句,展示个复杂的查询是如何构建的。同时,注意事项部分要提醒用户常见错误,比如GROUP BY和HAVING的使用顺序,性能优化的小技巧等。 在生成相关问题时,要覆盖教程中提到的各个部分,比如基本语法、条件查询、子查询、性能优化等,确保用户能通过问题进步深入学习。同时,确保所有示例代码使用正确的格式,数学表达式和独立公式按照要求处理,虽然这里可能用不到太多数学内容,但变量名如表名、列名需要用$符号包裹,例如$table_name$。 需要检查是否有遗漏的部分,比如是否有足够的示例,是否涵盖了用户提供的引用内容,特别是子查询和排序查询部分。另外,确保回答结构清晰,步骤分明,符合用户要求的教程和示例格式。最后,添加相关的引用标注,比如在子查询部分标注引用2,在排序部分标注引用3等。</think>### MySQL DQL数据查询语言教程与示例 #### DQL基础语法 DQL(Data Query Language)的核心是`SELECT`语句,用于从数据库中检索数据。 **基本语法**: ```sql SELECT 列名1, 列名2 FROM 表名 [WHERE 条件] [ORDER BY 排序字段] [LIMIT 分页参数]; ``` **示例1:基础查询** ```sql -- 查询所有列 SELECT * FROM employees; -- 查询特定列并去重 SELECT DISTINCT department_id FROM employees; -- 使用别名 SELECT employee_id AS 编号, salary * 12 年收入 FROM employees; ``` --- #### 二、条件查询(WHERE) 通过`WHERE`子句筛选数据,支持运算符: - **比较运算符**:$=$, $>$, $<$, $>=$, $<=$, $<>$ - **逻辑运算符**:$AND$, $OR$, $NOT$ - **模糊查询**:$LIKE$ **示例2**: ```sql -- 查询薪资大于10000的IT部门员工 SELECT name, salary FROM employees WHERE department = 'IT' AND salary > 10000; -- 查询姓名以"张"开头的员工 SELECT name FROM employees WHERE name LIKE '张%'; ``` --- #### 三、排序查询(ORDER BY) 使用`ORDER BY`对结果排序,支持多字段排序[^3]: **语法**: ```sql SELECT 字段列表 FROM 表名 ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC]; ``` **示例3**: ```sql -- 按薪资降序、入职时间升序排列 SELECT name, salary, hire_date FROM employees ORDER BY salary DESC, hire_date ASC; ``` --- #### 四、聚合函数 常用聚合函数: - $COUNT()$:统计行数 - $SUM()$:求和 - $AVG()$:平均值 - $MAX()$/$MIN()$:最大/最小值 **示例4**: ```sql -- 统计各部门平均薪资 SELECT department_id, AVG(salary) 平均薪资 FROM employees GROUP BY department_id; ``` --- #### 五、分组查询(GROUP BY) 通过`GROUP BY`对数据分组,`HAVING`过滤分组结果: **示例5**: ```sql -- 查询平均薪资大于8000的部门 SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 8000; ``` --- #### 六、子查询(Subquery) 子查询可嵌套在`WHERE`、`FROM`或`SELECT`中[^2]: **示例6**: ```sql -- 查询薪资高于部门平均水平的员工 SELECT name, salary FROM employees e1 WHERE salary > ( SELECT AVG(salary) FROM employees e2 WHERE e2.department_id = e1.department_id ); ``` --- #### 七、关联查询(JOIN) **常用连接类型**: - **内连接**(INNER JOIN):返回交集 - **左连接**(LEFT JOIN):返回左表全部+右表匹配 - **右连接**(RIGHT JOIN):返回右表全部+左表匹配 **示例7**: ```sql -- 查询员工及其部门名称 SELECT e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.id; ``` --- #### 八、分页查询(LIMIT) 使用`LIMIT`实现分页: **语法**: ```sql SELECT 字段列表 FROM 表名 LIMIT 起始索引, 每页数量; ``` **示例8**: ```sql -- 查询第2页数据(每页10条) SELECT * FROM employees LIMIT 10, 10; ``` --- #### 九、组合查询(UNION) 合并多个`SELECT`结果: ```sql SELECT 字段 FROM 表1 UNION [ALL] SELECT 字段 FROM 表2; ``` --- #### 十、综合示例 ```sql -- 查询2023年销售额前5名的产品 SELECT p.product_name, SUM(s.amount) 总销售额 FROM sales s INNER JOIN products p ON s.product_id = p.id WHERE YEAR(s.sale_date) = 2023 GROUP BY p.product_name ORDER BY 总销售额 DESC LIMIT 5; ``` --- ### 注意事项 1. **性能优化**:避免`SELECT *`,尽量指定列名[^1]。 2. **索引使用**:WHERE条件中的字段建议加索引。 3. **子查询深度**:多层嵌套子查询可能影响效率,可改用JOIN[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值