数据库基本知识笔记02
select first_name,salary,manager_id
from s_emp where first_name='Carmen';
1.sql语句不区分大小写 但字符串的值区分大小写
2.字符串都是用单引号引起来 用等号判断相等
比较运算符
1.逻辑比较运算符
= > < >= <=
2.oracle 提供的比较运算符
between and
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达是个闭区间 [1000,2000]
找出工资大于等于1000
小于等于2500的first_name
select first_name ,salary from s_emp where
salary between 1000 and 2500;
select first_name ,salary from s_emp where
1000<=salary<=2500 ;//error
in (list)
dept_id in (10,31,42,51)
select dept_id,first_name from s_emp where
dept_id in(10,31,42,51);
//list中的顺序 对查询结果没有影响
但可能会影响效率 把出现概率高的放前面
like -----模糊查询first_name like '%a_%'
% 0-n个任意字符
_ 1个任意字符
上面的两个字符叫统配符
王三 王五
找出名中带a的first_name
select first_name from s_emp where
first_name like '%a%';
找出名中第二个字母是a的first_name
select first_name from s_emp where
first_name like '_a%';
找出名中第二个字母是A的first_name
select first_name from s_emp where
first_name like '_A%';
//如果名字中带了_怎么办
user_tables ------包含了所有表的信息
------数据字典表
table_name
172.18.9.6
select table_name from user_tables;
select table_name from user_tables
where table_name like '%\_%' escape '\';
//escape '\' 代表把'\'后面的字符转义
注意:在数据字典表中所有数据的值都大写
select table_name from user_tables
where table_name like 's\_EMP' escape '\';
select table_name from user_tables
where table_name like '%\%%' escape '\';
is NULL
找出提成是空first_name
select first_name ,COMMISSION_PCT
from s_emp where COMMISSION_PCT is NULL;
逻辑条件连接符
and
or
not
select first_name ,salary from s_emp where
salary >=1000 and salary<=2500; select dept_id,first_name from s_emp where
dept_id=10 or dept_id=31; 表达非
= != <> ^=
> <=
< >=
between and not between and
is NULL is not NULL
in not in//不准确(NULL)
like not like
找出不在42部门的员工in not in
select first_name from s_emp
where dept_id not in (42,NULL);
in:只要里面有一个相等
not in:和里面的任何一个都不相等的话才被选择
所以必须注意空值的问题
C order by 排序
从小到大 升序 正序 自然顺序 字典顺序
把first_name ,salary 按工资的升序排 select first_name,salary from s_emp
order by salary asc;
注意:如果是升序(默认)
从大到小 降序 反序 反自然顺序
select first_name,salary from s_emp
order by salary desc;
无论升序还是降序 NULL都作为最大值处理
如果排序字段的值相等 排列是随机的
把first_name ,salary 按first_name的升序排列
select first_name,salary from s_emp
order by first_name;
把first_name ,salary 按first_name的降序排列
select first_name,salary from s_emp
order by first_name desc; 注意: 'aa' 'aaa'
前面相同 后面有字符比没有字符大
先按first_name 升序排序
如果名字相同 再按工资降序
select first_name,salary from s_emp
order by first_name,salary desc; //很少用的情况
select first_name,salary from s_emp
order by 1;
D.single fun
单行函数
处理每一条
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
得到一个结果
select lower(first_name) from s_emp;
组函数
处理一组记录 得到一个结果
select count(first_name) from s_emp;
函数的作用:
1.对显示的列进行计算
2.修改非法数据
3.对一组数据进行统一操作
4.按格式显示数据
5.修改一些列的类型
函数分类:
1.字符串处理
lower 小写
upper 大写
initcap 每个单词的首字母大写
为了测试单行函数
dual ----单行单列的表 测试表
select initcap('one world one dream')
from dual;
select upper('one world one dream')
from dual;
select first_name||last_name from s_emp;
select concat(first_name ,last_name)
from s_emp;
substr(data,p1,p2)
data:要处理的字符串也可以是字段名
p1:代表截取的起始位置 从1开始编号
p2:代表截取的长度
select substr('hello',1,2) from dual;
//如果想从后向前处理字符串 则可以
用负数从后向前编号 从-1开始
select substr('hello',-2,2) from dual;
select length('hello') from dual;
//carmen
select first_name from s_emp where
lower(first_name)='carmen';
注意:where后所有的函数 慎用
可能会降低效率
2.数字处理
round(par1,par2) 四舍五入
par1:要处理的数据
par2:默认是0 代表小数点后的位数
如果是负数就代表小数点前
trunc(par1,par2) 截取
par1:要处理的数据
par2:默认是0 代表小数点后的位数
如果是负数就代表小数点前
3.日期处理
4.格式转换的
to_char(要处理的数据,'fmt')
003,112,346.899,123
L ------本地货币符号(, RMB)
$ ------美元符号
, ------国际货币计数分隔符
. ------小数点
9 ------代表任意数字
0 ------强制显 fm ------格式开始
select to_char(13456.68989,
'fmL099,999.999999') from dual;
注意:0占用了9的位置
如果想显示中文的货币符号
需要改变一个环境变量NLS_LANG
转成bash
NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
CHINESE 中文
CHINA 中国地区
ZHS16GBK 编码
如果后面没有格式 则证明
把前面的数据类型转成字符串
to_number
select first_name from s_emp where id='11';
select first_name from s_emp
where id=to_number('11');
注意:
如果查询中有数字类型
则会自动向数字类型转换 不用to_number
函数嵌套:
select lower(substr(first_name,1,3))
from s_emp;
找出谁是老板 把老板的manager_id
显示成 'boss'
select first_name,manager_id
from s_emp where manager_id is null;
select first_name,
nvl(to_char(manager_id),'boss')
from s_emp where manager_id is null;
显示每个人的后2个字母 并大写显示
E.muti table select
数据分布在不同表中
s_emp -----员工表 dept_id----部门号
老板需要一张 每个员工在那个部门
select first_name,dept_id from s_emp; 部门相关的信息 -------s_dept----部门表
Name
----------
ID -------部门编号
NAME -------部门名称
REGION_ID -------地区编号
s_region
Name
-----------
ID -------地区编号
NAME -------地区名
笛卡尔积
拿着一张中所有记录和另一张表中所有的记录
依次匹配得到的一个大集合
select first_name,name from
s_emp,s_dept
where dept_id=s_dept.id;
注:如果表中的字段重名
则可以用加表名的方式解决
1.把脚本拷贝到一个位置
2.上传到服务器
3.运行脚本
@文件路径/文件名
4.提交 commit;
//查询每个部门id,名称对应的地区名称
select s_dept.id,s_dept.name,s_region.name
from s_dept,s_region
where region_id=s_region.id;
//把叫name 的列显示成20个字符
col name for a20
//显示每个员工 的名字以及
所在的部门名和部门所在的地区名
select first_name,s_dept.name,s_region.name
from s_emp ,s_dept ,s_region
where s_emp.dept_id=s_dept.id and
s_dept.region_id=s_region.id; //选择下面
s_emp s_dept s_region
select e.first_name,d.name,r.name
from s_emp e,s_dept d,s_region r
where e.dept_id=d.id and
d.region_id=r.id;
1.平时写sql 可以先写from
并且需要的话可以起别名
2.再写where 的连接条件
3.再写select 别名可以区分不同表中重复的列
//先做笛卡尔积还是先做where条件?
答案:先做where条件 把不符合的数据过滤掉
连接:
内连接:被选择的记录 等值连接:连接条件使用等号的
上面连接的例子都是等值连接
非等值连接:连接条件不是用等号的
把每个员工的first_name 和salary
select first_name,salary from s_emp;
把每个员工的first_name 和salary
以及对应的工资级别列出
salgrade
Name
-------
GRADE ------工资级别
LOSAL ------低工资开始
HISAL ------高工资结束
select first_name,salary,grade
from s_emp,salgrade
where salary>=losal and salary<=hisal;
select first_name,salary,grade
from s_emp,salgrade
where salary between losal and hisal;
自连接:
数据就在一张表
查询那些人是领导,
如果一个人的id 等于另一个人的manager_id
id manager_id
1
2 1
3 2
4 2
5 1
select id,manager_id from s_emp
order by id;
select id,manager_id,first_name
from s_emp
where id=manager_id; //error
select distinct m.first_name,
m.id,m.manager_id
from s_emp e,s_emp m
where e.manager_id=m.id;
//把表用别名拆成两张完全相同的表
但表的地位不同 e 员工表 m 领导表
外连接:结果集=内连接的结果集+匹配不上的
一个也不能少
找出那些人是普通员工,
select distinct m.first_name,
m.id,m.manager_id
from s_emp e,s_emp m
where e.manager_id!=m.id;//25
select distinct m.first_name,
m.id,m.manager_id
from s_emp e,s_emp m
where e.manager_id(+)=m.id;
select distinct m.first_name,
m.id,m.manager_id
from s_emp e,s_emp m
where e.manager_id(+)=m.id
and e.manager_id is NULL;
(+)含义是:+号对面的那张表的数据全部被匹配出来
s_emp salary 2500
1 Caremn 4
2 3
5
显示所有的工资级别 和级别对应的
员工的salary和first_name
salgrade s_emp
select grade,first_name,salary
from s_emp,salgrade
where salary(+) between losal and hisal;
//老板给自己加薪10000
update s_emp set salary=salary+10000 where id=1;
//显示所有人的工资和工资级别
如果没有对应的工资级别则空着
1.先写内连接
2.考虑加号位置
select first_name,salary,grade
from s_emp,salgrade
where salary between losal(+)
and hisal(+);
//上面外连接只针对oracle
//sql99中
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
了外连接
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的写法
左外连接 left outer join
select first_name,salary,grade
from s_emp,salgrade
where salary between losal(+)
and hisal(+);
select first_name,salary,grade
from s_emp left outer join salgrade
on salary between losal
and hisal;
//如果谁发起连 右外连接 right outer join
select first_name,salary,grade
from salgrade right outer join s_emp
on salary between losal
and hisal;
全外连接 full outer join
=左外连接+右外连接 重复排掉
//把谁是普通员工的问题 用sql99的标准实现
F.group function
G.sub select