基本SELECT语句语法
SELECT子句 表示所需检索的数据列。
FROM子句 表示检索的数据来自哪个表。
语句(statement):一条完整的SQL命令如:
select * from emp;
–子句(clause):部分的SQL语句,通常是由关键字加上其它语法元素构成,例如,SELECT
* 是一个子句,FROM table也是一个子句。
SQL语句的书写规则
–不区分大小写,也就是说SELECT,select,Select,执行时效果是一样的。
–可以单行来书写,也可以书写多行,建议分多行书写,增强代码可读性,通常以子句为单位进行分行。
–关键字不可以缩写、分开以及跨行书写,如SELECT不可以写成SEL或SELE
CT等形式。
–关键字最好使用大写,其它语法元素(如列名、表名等)小写。
–Tab和缩进的使用可以提高程序的可读性。
•选择所有列的两种方式
select * from 表名;
select deptno,dname,loc from dept;
练习:
用两种方式查询salgrade表数据
选择指定列
select 语句后列出要选择的列的列表
如:select deptno,dname from dept;
练习1
•1.使用两种方式查询所有员工(EMP)信息
•2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。
算术运算符(+-*/)
算术运算符优先级
–乘除优先于加减
–相同优先权的表达式按照从左至右的顺序依次计算
–括弧可以提高优先权,并使表达式的描述更为清晰
例:SELECT ename, sal, 12*sal+100 FROM emp;
SELECT ename, sal, 12*(sal+100);
练习2
•1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。
•2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
空值NULL
•空值NULL
–空值是指一种无效的、未赋值、未知的或不可用的值。
–空值不同于零或者空格。
注意:任何包含空值的算术表达式运算后的结果都为空值NULL。
1 select ename, 12*sal+comm
2 from emp
3 WHERE ename='KING';
解决空值的方法
IFNULL函数
ifnull(expr1,expr2) ifnull函数如果第一个参数为空,则返回expr2,否则返回expr1
上面语句改写:
select ename,12*sal+ifnull(comm,0)
from emp
where ename='KING';
列别名
两种写法:
列名 as 列别名
列名 列别名
例:SELECT ename AS 姓名, sal 月薪
FROM emp;
练习3
•员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示列标题为员工姓名,工资收入,奖金收入,总收入。
消除重复行
distinct关键字,在select 子句中使用
select distinct job from emp;
练习4
查询员工表中一共有哪几种岗位类型。
显示表结构两种方式
desc 表名:
describe 表名:
练习5
分别查看员工表、部门表、薪资等级表的表结构。
*where子句
作用:指定查询条件,限制显示的数据行
语法:
SELECT [DISTINCT] {*| column | expression [alias], ...}
FROM table
[WHERE condition(s)];
•WHERE子句紧跟在FROM子句之后
•condition(s)表示条件表达式,
–通常格式为:列名 比较操作符 要比较的值
•比较操作符(> = < > = <= != <>)
比较数字相等
SELECT ename, job, deptno
FROM emp
WHERE deptno=20;
比较字符或日期相等
字符串值需要加单引号
SELECT ename, job, deptno
FROM emp
WHERE job='CLERK';
日期可以加单引也可以不加,不加单引时,合法的日期格式是yyyyMMdd/yyMMdd
-- 查询1981-05-01之前入职的员工
select *
from emp
where HIREDATE<'1981-05-01'
select *
from emp
where HIREDATE<'19810501'
select *
from emp
where HIREDATE<19810501
特殊比较运算符
•BETWEEN..AND..
值介于两者之章,包括临界值
如:查询工资在1000到1500之间的员工信息
SELECT *
FROM emp
WHERE sal BETWEEN 1000 AND 1500;
查询1981年入职的员工信息
select *
from emp
where hiredate BETWEEN ‘1981-01-01’ AND ‘1981-12-31’
•IN运算符
满足条件的值比较多,圈定一个范围,用in
如:查询经理编号为7902,7566,7788的员工信息
SELECT empno, ename, sal, mgr
FROM emp
WHERE mgr IN (7902, 7566, 7788);
查询在10,20,30号部门工作的员工信息
select *
from emp
where deptno in(10,20,30);
练习7
-- 1.查询入职日期在82年至85年的员工姓名,入职日期。
SELECT ename,hiredate FROM emp WHERE HIREDATE BETWEEN '1982-01-01' AND '1985-12-31'
-- •2.查询月薪在3000到5000的员工姓名,月薪。
SELECT ename,sal
from emp
where sal BETWEEN 3000 and 5000
-- •3.查询部门编号为10或者20的员工姓名,部门编号。
SELECT ename,deptno
FROM emp
WHERE DEPTNO IN(10,20)
-- •4.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。
SELECT ENAME,MGR
FROM emp
WHERE MGR in(7902,7566,7788)
特殊比较运算符
LIKE运算符*
重要,用于模糊查询
–模糊查询中两个通配符:
–%代表零或任意更多的字符
–_代表一个字符
%与_可混用
可以使用ESCAPE标识符实现对“%”和“_”的查找。
–例:查询JOB 以“MAN_”开头的雇员信息。
1 )查询指定字符开头的用‘s%’
2)查询指定字符结尾的用'%s'
3)查询包含指定字符的用'%S%'
SELECT ename,job
FROM emp
WHERE jobLIKE 'MAN@_%' ESCAPE '@';
查询姓名倒数第三个字母为M的并且正数第三个也是M员工信息
SELECT *
FROM emp
WHERE ENAME LIKE '__M__'
OR ENAME LIKE '__M%M__';
SELECT *
FROM emp
WHERE ENAME LIKE '__M%' AND ENAME LIKE '%M__';
•IS NULL 运算符
判断要比较的值是否为空值NULL
如:查询没有经理的员工
SELECT ename, mgr
FROM emp
WHERE mgr IS NULL;
练习8
•1.查询员工姓名以W开头的员工姓名。
select ename from emp where ename like 'w%';
•2.查询员工姓名倒数第2个字符为T的员工姓名。
select ename from emp where ename like '%t_';
•3.查询奖金为空的员工姓名,奖金。
SELECT ename, comm
FROM emp
WHERE comm is NULL;
逻辑运算符
用于连接多个查询条件
逻辑运算符包括AND、OR、NOT
and (和,多个条件需要同时满足)
or(或者 多个条件满足其中一个)
not(不是 反选 )
查询部门编号为10或者20,并且姓名以w开头的员工信息
select *
from emp
where deptno in(10,20) and ename like 'w%';
查询工资大于1000并且工作岗位为CLERK的员工信息
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1000
AND job='CLERK';
查询工资大于1000或者工作岗位为CLERK的员工信息
SELECT empno, ename, job, sal
FROM emp
WHERE sal>=1000
OR job='CLERK';
查询工资大于1000或者工作岗位不为CLERK,MANAGER的员工信息
SELECT ename, job
FROM emp
WHERE sal>=1000 or
job NOT IN ('CLERK','MANAGER','ANALYST');
–NOT运算符可以和BETWEEN…AND、LIKE、IS NULL一起使用
•...WHERE deptno NOT IN (10, 20)
•...WHERE sal NOT BETWEEN 3000 AND 5000
•...WHERE ename NOT LIKE 'D%’
•...WHERE mgr IS NOT NULL
•运算符的优先级*
小括号优先,实在记不住,用小括号括起
练习9
•1.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资
SELECT ENAME,JOB,SAL
FROM emp
WHERE SAL>2000 AND JOB='manager' or JOB='salesman'
•2.查询工资超过2000并且职位是MANAGER或SALESMAN的员工姓名、职位、工资。
SELECT ENAME,JOB,SAL
FROM emp
WHERE SAL>2000 AND (JOB='manager' or JOB='salesman')
•3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
select ename,deptno,sal
from emp
where (deptno=10 or deptno=20) and sal BETWEEN 3000 and 5000;
•4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。
select ename,hiredate,job from emp
where hiredate between '1981-01-01' and '1981-12-31'
and job not like 'sales%'
•5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。
SELECT ename,job,deptno
FROM emp
where job in('salesman','manager') and deptno in(10,20)
and ename like '%A%';
ORDER BY子句
对查询结果进行排序,写在所有子句后
•其中:
–可以按照列名、表达式、列别名、结果集的列序号排序
–ASC: 升序,默认值 DESC: 降序
–ORDER BY 子句必须写在SELECT语句的最后
如:
SELECT ename, job, deptno, hiredate,sal
FROM emp
ORDER BY sal asc,hiredate DESC;
其结果先按薪水升序排序,薪水相同的再按出生日期降序
asc:升序 正序
desc :倒序 逆序
练习10
1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
SELECT ENAME,DEPTNO
FROM EMP
WHERE DEPTNO=20 OR DEPTNO=30
ORDER BY SAL ASC
2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
SELECT ename,deptno,sal
FROM emp
where sal BETWEEN 2000 and 3000
and deptno <>10
ORDER BY deptno,sal DESC
3.查询入职日期在81年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,
并按照入职日期降序排序。
SELECT ename,hiredate,job
FROM emp
WHERE hiredate BETWEEN '1981-01-01' AND '1983-12-31'
AND (job like 'SALES%'
OR job like 'MAN%')
ORDER BY hiredate DESC
作业:
练习6:
•1.查询职位为SALESMAN的员工编号、职位、入职日期。
select empno,job,hiredate
from emp
where job='SALESMAN'
•2.查询1985年12月31日之前入职的员工姓名及入职日期。
select ename,hiredate
from emp
where hiredate <'1985-12-31'
•3.查询部门编号不在10部门的员工姓名、部门编号。
select ename,deptno
from emp
where deptno <>10
课后习题:
-- 课后作业
1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
select ename,hiredate,job
from emp
where hiredate > '1982-07-09'
and job != 'SALESMAN'
2.查询员工姓名的第三个字母是a的员工姓名。\
select ename
from emp
where ename like '__a%'
3.查询除了10、20号部门以外的员工姓名、部门编号。
select ename,deptno
from emp
where deptno not in (10,20)
4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。
select ename,deptno,sal
from emp
where deptno=30
ORDER BY sal DESC,ename ASC
5.查询没有上级的员工(经理号为空)的员工姓名。
SELECT ename
FROM emp
WHERE mgr IS NULL
6.查询工资大于等于4500并且部门为10或者20的员工的姓名\工资、部门编号。
SELECT ename,sal,deptno
FROM emp
where sal>=4500
AND (deptno=10
or deptno=20)
分页:
•使用select语句时,经常要返回前几条或者中间某几行记录,可以使用关键字limit。语法格式如下:
select 字段列表
from 数据源
limit [start,]length;
start=(当前页码-1)*每页条数
以每页5条为例
--第1页 start=(1-1)*5=0
select * from emp limit 0,5;
-- 第2页 start=0=(2-1)*5=5
select * from emp limit 5,5;
-- 第3页 start=0=(3-1)*5=10
SELECT * from emp limit 10,5;
## ordery by和limit的顺序 ##
limit在order by后面
SELECT * from emp order by empno limit 10,5 ;
作业:
第4章 练习10,练习11和课后作业
练习10
•1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
•2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
•3.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序。
练习11
•1.查询入职日期最早的前5名员工姓名,入职日期。
SELECT ename,hiredate
from emp
ORDER BY HIREDATE
LIMIT 0,5;
•2.查询部门编号为10并且入职日期最早的前2名员工姓名,入职日期。
SELECT ename,hiredate
from emp
WHERE deptno=10
ORDER BY HIREDATE
LIMIT 0,2;
•3.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门编号。
SELECT ename,hiredate,deptno FROM emp
LIMIT 0,5;
SELECT ename,hiredate,deptno FROM emp
LIMIT 5,5;
预习:第5章 字符串函数、日期函数、数学函数