select列
全列查询
语法:
SELECT * FROM exam_result
指定列查询
语法
SELECT id, name, english FROM exam_result
查询字段为表达式
表达式不包含字段
语法
SELECT id, name, 10 FROM exam_result;
这里解释下 单个数字也算是一个表达式 但是由于并没有这一列 所以说该列的所有记录都默认为该数字
表达式包含一个字段
此时english+10
列中就会显示英语成绩+10的数据 但是该列并不会影响数据库中原有的数据
表达包含多个字段
语法
SELECT id, name, chinese + math + english FROM exam_result;
为查询结果取别名
我们可以直接在表达式后面加上一段字符作为该表达式的别名
需要注意的是 该别名只能在选择阶段取
结果去重
语法:
SELECT **DISTINCT** math FROM exam_result;
where条件
比较运算符
运算符 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于(这两个符号都是NULL不安全的) |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。like ‘A%’。% 表示任意多个(包括 0 个)任意字符;like ‘A_’。_ 表示任意一个字符 |
运算符 | 说明 |
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
找到英语小于60分的人及其英语成绩
语文成绩在 [80, 90] 分的同学及语文成绩
查询在区间中的数据有两种用法
用法一:
用法二:
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
筛选出叫孙某某的同学及叫孙某的同学(模糊搜索)
总分在 200 分以下的同学
我们这里发现在前面给三门成绩取了别名总分之后在后面缺并不能使用 这是为什么呢?
这里本质上其实是因为sql语句中每句话的执行顺序不同所引起的
我们想一想 是不是首先要筛选出总分低于200分成绩的人 然后才能选择他们的名字和成绩啊
也就是说 where语句实际上是比select语句要先执行的 所以自然不能使用select语句中取的别名了
语文成绩 > 80 并且不姓孙的同学
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
null的查询
我们查询NULL的时候不能使用等于号 我们这里推荐的用法是IS 或者 NOT IS
order by asc/desc(对结果进行升序/降序)
- ASC 为升序(从小到大)
- DESC 为降序(从大到小)
- 默认为 ASC
- NULL 视为比任何值都小
同学及数学成绩,按数学成绩升序/降序显示
查询同学各门成绩,依次按 数学降序,英语降序,语文升序的方式显示
解释下数学降序,英语降序,语文升序的方式显示
这句话的含义 我们首先按照数学降序的方式排序 如果数学成绩相同就按照英语成绩降序 如果数学英语成绩还相同就按照语文成绩升序
查询同学及总分,由高到低
大家看到这里的sql语句是不是有点奇怪 为什么一会儿能用别名一会儿不能用别名呢?
这里能够使用别名的原因其实是因为排序这个阶段要在选择了数据之后
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
limit
对于未知表查询的时候我们最好加上一条limit 1 避免表中数据过大数据库卡死的情况