Select语句
回顾From子句
查询员工表(s_emp)的id与salary字段
select id,salary from s_emp;
辅助查询的额外功能算数运算 *
+-*/%需求: 查询员工的last_name与年薪:
select last_name,salary*13 from s_emp;
需求: 查询员工的日薪 , 按照每个月21天工作日计算
select last_name,salary/21 from s_emp;
别名 *
有时候 ,我们在对表格进行查询时, 因为字段进行了运算, 它的表头出现了改变, 我们需要指定一个别名, 来更方便的使用它
语法格式:
select 查询的列或者表达式1 别名,查询的列或者表达式2 别名 from 表名; 单个列只允许存在一个别名 !
需求: 查询年薪, 并且给年薪字段添加别名:
select last_name,salary*13 ys from s_emp;
别名中存在空格等特殊字符时 使用双引号引住 , 可以把空格之类的特殊字符 看作一个整体 ,并且会原样显示(大小写区分显示)
查询员工的id , 并加10000显示, 给id添加别名 id hehedaselect id+10000 “id heheda” from s_emp;
SQL中的字符串
使用英文单引号引住的 就是字符串
- Oracle中关于大小写敏感的规则:
在oracle的sql中 只有字符串是大小写敏感的 !
字符串的定义形式 与 表现形式
例如:
Java中我们定义一个字符串的变量:
定义形式: "Oracle"
表现形式: Oracle
Oracle中我们定义一个字符串的变量:
定义形式: 'Oracle'
表现形式: Oracle
1. 字符串的拼接
在sql中拼接字符串, 通过||(字符串连接符)
需求: 查询员工的 姓(last_name)名(first_name) :
select last_name||first_name name from s_emp;
需求: 查询员工的姓$名
select last_name||'$'||first_name name from s_emp;
字符串中拼接单引号
需求: 查询员工的姓’名
需要通过4个单引号, 表示一个字符串中的单引号
select last_name||””||first_name name from s_emp;
null值的处理 *
oracle中null值经过运算后, 结果永远为null
nvl(参数1,参数2)
作用 :用来处理null值, 让null值可以合理的参与运算 ,如果参数1为null则返回参数2 , 如果参数1不为null则返回参数1
参数1.需要判断是否为null的值
参数2.参数1为null时,替换的值
需求: 查询员工的月薪(salary),提成(commission_pct)
select id,salary,commission_pct from s_emp;
需求: 计算一年的薪水加提成
select id,salary*13+salary*13*commission_pct/100 from s_emp;
上面的运算出现了问题, 因为没有对null值进行处理 , 加入nvl后:
select id, salary*13 ,salary*13+salary*13*nvl(commission_pct,0)/100 ys from s_emp;
数据排重显示
排重关键字: distinct
查询员工的月薪,排重显示:
select distinct salary from s_emp;--单字段排重显示
多字段排重
查询月薪与领导编号
select distinct salary,manager_id from s_emp;
where子句*
对于查询进行条件的添加 , 对于查询结果进行过滤 , 匹配规则的将被正确的查询到, 不匹配规则的将从结果集中舍弃!
格式: select 列名 from 表名 where 条件; *
常用的比较运算符: = ,!=,>,<,>=,>=
字符串进行比较与number类型没有区别
需求:
查询员工的last_name,id, 条件是:id大于5
select last_name,id from s_emp where id>5;
查询员工的last_name,id, 条件是:id等于1
select last_name,id from s_emp where id=1;
特殊的极限条件: 永真与永假条件
永真条件:
select id from s_emp where 1=1;永假条件
select id from s_emp where 1!=1;
select id from s_emp where 1=2;字符串的比较 *
- 字符串的定义形式
- 在oracle中字符串大小写敏感
查询员工的id,salary , 条件式last_name为Chang
select id,salary from s_emp where last_name=’Chang’;
特殊的运算符
- between : 闭区间 (包含开始与结尾边界)
格式: select 字段 from 表名 where 字段 between 初始范围 and 最大范围!
需求: 查询员工的last_name,与salary , 条件为: 工资在1100到1450之间
select last_name,salary from s_emp where salary between 1100 and 1450;
- in: 匹配列表
格式: select 字段 from 表名 where 字段 in(值1,值2…值n);
条件匹配in值列表中的的任意一个, 就会被查询到
查询员工的last_name与id , 条件为id为1或者2或者3的员工
select last_name,id from s_emp where id in(1,2,3);- null值判断 *
查询所有的领导编号为1的员工 ,查询他的last_name与id信息
select id,last_name from s_emp where manager_id=1;查询所有的领导编号不为1的员工
select id,last_name from s_emp where manager_id!=1;上面的两个案例 共获取了24条记录 ,缺少一条领导编号为null值的员工 !
判断数据是否为空: is null *需求:查询所有的领导编号为null的员工
select last_name,id from s_emp where manager_id is null;
判断数据是否不为空: is not null
需求:查询存在提成的员工 的 id,last_name,commission_pctselect id,last_name,commission_pct from s_emp where commission_pct is not null;
模糊查询 *like
格式: select 列名 from 表名 where 字段名 like ‘模糊查询的文本’;
通配符:
- _ :表示一个任意字符 - % :0-n个任意字符
例如一段文本:
1. 床前明月光, 2. 玻璃好上霜。 3. 要不及时擦, 4. 整不好得脏。 '_不%': 匹配了3和4 '%不%': 匹配了3和4 '%床%': 匹配了1 '玻璃%':匹配了2
需求:
查询s_emp表格中last_name中包含a字符的员工 , 查询他的last_name与id
select last_name,id from s_emp where last_name like ‘%a%’;查询s_emp表格中last_name中开头为N字符的员工, 查询他的last_name与id
select last_name,id from s_emp where last_name like ‘N%’;查询s_emp表格中的last_name中第二个字符为e的员工 , 查询他的last_name与id
select last_name,id from s_emp where last_name like ‘_e%’;查询s_emp表格中的last_name中倒数第二个字符为a的员工 , 查询他的last_name与id
select last_name,id from s_emp where last_name like ‘%a_’;
oracle中存在一个表格user_tables,包含了数据库中所有的表格信息 ;
我们查询这个user_tables,获取所有的表名:
select table_name from user_tables;需求: 查询user_tables表格中的所有的table_name列的值, 条件为table_name以s_开头
特殊的疑问:
我们要模糊查询的文本 中包含 %与_ 怎么办? 描述转义字符 escape '\';
案例:
select table_name from user_tables where table_name like ‘S_%’ escape ‘\’;
逻辑条件连接符
与 and *
- 查询s_emp表格中的员工信息 , 条件如下:
1. 员工id为2
2. 领导编号为1的员工
select last_name,id from s_emp where id=2 and manager_id=1;
- 查询员工工资在1100(含)到1450(含)之间的员工信息
select salary,last_name,id from s_emp where salary>=1100 and salary <=1450;
或 or *
- 查询员工的id为1或者员工的id为2的员工信息
select last_name,id from s_emp where id=1 or id=2;
- 查询员工的id与salary , 条件为: 员工的id为1或者员工的薪资小于1000;
select id,salary from s_emp where id=1 or salary<1000;
非 not *
- not between
加入not以后, 是匹配不属于闭区间的内容!
- 获取员工的id,salary,条件为月薪的范围不再1100-1450之间
select id,salary from s_emp where salary not between 1100 and 1450;
- not in
获取员工id不为1,2,3,4的员工salary,id信息
select salary,id from s_emp where id not in(1,2,3,4);
- is not null *
获取员工的manager_id不为null的员工的id,last_name;
select id,last_name from s_emp where manager_id is not null;
思考条件的优先级问题:
获取员工的id,last_name,dept_id(部门编号),salary,条件如下:
员工的工资小于1000 , 并且部门的id为31或者42
select id,last_name,dept_id,salary from s_emp where salary<1000 and (dept_id=31 or dept_id=42);
order by 子句(排序)
order by 子句 只能放在select 语句的最后面
注意: null值在排序中永远是最大的 !
对于查询的结果, 按照指定的排序规则, 进行排序:
规则:
- asc 默认升序 (因为是默认 可以 不写)
- desc 降序
格式: select 列名 from 表名 [where 条件] [order by 排序字段名 排序规则];
- 查询员工的id , 要求id降序排列
select id from s_emp order by id desc;
- 按照dept_id(部门编号)进行排序 (升序与降序)
select dept_id,last_name from s_emp order by dept_id ;
select dept_id,last_name from s_emp order by dept_id desc;
- 按照manager_id(领导编号) 进行排列, 查询id,manager_id,last_name信息;
- null值最大
select id,manager_id,last_name from s_emp order by manager_id desc;
多字段排序
格式与单个字段排序基本一致, 多个字段之间使用英文逗号隔开
格式: select 列名 from 表名 [where 条件] [order by 排序字段名1 排序规则1,排序字段名2 排序规则2...排序字段名n 排序规则n];
- 按照部门id升序排列 , 如果部门id相同, 则按照工资升序排列;
select id,dept_id,salary from s_emp order by dept_id asc,salary asc;