—单表的查询学习
–查询表的所有数据 select *from 表名; *代表所有
select *from emp;
–查询表中指定字段的值 ;select 字段名1,字段名2,…from表名
select empno from emp;
select empno,ename from emp;
–给查询结果中的字段使用别名
–在字段名后使用关键字 字段名 as “别名”
–作用:方便查看查询结果
–注意:as关键字可以省略不写,别名中没有特殊字符双引号也可以省略不写
select empno 员工编号,ename "员工姓名",job as 工作,mgr as "领导编号" from emp;
–连接符:select 字段名||‘字符’||字段名||…from 表名
–||为sql语句的字符连接符,使用在select和from之间
–字符连接格式为 字段名||‘字符’||字段名
–注意:一个拼接好的连接在结果集中作为一个新的字段显示,可以使用别名优化字段显示
select empno,ename from emp;
select empno||'的姓名是'||ename from emp;
select empno||'的姓名是'||ename as "信息",job||'哈哈'||mgr from emp;
-
-去除重复,select distinct 字段名,字段名,…from 表名
–注意:去除重复的规则是按照行进行去除的,多行数据完全相同取其一
select distinct job,mgr from emp;
–排序
–单字段排序
--select *from 表名 order by 字段名 asc 升序排序 asc可以省略不写
--select *from 表名 order by 字段民 desc 降序排序
select *from emp order by empno desc;
select empno,ename,job from emp order by ename asc;
–多字段排序
–select *from emp order by 字段名1,字段名2…
–先按照字段1排序,如果字段1的值相同,则按照字段2进行排序…
select *from emp order by empno,ename; --多字段排序
–字段的逻辑运算
```sql
select empno,ename,job,sal*2+1000 from emp;
select empno,ename||'好多钱',job,sal*2+1000 from emp;
select empno,ename,job,sal*2+1000,sal+comm from emp;
-----------------------------------------------------------------------------------------
–使用
where子语句进行查询筛选
--select 字段名,字段名,...from表名 where 筛选条件
--单筛选条件
--使用运算符进行筛选=,>,>=,<,<=,<> 单个条件中
--注意:如果条件中的值为字符,必须使用单引号括起来
```sql
--查询所有员工的工资信息
select empno,ename,sal+comm as 薪资 from emp;
--查询SMITH的个人信息
select *from emp where ename='SMITH';
--查询SMITH的薪资信息,逻辑运算符=
select empno,ename,sal,sal+comm from emp where ename='SMITH';
--查询工资大于2000的员工信息,逻辑符>
select *from emp where sal>'2000';
--查询工资不等于3000的员工信息
select *from emp where sal<>3000 order by sal;
-
-练习
--查看工资大于1250的员工信息
select ename,job from emp where sal>1250;
--查看工资大于等于2000的员工信息
select *from emp where sal>=2000;
--查看工资低于2000的员工信息
select *from emp where sal<2000;
--查看工资不等于1500的员工信息
select *from emp where sal<>1500;
--查看入职日期在81年后的员工信息
--注意:oracle 默认的日期格式为日-月-年,示例'03-1月-1981’
select *from emp order by hiredate;
select *from emp where hiredate>='01-1月-1981' order by hiredate;
--多条件筛选(where子句关键字:and,or,like,is null,is not null,between and )
--查询工资在2000-3000之间的员工信息
--使用and关键字,多条件同时成立的筛选使用and关键字进行条件连接
select *from emp where sal>=2000 and sal<=3000
--使用between and 关键字进行条件连接,包含两头的数据
select *from emp where sal between 2000 and 3000
--查询工作为SALESMAN,ANALYST,MANAGER的员工信息
--使用or关键字,进行或条件的筛选
select *from emp where job='SALESMAN' or job='ANALYST'or job='MANAGER' order by job
--使用in关键字,也可以进行或筛选,但是in中的内容只能为一个字段的值
select *from emp where job in('SALESMAN','ANALYST','MANAGER')
--查询姓名中包含s的,以s开头的,以s结尾的,第二个字符为A的。(模糊查询)
--%表示任意多个的任意字符
--select *from 表名 where 字段名 like '%字符%’查询包含指定字符的数据
select *from emp where ename like '%S%' --包含s的
select *from emp where ename like 'S%' --以S开头的
select *from emp where ename like '%S' --以s结尾的
select *from emp where ename like '_A%' --第二个字符为A的 _表示任意字符
--escape将指定的字符变成转义字符
--转义字符可以将特殊字符转为普通字符
select *from emp where ename like '%/_%' escape '/';
select *from emp for update
--查询有津贴的员工信息
--select *from 表名 where 字段名 is null 字段值为null
--select *from 表名 where 字段名 is not null 字段值不为null
--多个条件使用and关键字进行连接,筛选的是符合所有条件的数据
--select *from 表名 where 筛选条件1 and 条件2 and...
select *from emp where comm is not null and comm>0;
-------------------------------------------------------------------
--1.选择部门30中的所有员工
select *from emp where deptno=30;
--2.列出所有办事员(CLERK)的姓名,编号和部门编号
select empno,ename,deptno from emp where job='CLERK';
--3.找出佣金高于薪金的员工
select *from emp where comm>sal;
--4.找出佣金高于薪金60%的员工
select *from emp where comm>sal*0.6;
--5.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料
select *from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK');
--6.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK),即不是经理又不是办事员但其薪金大于或等于2000的员工的详细资料
select *from emp where (job<>'MANAGER' and job<>'CLERK' and sal>=2000) or (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK');
--7.找出收取佣金的员工的不同工作
select job from emp where comm is not null
--8.找出不收取佣金或收取佣金低于100的员工
select *from emp where comm is null or comm<100
--9.找出各月倒数第三天受雇的员工
select *from emp where hiredate=last_day(hiredate)-2
--10.找出早于12年前受雇的员工
select *from emp where hiredate<'01-1月-1982'order by hiredate
--11.以首字母大写的方式显示所有员工的姓名.
select INITCAP(ename) from emp
--12.显示正好为5个字符的员工的姓名
select ename from emp where length(ename)=5
--13.显示不带有"R"的员工的姓名
select *from emp where ename not like '%R%';
--13.显示不带有“R”的员工和姓名
select *from emp where ename not like '%R%'
--14.显示所有员工姓名的前三个字符
select substr(ename,1,3) from emp
--15.显示所有员工的姓名,用a替换所有“A”
select replace(ename,'A','a')from emp
--16.显示满35年服务年限的员工的姓名和受雇如期
select ename,hiredate,floor((sysdate-hiredate)/365) from emp where (sysdate-hiredate)/365>35
--17. 显示员工的详细资料,按姓名排序
select * from emp order by ename
--18.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面。
select ename,hiredate,floor((sysdate-hiredate)/365) years from emp order by hiredate asc
--19.显示所有员工的姓名、工作和薪金,按工作的年限排序,若工作相同则按薪金排序
select ename,job,sal from emp order by job desc,sal
--20.显示所有员工的姓名、加入公司的年份和月份,按受雇佣日期所在月份排序,若月份相同则将最早年份的员工排在前边
select ename,hiredate,to_char(hiredate,'yyyy')years,to_char(hiredate,'mm') ms from emp order by ms,hiredate
--21.显示在一个月为30天的情况所有员工的日薪金,忽略余数
select floor((sal+nvl(comm,0))/30) from emp
--22.找出在(任何年份的)2月受聘的所有员工
select *from emp where to_char(hiredate,'mm')=2
--23.对于每个员工,显示其加入公司的天数
select ename,sysdate-hiredate from emp.
--24.显示姓名字段的任何位置包含"A"的所有员工的姓名
select ename from emp where ename like '%A%'
--25.以年月日的方式显示所有员工的服务年限
select ename,floor(floor(months_between(sysdate,hiredate))/12),mod(floor(months_between(sysdate,hiredate)),12),floor(mod(sysdate-hiredate,30))from emp
----------------------------------------------------------------------------------------------
--查询工作为SALSMAN,MANAGER并且工资大于2500的员工信息
--and关键字的执行级别高于or,可以使用小括号提升条件的执行级别,使用了小括号的级别是最高的
select *from emp where (job='SALESMAN' or job='MANAGER') and sal>2500