1.last_name的最后3个字符
select last_name ,substr(last_name,-3,3) from s_emp;
select last_name ,substr(last_name ,length(last_name)-2,3) from s_emp;
2.to_char(par1)函数 :可以把其他类型转成字符串
select to_char(123) from dual;
to_char(par1,par2) :par2表示:格式=>是单引号引起来的 'fmL'//fm可写可不写,最好写。
L:根据系统的语言选择本地货币符号
9:代表任意数字
0:代表强制显示前导0
,:千位分隔符,货币表示的形式
.:小数点
例如:'fmL999,999.99'
select to_char(salary,'fmL099,999.00') from s_emp;
select userenv('lang') from dua;
oracle的语言设置环境变量 :NLS_LANG='SIMPLIFIED CHINESE_GHINA.ZHS16GBK'
NLS_LANG='AMERICAN_AMERICA.ZHS16GBK'
!本质含义是,退出本环境去执行这个命令。 所以!表示shell哦
如果配置错误,则会提示如下内容:
connect access NLS_LANG....不能访问这个环境变量的值。
3。日期:
默认的格式: dd-MON--yy
select sysdate from dual ;
切换成中文:dd-2月-yy 语言不同 会造成日插入失败
注意:sql脚步在英文下写的,应该切换到英文环境和日期;如果是在中文下写的,应该切换到中文环境下和日期下。否则脚本会执行出错
4。to_number() 可以把字符串变成数字
select last_name from s_emp where id=1;
select last_name from s_emp where id='1';
以上2句话执行效果一样,这是oracle的隐士转换,所以这个to_number()变得没有什么意义了
,因为默认就是这样子的。
5。函数嵌套:
select first_name ,manager_id ,last_name from s_emp where id = 1;
select id,first_name,last_name,nvl(to_char(manager_id),'boss') from x;
我们可以把数字类型的字段,列转换string,然后就可以用字符来显示罗。这都可以。我勒个去阿!
6。多表查询:
s_dept 部门表。 s_region 地区表。
7。我发现这个老师有个优点:就是什么东西都会去弄清楚,连笛卡尔积这些东西都会去调查得清楚。
8.两个表用等号做的连接---等值连接 s_emp s_dept s_region
where a=b
不用等号做的连接---非等值连接
where a>1050
特殊的连接:自连接
9。表和表的连接:
================================
10.外连接:一个也不能少(+)是oracle中独有的。
外连接的结果集=内连接的结果集+内连接匹配不上的记录。
where e.managerid(+)=m.id;//即把id(+)所对应的表的所有数据都加入进来。
外连接即:1。找出2张表中符合条件的记录2。其中一张表的所有记录都包括进来。
update s_emp set salary=salary+1000 where manager_id is null;//修改数据
commit;//oracle中不是自动提交事物的,所以需要手工commit;
select first_name ,salary,grade from s_emp where salary between losal and hisal ;
select first_name ,salary ,nvl(to_char(grade),"特级") from s_emp,salgrade where salary between losal(+) and hisal(+);
=========================
insert into s_dept values(100,'it',1);//插入数据
commit;
select * from s_dept;
drop table s_emp cascade constraints;//删除表
----------------------------------------------------------------------
sql99标准:外连接; 同(+)一样的
left outer join on 条件 //左边的都拿过来
right outer join on 条件//右边的都拿过来
full outer join on 条件//左右都拿过来,除去重复的。
例子:select m.first,m.id,e.id from s_emp m left outer join s_emp e on e.id = m.id where e.id is null;// m 发起 连接 e,m 左,e 右
全外连接=左外连接+右外连接-重复的记录(合并结果集)
oracle 中没有直接实现的语法,可以使用union 去重(复),union all 不去重(复)
select id from s_emp union select id from s_emp;
单独的join 和 inner join的使用:
-------------------------------------------------
select first_name ,name from s_emp ,s_dept d where dept_id =d.id;
select first_name ,name from s_emp join s_dept d on dept_id =d.id;
select first_name ,name from s_emp inner join s_dept d on dept_id =d.id;
分组:
select count(id) from s_emp ;
group by 是一个集合的数据按照规则分成更小的组
where 限制行的返回
having 限制组数据的返回
组函数:
count() avg() sum() max() min()
子查询:
select id from dept where id=(select dept_id from s_emp where first_name = 'Carmen' );
having后可以使用子查询
老师推荐:不错
from 后可以使用子查询:你可以把sql语句理解成一张内存表
select * form (select * from abc) b where b.id=3;
作业: