SQL 查询

本文详细介绍了SQL的基础语法,包括选择字段、去除重复、计算列、使用别名等操作。深入讲解了条件查询,如使用比较运算符、BETWEEN、IN、LIKE及IS NULL。还涉及到了排序查询、聚合函数、分组查询和分页查询的用法。通过对示例数据表`student`的操作,展示了如何进行复杂的数据筛选、计算和展示。
摘要由CSDN通过智能技术生成

DQL

语法
select
	字段列表
from
	表名列表
where
	条件列表
groub by
	分组字段
having
	分组之后的条件
order by
	排序
limit
	分页限定
基础查询

多个字段的查询

  • select 字段1,字段2,… from 表名;
  • 注意:如果查询所有字段,则可以使用*来替代字段列表

去除重复

  • 使用 distinct 关键字可以去除重复,如果对多个字段使用,则必须完全一致才可以去重

计算列

  • 一般可以使用四则运算计算一些列的值。一般只会进行数值型的计算

  • ifnull(表达式1,表达式2):null参与的运算,计算结果都是null

    表达式1:哪个字段需要判断是否为null

    表达式2:该字段如果为null后需要替换的值

起别名

  • 使用 as关键字,as也可以省略
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
age INT,
sex VARCHAR(5),
address VARCHAR(20)
);

INSERT INTO student(id,NAME,age,sex,address) VALUES
(1,"小狗",55,"男","香港"),
(2,"麻花藤",66,"男","马窖"),
(3,"刘德华",53,"男","香港"),
(4,"柳岩",44,"女","湖南"),
(5,"盖伦",43,"男","德玛西亚"),
(6,"艾希",32,"女","弗雷尔卓德");

SELECT * FROM student;

-- 查询姓名 和 年龄
SELECT NAME,age FROM student WHERE age>40;

-- 查询address
SELECT DISTINCT address FROM student;

SELECT NAME,address FROM student;

-- 计算每个数据的id和年龄之和
SELECT NAME,id,age,id+age FROM student;

-- 如果有null参与的计算,计算结果都为null
SELECT NAME,id,age,id + IFNULL(age,0) FROM student;

-- 起别名
SELECT NAME,id,age,id + IFNULL(age,0) AS 总分 FROM student;

SELECT NAME 姓名,id 学号,age 年龄,id + IFNULL(age,0)  总分 FROM student;

SELECT * FROM student;
条件查询

where子句后面跟条件

运算符

  • >、<、<=、>=、=、<>不等号

  • BETWEEN…AND 在a到b之间

  • IN(集合) 在集合里

  • LIKE 模糊查询

    _:单个任意字符

    %:多个任意字符

  • IS NULL 判断是否为null

  • and 或 && a和b

  • or 或 || a或b

  • not 或 ! 取反

-- 查询所有内容
SELECT * FROM student;

-- 查询年龄大于20岁
SELECT * FROM student WHERE age=32;

-- 查询年龄大于等于30小于等于40
SELECT * FROM student WHERE age>=30 AND age<=40;
SELECT * FROM student WHERE age BETWEEN 40 AND 50;-- 使用between and也可以做到

-- 查询年龄等于44或等于34的人
SELECT * FROM student WHERE age=34 OR age=44;
-- 使用IN所有在集合内的元素都作为OR类型的条件判断
SELECT * FROM student WHERE age IN (34,44);

UPDATE student SET age=NULL WHERE id=2;

-- 找出年龄等于null的人
SELECT * FROM student WHERE age IS NULL;
-- 查询年龄不等于null的
SELECT * FROM student WHERE age IS NOT NULL;

-- 查询姓刘的人
SELECT * FROM student WHERE NAME LIKE '刘%';

-- 查询姓名中第二个字是德的人
SELECT * FROM student WHERE NAME LIKE '_德%';

-- 查询姓名是三个字的人
SELECT * FROM student WHERE NAME LIKE '___';

-- 查询姓名中包含花的人
SELECT * FROM student WHERE NAME LIKE '%花%';
SELECT * FROM student WHERE NAME LIKE '%华%';
排序查询

语法

  • order by 子句
  • order by 排序字段1 排序方式1,排序字段2 排序方式2…

排序方式

  • ASC:升序
  • DESC:降序

注意

  • 如果有多个排序条件,则当前面的条件值一样时,才会判断后面的排序条件
#按年龄升序排序查询ASC
SELECT * FROM student ORDER BY age ASC;
#按年龄降序排序查询DESC
SELECT * FROM student ORDER BY age DESC;
#按照数学成绩排名,如果数学成绩一样,按英语成绩排名
SELECT * FROM student ORDER BY meth ASC,english ASC;
聚合函数

将一列数据作为一个整体,进行纵向的计算。(列的纵向计算)

  • count:计算个数

    #计算学生个数
    SELECT COUNT(NAME) FROM student;
    
  • max:计算最大值

    #计算数学成绩最大值
    SELECT MAX(meth) FROM student;
    
  • min:计算最小值

    #计算数学成绩最小值
    SELECT MIN(meth) FROM student;
    
  • sum:计算和

    #计算数学成绩的和
    SELECT SUM(meth) FROM student;
    
  • avg:计算平均值

    #计算数学成绩平均值
    SELECT AVG(meth) FROM student;
    

注意

  • 聚合函数的计算,排除null值

  • 解决方案1:选择不包含非空的列进行计算,对主键进行计算

  • 解决方案2:IFNULL函数对null值进行替换

    SELECT COUNT(IFNULL(english,0)) FROM student;
    
分组查询

语法

  • group by 分组字段
#按照性别分组,查询男生女生的平均成绩
SELECT sex,AVG(meth) FROM student GROUP BY sex;
#按照性别分组,查询男生女生的平均成绩,人数
SELECT sex,AVG(meth),COUNT(id) FROM student GROUP BY sex;
#按照性别分组,查询男生女生的平均成绩,人数。要求分数低于70分不参与
SELECT sex,AVG(meth),COUNT(id) FROM student WHERE meth>70 GROUP BY sex HAVING COUNT(id)>=1;
#使用别名简化
SELECT sex,AVG(meth),COUNT(id) 人数 FROM student WHERE meth>70 GROUP BY sex HAVING 人数>=1;

注意

  • 分组之后查询的字段:分组查询、聚合查询
  • where和having的区别:
  • where在分组之前进行限定,如果不满足条件,则不参与分组。having则在分组之后进行限定,如果不满足结果,则不会被查询出来
  • where后不可以跟聚合函数,having可以进行聚合函数的判断。
分页查询

语法

  • limit 开始的索引,每页查询的条数;

公式

  • 开始的索引 = (想要查看页数 - 1)* 每页显示的条数
#每页2条记录,想看第一页
SELECT * FROM student LIMIT 0,3; -- 第一页
SELECT * FROM student LIMIT 3,3; -- 第二页

注意

  • 分页操作是一个“方言”,各种数据库分页操作并不相同。limit语法是mysql的方言
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值