Skip to content

DQL单表查询

一、单表查询

通用语法:select 列名 from 表名

sql
# 查询单列
select 指定列
from.表名;
# 查询多列
select 指定列, 指定列
from.表名;
# 查询所有列
select *
from.表名;
# distinct, 写在select后面,列前面,可以实现去重
select distinct 指定列
from.表名;
# as 给列活着表起别名,写在列或表后面,可以省略
select distinct p.指定列 as '价格'
from.表名 as p;
# 省略as
select distinct p.指定列 '价格'
from.表名 p;

1. 条件查询

1.1 比较运算符

a. 相等性:>大于 <小于 >=大于等于 <=小于等于 =等于 !=不等于

b. 区间:between 数1 and 数2 数1到数2之间,包含边界

​ in(数1,数2,数3,...) 数1或者数2或者数3...

c. 相似度:like '_xx%' %表示0或任意个字符,_表示一个字符

d. 非空:is null 为空 is not null 不为空

1.2 逻辑运算符

与 and 或 or 非 not

1.3 补充

cast:针对查询的结果, 修改对应列的字段类型

sql
# 语法:cast(字段 as 数据类型)
select cast(salary * 1.1 as decimal(10, 2)) as '涨薪10%'
from company_db.employee;

2. 排序查询

sql
# 语法:
order by 字段1 asc(升序)|desc(降序), 字段1 asc(升序)|desc(降序)   # 在字段1排序的基础上,以字段2排序

注:1. 字符串比对时:逐个字符比对

​ 2. order by 可以结合where使用,先写where后写order by

3. 聚合查询

聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空(NULL)值

sql
# 语法:
select count(字段) from.表名
# 常见的聚合函数
count			求数据的行数
max				求数据的最大值
min				求数据的最小值
sum				求数据的总和
avg				求数据的平均值

注:查询时聚合了,只展示聚合的,故聚合和聚合使用,不聚合和不聚合使用

count(1)和count(*):统计行数的写法

count(1):不会去表里挨个查数据是不是null,直接拿1做判断,性能更好

count(*):判断所有数据都为空时忽略,一般数据库中不会有,故可以用来统计行数

4. 分组查询

sql
# 语法:(group by 字段)
# 按年级加班级分组,查询班级平均分
select grade '年级', class '班级', cast(avg(score) as decimal(10, 2)) '班级平均分', sum(score) '班级总分'
from company_db.scholl
group by grade, class;

注: 1. 分组(整合数据:以组为单位)必聚合(查看组的信息)

  1. 以什么分组就以什么查询,查询的列必须是分组的字段或者是聚合的字段
  2. having与where:都是条件查询,having适合分组后的情况,where适合不分组的情况

5. 查询内容插入新表

sql
# 语法:(已有表添加数据)
insert into.表名(字段1,字段2,...) select (字段a,字段b,...)  from.表名

注: 1. 查询的结果 和 保存到目标表的结构要保持一致

  1. 查询的结果的字段顺序要和目标表的字段的顺序保持一致, 当然类型、长度也要一致
sql
# 另一种写法:(直接创表并添加数据)
create table.新表 
[( 字段1 数据类型,
   字段2 数据类型,
   字段3 数据类型,
   ...
)]
as
select
   字段1 ,
   字段2 ,
   字段3 ,
   ...
from.表名 where 条件;

6. 分页查询(mysql方言)

sql
# 语法:
limit [从那开始(默认是0,表示第一条数据)]  取多少条(查询数量可以大于数据的数量)
# 查询前十条数据
select *
from company_db.scholl
limit 10;
# 查询第7到19条数据
select *
from company_db.scholl
limit 6 , 13;

7. 扩展

sql
# 如果列用了字符串类的数据,那么每一行都将用这个字符进行填充,如果表头想自定义还可以用as起个别名
-- 排序查询:按成绩降序查看所有数学成绩
select '数学' as '科目' ,score
from school_db.student_scores
where subject = '数学'
order by score desc;

二、多表查询(概念)

一次性从好几张有关系的表里把我们需要的数据“拼”在一起查出来,核心思想是通过一个共同的“桥梁”字段(通常是主键和外键)把多张表连接起来。

1. 外键

假设有两张表A和B,B表的某列的值引用了A表的主键列的值,则B表的这一列称为B表的外键列 (Foreign Key),其中A表称为主表,B表称为从表。

1.1 外键约束

sql
# 语法:
	[constraint 约束名] foreign key (外键字段) reference 主表名(主键)
	
放置位置:
	建从表的时候, 在整个字段的最后面

1.2 外键约束的作用:

  • 保证插入数据的准确性:从表中外键的值在主表主键中必须有对应的值

  • 保证删除数据的完整性:主表的主键值被从表外键引用之后,主表中对应的记录不能被删除

2. 表与表之间的关系

2.1 一对一

  • A表一行 → B表一行

  • B表一行 → A表一行

2.2 一对多

  • A表一行 → B表多行

  • B表一行 → A表一行

2.3 多对多

  • A表一行 → B表多行

  • B表一行 → A表多行