SQL基本语法主要由4个操作子句组成:
- SELECT:对数据列进行筛选,控制行。
- FROM:可以确定数据的来源,日后的多表查询在此处扩充。
- WHERE:对数据进行筛选,控制行。
- ORDER BY:数据排序。
基本语法:
SELECT [DISTINCT] *| 列[别名], 列[别名],....
FORM 表名称[别名]
[WHERE 条件(s)]
[ORDER BY 字段 [ASC|DESC], 字段[ASC|DESC], ......];
SCOTT用户的数据表
1、部门表:DEPT
2、雇员表:EMP
3、工资等级表:SALGRADE
4、工资表:BONUS
简单查询:
SELECT * FROM emp;
SELECT empno,ename,job FROM emp;
// DISTINCT 去重复
SELECT DISTINCT job FROM emp;
SELECT empno,ename,sal*12 icome FROM emp;
SELECT empno,ename,(sal + 200 + 100) * 12 + sal * 3 income from emp;
SELECT ‘hello’,1,empno FROM emp;
SELECT ‘姓名:’ || ename || ‘, 职位:’ || job || ‘, 工资:’ || sal FROM emp;
总结特点:简单查询就是将一张数据表之中的全部数据进行查询,可以利用SELECT子句来控制要显示的数据列,并且在SELECT子句中可以使用四则运算,同时如果多行记录出现重复利用DISTINCT消除重复显示.
限定查询:
在使用 WHERE 子句的时候可以发现,可以同时设置多个条件,那么这多个条件之间可以使用逻辑运算进行链接,逻辑运算一共分为三种:
·与(AND):多个条件同时满足;
·或(OR):多个条件满足一个即可;
·非(NOT):将TRUE变为FALSE,FALSE变为TRUE。
SELECT * FROM emp
WHERE sal > 1500;
SELECT *
FROM emp
WHERE deptno = 10 AND sal >= 3000;
虽然在SQL命令之中,所有的执行命令部分大小写,但是对于所有保存的数据依然是区分大小写的。
而且可以发现,所有的关系运算符可以在数字运算上使用,也可以在字符串上使用。
SELECT *
FROM emp
WHERE ename=’SMITH’;
SELECT *
FROM emp
WHERE job = ‘SALESMAN’ OR job = ‘CLERK’;
// 范围运算 BETWEEN … AND …
// 但是范围运算并不一定只在数字上使用,也可以在日期或者字符串上使用。
SELECT *
FROM emp
WHERE sal BETWEEN 1500 AND 3000;
SELECT *
FROM emp
WHERE NOT hiredate BETWEEN ‘01-1月-1981’ AND ‘31-12月-1981’;
SELECT *
FROM emp
WHERE ename BETWEEN ‘BLAKE’ AND ‘KING’;
// 当然在自出需要说明一点,如果需要对计算求反,可以用NOT完成。
3、IS NULL 和 IS NOT NULL
判断某一个数据是否是NULL,指的是暂时不确定的内容
SELECT *
FROM emp
WHERE comm IS NOT NULL;
SELECT *
FROM emp
WHERE comm IS NULL;
4、 范围判断: IN | NOT IN
· 语法:字段 IN | IS NOT IN(值,值,….)
SELECT *
FROM emp
WHERE empno IN (7369,7839,7566,9999);
SELECT *
FROM emp
WHERE empno NOT IN (7369,7839,7566,9999);
注意:
在使用 IN 操作的时候,如果范围之中出现了NULL,不会有任何影响;
但是如果使用的是NOT IN 操作,如果查询范围之中存在NULL,则不会有任何数据显示。
SELECT *
FROM emp
WHERE empno IN (7369,7839,7566,9999, NULL);
SELECT *
FROM emp
WHERE empno NOT IN (7369,7839,7566,9999, NULL);
// 之所以此处没有数据显示,主要是考虑到程序的操作性能,为了解决程序bug存在。
5、 模糊查询: LIKE
如果现在想要判断某一数值之中是否有指定的内容,则可以通过LIKE完成,
例如:关键字查询,如果要使用LIKE,则应该清楚两个通配符:
· _ : 匹配任意一位字符;
· % :匹配任意多位字符(0位,1位, 多位)。
// 首字母为A
SELECT *
FROM emp
WHERE ename LIKE ‘A%’;
// 第二个字母为A
SELECT *
FROM emp
WHERE ename LIKE ‘_A%’;
// 只要有A
SELECT *
FROM emp
WHERE ename LIKE ‘%A%’;
// 只要有A去反
SELECT *
FROM emp
WHERE ename NOT LIKE ‘%A%’;
1、LIKE 不光可以用于字符串数据的判断,也可以在日期或数据上使用。
2、在使用LIKE查询的时候,如果没有设置任何查询关键字,则表示查询全部。
3.5、排序
如果现在希望显示的最终结果可以按照某一列的指定顺序排序,那么可以采用 ORDER BY 子句完成,
一定要记住,在所有的SQL语法中, ORDER BY 子句是写在所有语法的最后一行的,并且是最后一步执行的。
所以在所有的查询子句之中,只有 ORDER BY 可以使用 SELECT 子句中定义的别名。
· ASC: 升序(默认)。
· DESC: 降序
// 查询所有雇员信息,要求按工资由高到低排序.
SELECT *
FROM emp
ORDER BY sal DESC;
// 查询出所有20部门雇员的信息(雇员编号,姓名,年薪,部门编号),要求按年薪排序。使用年薪 icome 别名.
SELECT empno,ename,(sal*12) income, deptno dno
FROM emp
WHERE deptno = 20
ORDER BY income;
// 要求显示所有雇员信息,显示的结果按照工资由高到低排序,如果工资相同,则按照雇佣日期由早到晚排序。
SELECT *
FROM emp
ORDER BY sal DESC, hiredate ASC;
练习:
1、选择部门30中的所有员工。
SELECT *
FROM emp
WHERE deptno=30;
2、列出所有办事员(CLERK)的姓名,编号和部门编号。
SELECT ename,empno,deptno
FROM emp
WHERE job='CLERK';
3、找出佣金高于薪金60%的员工。
SELECT *
FROM emp
WHERE comm > 0.6 * sal ;
4、找出部门10中所有的经理(MANAGER)和部门20中所有的办事员(CLEARK)的详细资料。
SELECT *
FROM emp
WHERE (deptno=10 AND job='MANAGER') OR (deptno=20 AND job='CLERK');
5、找出部门10中所有经理(MANAGER),部门20中所有的办事员(CLERK),既不是经理又不是办事员但是其薪金大于或等于2000的所有员工的详细资料。
SELECT *
FROM emp
WHERE (deptno=10 AND job='MANAGER') OR (deptno=20 AND job='CLERK')
OR (job NOT IN ('MANAGER','CLERK') AND sal >= 2000);
6、找出收取佣金的员工的不同工作
SELECT DISTINCT job
FROM emp
WHERE comm IS NOT NULL;
7、找出不收取佣金或佣金低于100的员工。
SELECT *
FROM emp
WHERE comm IS NULL OR comm < 100;
8、显示不带有”R”的员工姓名
SELECT ename
FROM emp
WHERE ename NOT LIKE '%R%';
9、显示姓名字段的任何位置包含’A’的所有员工的姓名,显示的结果按照基本工资由高到底排序,如果基本工资相同则按雇佣年限从早到晚排序,如果雇佣日期相同,则按职位排序。
SELECT ename
FROM emp
WHERE ename LIKE '%A%'
ORDER BY sal DESC, hiredate ASC, job;