数据的简单查询

基本全部查询

  • 基本目标列查询
  • 重命名查询
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