数据的简单查询
基本全部查询
- 基本目标列查询
- 重命名查询
show databases;
-- 使用目标数据库
use imooc_demo;
-- 查找全部字段
SELECT * from t_emp;
-- 查找这三列从t_emp表
SELECT empno, ename, sal from t_emp;
-- 改名查询
SELECT ename,empno,sal*12 AS income_year FROM t_emp;
数据分页
- 偏移量 0,20 从0 到后取20条
- 20往后取20 就是 20,20
-- 分页查询 下边含义是0-5条
SELECT empno ,ename,sal FROM t_emp LIMIT 0,5;
-- 下边等价于0-10的意思
SELECT empno ,ename,sal FROM t_emp LIMIT 10;
FROM -> SELECT -> LIMIT
结果集排序
按照某种顺序 必须使用ORDER BY
执行顺序: SELECT…FROM… ORDER BY 列名 [asc | desc]
-- 排序--升序
SELECT empno ,ename,sal,deptno FROM t_emp ORDER BY sal ASC;
-- 排序--降序
SELECT empno ,ename,sal,deptno FROM t_emp ORDER BY sal DESC;
多字段排序
- 规定 首要 \ 次要 排序条件
-- 多个排序字段,工资相同按入职排序
SELECT empno ,ename,sal,hiredate,deptno FROM t_emp ORDER BY sal DESC ,hiredate ASC;
-- 查看前五的
SELECT empno,ename,sal FROM t_emp ORDER BY sal DESC LIMIT 0,5;
执行顺序: FROM -> SELECT -> ORDER BY -> LIMIT
去除重复记录
比如从员工表中查询多少种职业,可能出现重复记录
加上 DISTINCT
字段
-- 查询job 不去重
SELECT job FROM t_emp;
-- 查询job 去重
SELECT DISTINCT job FROM t_emp ;
- 注意:
- distinct 的select只能查询一列数据,如果查询多列,重复记录就会失效
-- 不能重复用--两个字段,功能消失
SELECT DISTINCT job, ename FROM t_emp ;
-- 不能重复用--两个字段都加,报错
SELECT DISTINCT job,DISTINCT ename FROM t_emp ;
-- 不能重复用--后个字段加,报错
SELECT job,DISTINCT ename FROM t_emp ;
条件查询
SELECT…FROM …WHERE 条件 and or 条件…
-- 条件查询 10部门 底薪大于2000的
SELECT empno,ename,sal FROM t_emp WHERE deptno=10 AND sal >=2000;
-- 条件查询:10 20 两个部门,薪资大于2000的
SELECT empno,ename,sal , deptno FROM t_emp WHERE (deptno=10 OR deptno=20) AND sal >=2000;
where 四类运算符
- 数学运算符 + - * / %
- 比较运算符
- 逻辑运算符
- 按位运算符
-- 部门10 ,年薪=底薪+提成,12个月大于15000的,
SELECT empno , ename , sal, hiredate
FROM t_emp
WHERE deptno=10 and (sal+ifnull(comm,0))*12>=15000;
and datediff(now(),hiredate)/365>=20;
比较符号运算
表达式 | 意义 | 例子 |
IS NULL | 为空 | comm IS NULL |
IS NOT NULL | 不为空 | comm IS NOT NULL |
BETWEEN AND | 范围 | sal BETWEEN 2000 AND 3000 |
LIKE | 模糊查询 | ename LIKE ‘A%’ %代表0-多个字符 |
REGEXP | 正则表达式 | ename REGEXP ‘[a-zA-Z]{4}’ |
下边是mysql的写法
-- 测试 IS NOT NULL
SELECT *
FROM t_emp
WHERE comm IS NOT NULL;
-- 测试 BETWEEN AND
SELECT *
FROM t_emp
WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000;
-- 测试 BETWEEN AND + LIKE %占位符
SELECT *
FROM t_emp
WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "%A%"; -- 前后都是可能有东西
-- 测试 BETWEEN AND + LIKE _占位符
SELECT *
FROM t_emp
WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "_lake"; -- 这是记住了前边有1位,后边是lake的
-- 测试 BETWEEN AND + 正则表达式
SELECT *
FROM t_emp
WHERE comm IS NOT NULL -- 它有佣金
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";
逻辑运算符
表达式 | 意义 | 例子 |
AND | 与 关系 | age >18 AND sex=‘男’ |
OR | 或 关系 | empno = 8000 OR deptno =20 |
NOT | 非 关系 | NOT deptno =20 |
XOR | 异或 关系 | age > 18 XOR sex=“男” |
练习代码如下
-- 10和20部门之外
SELECT ename,deptno
FROM t_emp
WHERE NOT deptno IN(10,20) ;
-- 10和20部门之外 异或关系 不是10,20部门的 异或 工资大于2000的
SELECT ename,deptno,sal
FROM t_emp
WHERE NOT deptno IN(10,20) XOR sal>=2000
ORDER BY deptno,sal;
二级制按位运算
- 二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算
表达式 | 意义 | 例子 |
& | 位与关系 | 3&7 |
丨 | 位或关系 | 3丨7 |
~ | 位取反 | ~10 |
^ | 位异或 | 3^7 |
<< | 左移 | 10<<1 |
>> | 右移 | 10>>1 |
-- 按位运算符测试
SELECT 3&7; -- 答案3
SELECT 3 | 7; -- 答案7
SELECT ~ 7; -- 答案18446744073709551608
SELECT 3 ^ 7; -- 答案4
SELECT 10 << 1; -- 答案20
SELECT 10 >> 1; -- 答案5
where子句注意事项
- where子句中,条件执行顺序从左往右,应该吧索引条件,或者筛选掉最多纪录的条件写在最左边
- 例如:
-- where注意事项:写左边
SELECT empno,ename FROM t_emp
WHERE ename = "FORD" AND sal>=2000;
SELECT empno,ename FROM t_emp
WHERE deptno=10 AND sal>=2000;
各种子句执行顺序
FROM -> WHERE -> SELECT -> ORDER BY -> LIMIT