Select语法
Select * |distinct | 列名称 [as][列别名],列名称[as][列别名],….
From 表名称[表别名];
Select 子句; 在这个子句后面可以发现有如下内容:
* :表示查询所以的列
列名称:表示要显示指定的列
As :表示给列取的别名字
Distinct:表示去除重复数据的显示
From 子句; 定义要使用的数据表,可以理解为数据来源
查询列
例题: 现在要求查询出公司的雇员雇佣情况,希望通过数据库可以查找到每个雇员的编号、姓名、基本工资三个信息进行浏览
Select empno,ename,sal from emp;
但是在这里需要有一点的重要说明,关于执行顺序的问题,现在只有两个子句,那么以后还会牵扯导更多的子句,那么这两个子句的执行顺序:
第一步执行from子句:表示确定数据来源;
第二步执行select子句:确定要显示的数据列;
例题:
现在要求查询公司中所有雇员的职位信息
SELECT job FROM emp ;
这时发现显示的职位包含了太多的重复内容,使用了DISTINCT关键字去掉全部的重复显示内容
SELECT DISTINCT job FROM emp ;
除了以上的基本查询之外,在简单查询之中的select子句里面也支持四则运算。
例题:要求通过数据库查询出所有雇员的编号、雇员姓名和年基本工资、日基本工资,以作为年终奖金的发放标准
SELECT empno,ename,sal * 12,sal/30 FROM emp ;
例题:现在公司每个雇员在年底的时候可以领取5000元的年终奖金,要求查询雇员编号、雇员姓名和增长后的年基本工资(不包括提成)。
SELECT empno,ename,sal*12+5000 FROM emp ;
例题:公司每个月为雇员增加200元的补助金,此时,要求可以查询出每个雇员的编号、姓名、基本年工资(包括在年底的时候可以领取5000元的年终奖金)。
SELECT empno,ename,(sal+200)*12+5000 FROM emp ;
现在显示列的名字不明确,那么我们就要使用别名字来代替显示
SELECT empno 雇员编号,ename 雇员姓名,(sal+200)*12+5000 AS 年薪 FROM emp ;
此处是否加上as对于最终结果没有任何的区别,但是必须提醒的是,如果要进行别名的设置,不要使用中文。
字符串连接 ,使用“||”进行连接显示
显示:
首先:标号和姓名和工资连接起来放在一个列里
Select empno||ename from emp;
为了更直观的显示用中文介绍分开
SELECT ‘编号是:’ || empno || ‘的雇员姓名是:’ || ename || ‘,基本工资是:’ || sal 雇员信息 FROM emp ;
总结:
简单查询是将一张表中的全部或部分列进行显示操作;
简单查询中通过“*”表示查询全部的内容,也可以指定具体的列名字,显示具体列的内容;
在SQL中可以使用+ 、- 、* 、/ 四则运算,但要注意运算的优先级;
可以为一个列进行别名设置,这样以后显示时相应的列就被替换成别名显示了;
通过||可以进行数据的连接,在查询语句中出现是字符串,必须使用“ ’”括起来
限定查询 (带条件查询 where)
限定查询语法
Select * |distinct | 列名称 [as][列别名],列名称[as][列别名],….
From 表名称[表别名]
Where [条件]
在这个语法中,就是比之前的语法多了一个where子句,在where子句之中可以设置一系列的过滤条件。而这些条件可以设置多个。那么这多个条件之间可以利用逻辑运算进行连接。
逻辑运算
在编写where子句判断条件时,可以同时指定多个判断条件的连接,而连接主要通过逻辑运算符实现,逻辑运算符一共有以下三种:
与 (AND):连接多个条件,多个条件同时满足时才返回值TRUE,有一个条件不满足结果就是FALSE;
或 (OR):连接多个条件,多个条件之中只要有一个返回TRUE,结果就是TRUE,如果多个条件返回的都是FALSE,则结果才是FALSE;
非(NOT):求反操作,可以将TRUE变FALSE、FALSE变成TRUE;
例题:
统计出基本工资高于1500的全部雇员信息
SELECT * FROM emp WHERE sal>1500 ;
现在对于SQL语法而言,就具备了三个子句:
第一步:执行FROM子句,来控制数据的来源;
第二步:执行WHERE子句,使用限定符进行数据行的过滤;
第三步:执行SELECT子句,确定要显示的数据列。
在之前所使用的 > 是一个关系运算符,在标准SQL之中定义了许多的运算符。
关系运算符(<或者>或者 (!= 或者 <>))
关系运算就是确定大小、相等关系的比较。
例题:
现在要求查询出所有基本工资小于等于2000的全部雇员信息
SELECT *
FROM emp
WHERE sal<=2000 ;
例题:
根据之前的查询结果发现SMITH的工资最低,所以现在希望可以取得SMITH的详细资料
SELECT *
FROM emp
WHERE ename=’SMITH’ ;
例题:
查询出所有办事员(CLERK)的雇员信息
SELECT *
FROM emp
WHERE job=’CLERK’ ;
注意事项:
但是在使用关系运算符判断数据的时候请一定要注意大小写的编写问题。因为oracle数据库是区分大小写的。
(知识点) 表里的数据,我们都用’号来包起来,因为是字符串类型,数字类型系统自带隐式转换
不等于符号(<> 、!=)
例题:
查询所有不是办事员的雇员信息
SELECT *
FROM emp
WHERE job<>’CLERK’ ;
或
SELECT *
FROM emp
WHERE job!=’CLERK’ ;
逻辑运算符 (AND 连接符)
例题:
查询出工资范围在1500 ~ 3000(包含1500和3000)的全部雇员信息
SELECT *
FROM emp
WHERE sal>=1500 AND sal<=3000 ;
例题:
查询职位是办事员,并且基本工资高于1200的所有雇员信息
SELECT *
FROM emp
WHERE job=’CLERK’ AND sal>1200 ;
例题:
查询不是办事员(CLERK),且基本工资大于2000的全部雇员信息
SELECT *
FROM emp
WHERE job<>’CLERK’ AND sal>2000 ;
OR 连接符
例题:
要求查询出10部门中的经理或者是20部门的业务员的信息
SELECT *
FROM emp
WHERE (deptno=10 AND job=’MANAGER’) OR (deptno=20 AND job=’CLERK’) ;
习题:
工资大于3000 或者部门是20的人有哪些
查询员工工资小于2000和部门编号是30的员工姓名、上级编号、薪金、部门
查询不是30部门的员工且工资大于2000的人员信息
BETWEEN…AND操作符(在…..之间)
使用BETWEEN…AND操作符查询出工资范围在1500 ~ 3000(包含1500和3000)的全部雇员信息
SELECT *
FROM emp
WHERE sal BETWEEN 1500 AND 3000 ;
相当于
Select *
FROM EMP
WHERE SAL>=1500 AND SAL<=3000;
习题:
查询工资1500 到 3000之间的员工信息
查询工资在2000到4000之间要求显示员工编号、名字、薪金、部门编号
查询员工编号在7788到8899之间的员工信息
算数表达式
查询每个员工涨20%的工资是多少,显示名字和金额
Select ename,sal*(1+0.2) from emp;
查看给每个员工工资加500的薪金是多少
Select ename,sal+500 new_sal from emp;
—别名 alias 简称as 或者空格不写
null 空值
语法:
判断NULL:字段|值 IS NULL;
判断不为NULL:字段|值 IS NOT NULL (NOT 字段|值 IS NULL);
null是什么?
NULL 是一个未知的数据,所以对于NULL的处理,如果直接利用关系运算判断,是不会有结果的。
例题:
利用=进行NULL比较
select * from emp where comm=null;
当列没有值时,可以表示为null,另外,当列值未知或者无意义时也可以使用null
由于null表示数据是不确定的、未知的,所以null不能等于或者不等于任何值或者另一个null。
例题:
查询没有提成的员工信息
select * from emp where comm is null or comm=0;
查询有提成的员工所有信息
select * from emp where comm is not null and comm>0;
null运算
Null和任何值运算,结果为null
select null+10,null*10,null-10,null/10 from dual;
例题:
查询提成加500的员工名字和提成
select ename,comm+500 from emp;
对比没加之前的数据
select ename,comm+500,comm from emp;
例题:
找出有奖金的员工的不同工作,不要重复数据
Select distinct job from emp where comm is not null and comm>0;
习题:
查询没有提成且工资大于2000的员工信息
找出没有奖金或者奖金低于 1000 的员工信息
Select * from emp where (comm is null or comm=0) and sal>2000;
Select * from emp where (comm is null or comm=0) or comm<1000;
列表范围查找(in 和 not in)
语法:
在指定数据范围内:字段|值 IN(值,值,….);
不在指定数据范围内:字段|值 NOT IN(值,值,….);
例题:
查询员工编号在7788或者7499或者是 7369的员工信息
SELECT * FROM EMP WHERE EMPNO=7788 OR EMPNO=7499 OR EMPNO=7369;
改成in写法:
Select * from emp where empno in (7788,7499,7369);
求反的写法(not in):
Select * from emp where empno not in (7788,7499,7369);
例题:
查询员工姓名是SMITH或者是SCOTT的人员信息
Select * from emp where ename in (‘SMITH’,’SCOTT’);
习题:
找出部门 10 中既不是经理(MANAGER)也不是普通员工(CLERK)的信息,
找出部门 20 中既不是经理(MANAGER)也不是普通员工(CLERK)的信息,而且工资大于等于 2000 的员工
Select * from emp where deptno=20 and job not in (‘MANAGER’,’CLERK’) and sal>=2000;
like –模糊查询
LIKE的用法
使用LIKE操作符可完成按通配符查找字符串的查询操作,
该操作符适合于对数据进行模糊查询。其语句法为:
满足模糊查询:字段|值 LIKE 匹配模式
不满足模糊查询:字段|值 NOT LIKE 匹配模式
匹配模式中除了可以包含固定的字符之外,还可以包含以下的通配符:
百分号(%):可匹配任意类型和长度的字符,如果是中文则使用两个百分号(%%);
下划线(_) :匹配单个任意字符,它常用来限制表达的字符长度;
例题:现在查询出雇员姓名是S开头的全部雇员信息
select * from emp where ename like ‘%S%’
select * from emp where ename like ‘%S’;
select * from emp where ename like ‘S%’;
select * from emp where ename like ‘_S%’
习题:
查询名字以S结尾和部门是20的员工编号、入职日期、部门编号
查询员工工资大于等于2000 或者部门是20的员工姓名、入职日期、提成
查询工资在1000到2000之间的员工的姓名和工资
查询员工叫KING的工资、提成、部门
查询员工姓名的第三个字母是A的员工姓名
显示提成(COMM)收入比工资(SAL)高的员工的部门编号、名字、入职日期
查询部门20的详细信息,地址,位置
显示10 号部门的所有经理(‘MANAGER’)或者20 号部门的所有职员(‘CLERK’)的员工编号、职位、薪金、部门编号
查询不是10部门的员工或者名字带S开头的姓名的信息
总结
select * from emp
select * from emp where empno=20 —带条件查询
select * from emp where empno=20 and sal>1000 —带多条件查询
select * from emp where empno=20 or sal>1000 —
select * from emp where 列名字 between 数值 and 数值
select * from emp where 列名字 in (条件、数值)
select * from emp where 列名字 like ‘%条件、数值%’;
select * from emp where 列名字 is null —不能用等号来表达
select 列名字||列名字 from emp —拼接
select distinct 列名字 from emp —去重
select (运算+-*/、显示系统时间) from dual; —内部表
select * from emp order by 列名字 —排序(表后面,where后面)