SQL> desc s_emp;
Name Null? Type
----------------------------------------- -------- --------------
ID 员工编号 NOT NULL NUMBER(7)
LAST_NAME 姓 NOT NULL VARCHAR2(25)
FIRST_NAME 名 VARCHAR2(25)
USERID 用户编号 VARCHAR2(8)
START_DATE 入职日期 DATE
COMMENTS 备注 VARCHAR2(255)
MANAGER_ID 直接领导的员工编号 NUMBER(7)
TITLE 职位 VARCHAR2(25)
DEPT_ID 部门编号 NUMBER(7)
SALARY 月薪 NUMBER(11,2)
COMMISSION_PCT 提成 NUMBER(4,2)
字段的名字
字段能不能为空 (可不可以没有值) not null 代表必须有值
字段的类型 number 代表数字类型 (整数 长整型 浮点 ) varchar2(n) 代表变长字符串
Date 代表日期 (代表java中的Date Calendar Timestamp)
1.显示 s_emp 表中的 id salary 和 部门编号
2.显示员工的名字 名字的构成是 first_name 和 last_name 拼接起来的 在first_name 和
last_name 之间 拼接一个下划线字符串
3.显示s_emp 表中的 月薪 和 年薪 年薪的计算方式是 月薪 乘以 13
4.显示s_emp 表中的 id manager_id 如果manager_id 为空 则显示成 -1 如果不为空则显示
manager_id 本身
select id,nvl(manager_id,-1) from s_emp;
5.显示 s_emp 表中的 id first_name 和 年薪 这次年薪计算方式 是 salary*12 加上
salary*12乘以 提成/100 注意提成可能为空 如果提成为空 则把提成处理成 0 同时给年薪
起个别名 叫 yearsal
select id,first_name,salary*12+salary*12*(nvl(commission_pct,0)/100) yearsal
from s_emp;
select id,first_name,nvl(salary*12+salary*12*(commission_pct/100),salary*12)
from s_emp;
--------------------------------------------------------------------------------
1.from 子句中数据排重 distinct
select salary from s_emp;
select distinct salary from s_emp;
排重只能写在字段的前面 下面的写法错误
select salary distinct from s_emp;
sql 语句 前后数据必须保持 一对一的一致
select id,distinct salary from s_emp;
下面的写法是可以的 代表当 id salary都相同时 就认为是重复的数据
select distinct id,salary from s_emp;
select distinct title,salary from s_emp;
2.where 子句
2.1 where子句的作用
where 子句又叫条件子句,限制表中的行数据返回的 满足条件的数据被选中
不满足条件的数据被过滤掉。
2.2 语法
select 字段名 from 表名 where 条件;
2.3 两个极限条件
1 != 1 恒假 永假
1 = 1 恒等 永真
select id,first_name from s_emp;
select id,first_name from s_emp where 1 != 1;
select id,first_name from s_emp where 1 = 1;
2.4 数字类型的条件表达
查询s_emp 表中 显示 id first_name salary 要求 salary 等于 1400
select id,first_name,salary from s_emp where salary=1400;
查询s_emp 表中 显示 id first_name salary 要求 salary 不等于 1400
select id,first_name,salary from s_emp where salary!=1400;
查询s_emp 表中 显示 id first_name salary 要求 salary 小于 1400
select id,first_name,salary from s_emp where salary<1400;
2.5 字符串类型的条件表达
找出s_emp 表中 first_name 叫 Carmen 的 员工 显示 id first_name salary
select id,first_name,salary from s_emp where first_name='Carmen';
找出s_emp 表中 first_name 叫 carmen 的 员工 显示 id first_name salary
select id,first_name,salary from s_emp where first_name='carmen';
SQL 不区分大小写
字符串的值要严格区分大小写 并且字符串的值 要使用单引号 包起来
2.6 sql中数学运算符有哪些
= != > < >= <=
2.7 sql 提供的运算符
a.sql中表达一个闭区间 比如 [a,b]
字段 between a and b
显示 s_emp 表中的 id first_name salary 要求salary 在 [1400,2500] 之间
select id,first_name,salary from s_emp
where salary between 1400 and 2500;
b.表达一个值 处在一个列表范围内
字段 in 列表
列表的表达是 (a值,b值,c值)
找出 员工是 31部门 或者是 41部门 或者是 50 部门的员工
select id,first_name,dept_id from s_emp where dept_id in (31,41,50);
找出部门 要求 属于 1号地区 要么3号地区 要么 5 地区的
select id,name,region_id from s_dept where region_id in(1,3,5);
c.空值的判断运算符
为什么要有NULL值的判断 除了 is null 其它运算符 对NULL值判断无效
找出 提成commission_pct 是 10的员工 显示 id first_name commission_pct
select id,first_name,commission_pct from s_emp where commission_pct=10;
select id,first_name,commission_pct from s_emp where commission_pct!=10;
select id,first_name,commission_pct from s_emp where
commission_pct is null;
找出manager_id 是NULL的员工 显示 s_emp 表中的 first_name salary manager_id
select first_name,salary,manager_id from s_emp where manager_id is null;
d.模糊查询 运算符 like
找出所有姓 李的人?
李四 李靖 李世民 李嘉诚
找出所有带 龙的人
成龙 龙王爷 龙骑 小龙女
核心语法:
where 字段 like '统配串';
统配串中最重要的两个字符是 统配符:
_ 代表一个任意字符
% 代表0-n个任意字符
练习:
找出所有的s_emp 表中 first_name 带 a 的
select first_name from s_emp where first_name like '%a%';
找出所有的s_emp 表中 first_name 第二个字符是 a 的
select first_name from s_emp where first_name like '_a%';
找出所有的s_emp 表中 first_name 倒数第二个字符是 a 的
select first_name from s_emp where first_name like '%a_';
特殊情况:
一张表 叫 user_tables 这里面放了所有的表的信息 其中有一个字段 table_name 代表
所有的表名.
select table_name from user_tables;
在上面查询的基础上 找出 所有的 以 S_开头的表名.
escape 表达的字符后的字符 需要进行转义
select table_name from user_tables where table_name like 'S\_%' escape '\';
select table_name from user_tables where table_name like 'S\_\_%' escape '\';
2.8 逻辑运算符
与 && a&&b 数据库中表达 是 a and b
举例: 找出 s_emp 表中 salary 在 [1400,2500] 之间的
where salary >=1400 and salary <= 2500
找出 s_emp 表中 salary 在 (1400,2500) 之间的
where salary > 1400 and salary < 2500
或 || a||b 数据库中 表达是 a or b
找出 部门编号 在 31 或者 41 或者 50 部门的 员工 显示 id first_name dept_id
select id,first_name,dept_id from s_emp where dept_id=31 or
dept_id=41 or dept_id = 50;
非 对立面问题
= != ^= <>
> <=
< >=
between a and b not between a and b
in not in
like not like
is null is not null 除了这一组 上面的都要注意NULL值
练习: 找出s_emp 表中 所有提成是NULL的人 显示 id first_name commission_pct
select id,first_name,commission_pct from s_emp
where commission_pct is null;
找出s_emp 表中 所有提成不是NULL的人 显示 id first_name commission_pct
select id,first_name,commission_pct from s_emp
where commission_pct is not null;
2.9 条件的优先级 使用小括号解决
select first_name,salary,dept_id
from s_emp where salary > 1000 and dept_id=41 or dept_id=42;
select first_name,salary,dept_id
from s_emp where (salary > 1000 and dept_id=41) or dept_id=42;
select first_name,salary,dept_id
from s_emp where salary > 1000 and (dept_id=41 or dept_id=42);
3.排序
3.1 概念
按照一定的标准 把数据按照一定的顺序(升序 和 降序)排列
3.2 语法
select 字段名 from 表名 where 条件 order by 排序标准 排序方式;
排序方式:
升序 默认的顺序 关键字是 asc (自然顺序 字典顺序)
降序 关键字是 desc (反自然顺序 反字典顺序)
3.3 练习
按照工资排序 显示 s_emp 表中的 id first_name salary
select id,first_name,salary from s_emp where 1=1 order by salary;
按照工资降序排序 显示 s_emp 表中的 id first_name salary
select id,first_name,salary from s_emp where 1=1 order by salary desc;
3.4 按照manager_id 排序 显示 s_emp 表中的 id first_name manager_id
select id,first_name,manager_id from s_emp order by manager_id;
select id,first_name,manager_id from s_emp order by manager_id desc;
NULL 值在排序中作为最大值
3.5 如果值相同 则可以启用第二排序字段 (多字段排序)
120kg 60.5
120kg 61.0
select id,first_name,manager_id from s_emp order by manager_id,id;
select id,first_name,manager_id from s_emp order by manager_id,
first_name desc;
4.单行函数
4.1 概念
单行函数:
针对sql语句影响的每一行 都返回一个结果 sql语句影响多少行 就返回多少个结果。
组函数:(统计函数)
无论sql语句影响多少行 只返回一个结果
4.2 举例
upper 单行函数
select first_name,upper(first_name) uname from s_emp where id=1;
select first_name,upper(first_name) uname from s_emp where id>1;
select first_name,upper(first_name) uname from s_emp where id<1;
max 组函数
select max(first_name) uname from s_emp where id=1;
select max(first_name) uname from s_emp where id>1;
select max(first_name) uname from s_emp where id<1;
4.3 为了学习单行函数 引入了一个单行单列的表 dual
select * from dual;
select upper('hello') from dual;
select lower('HELLO WORLD') from dual;
4.4 处理字符串的单行函数
upper(par1) 把字符串变大写
lower(par1) 把字符串变小写
length(par1) 求字符串长度
select length('hello') from dual;
initcap(par1) 把每个单词的首字母变大写
select initcap('one world one dream') from dual;
concat(par1,par2) 连接两个字符串 并返回
select concat('aa','bb') from dual;
select concat(first_name,last_name) from s_emp;
select 'aa' || 'bb' ||'cc' ||'dd' from dual;
substr(par1,par2,par3) 截取字符串
par1 要截取的字符串
par2 代表截取的位置 编号从1开始 也可以是负数 -1代表最后一个字符
par3 截取的长度
select substr('hello',0,2) from dual;
select substr('hello',1,2) from dual;
select substr('hello',2,2) from dual;
显示s_emp 表中的first_name 以及first_name 对应的前三个字符
select first_name,substr(first_name,1,3) from s_emp;
显示s_emp 表中的first_name 以及first_name 对应的后三个字符
select first_name,substr(first_name,-3,3) from s_emp;
nvl(par1,par2) 要求 par1 和 par2 的类型保持一致
replace(par1,par2,par3) 把par1 中出现的par2内容 替换成par3
select replace('one world one dream','one','two') from dual;
4.5 格式化显示函数
to_char(par1,par2)
par1 是要处理的数据 今天主要用来处理数字类型的数据
par2 是要显示的格式 可以省略 省略代表把数据变成字符串类型
如果par2不省略 则 按照指定的格式显示数据。
fm 代表格式字符串 的开始 是format的缩写 可以省略
$ 美元符号
L 本地货币符号 ¥ RMB 和本地语言有关
9 小数点前代表 0-9 的任意数字
小数点后代表 1-9 的任意数字
0 小数点前代表 强制显示 前导零
12345 012,345 9999 009,999
小数点后代表 0-9 的任意数字
, 分割符
. 小数点
select to_char(12345.86,'fm$099,999.99') from dual;
select to_char(salary,'fm$099,999.99') from s_emp;
select to_char(salary,'fm$099,999.00') from s_emp;
select to_char(salary,'fmL099,999.00') from s_emp;
AMERICAN_AMERICA.UTF8
4.6 处理数字的函数
round(par1,par2) 四舍五入函数 (以后还可以处理日期)
par1是要处理的数字
par2是处理的精度 如果省略代表取整
select round(9.58) from dual;
/* 精度是保留小数点后 1 位 对 第二位四舍五入 */
select round(9.58,1) from dual;
select round(9.584,2) from dual;
select round(12.88,-1) from dual;
trunc(par1,par2) 截取函数 (以后还可以处理日期)
par1是要处理的数字
par2是处理的精度 如果省略代表切掉小数点后的
select trunc(9.58) from dual;
select trunc(9.99) from dual;
/* 精度是保留小数点后 1 位 对 第二位截取 */
select trunc(9.58,1) from dual;
select trunc(9.584,2) from dual;
/* 对小数点前的一位进行截取 */
select trunc(19.13,-1) from dual;
4.7 函数嵌套
把一个函数的返回值 作为另一个函数的参数
显示 s_emp 表中的first_name 和 first_name 的前三个字符 并把这前三个字符 变大写
Carmen CAR
test TES
select first_name,upper(substr(first_name,1,3)) from s_emp;
显示 s_emp 表中的first_name 和 first_name 的后三个字符 并把这前三个字符 变大写
不允许使用负数编号
select first_name,upper(substr(first_name,-3,3)) from s_emp;
select first_name,upper(substr(first_name,length(first_name)-2,3)) from s_emp;