sql基本语法

来源:互联网 发布:淘宝集市c店免费活动 编辑:程序博客网 时间:2024/06/02 01:11

sql 语句分类

oracle中如果添加双引号代表了要严格区分大小写,当添加单引号时表示该字段为一个字类似字符串,并不区分大小写。
数据检索:select
数据操作:insert update delete
数据定义:create drop alter
事务控制:commit rollback savepoint
数据控制:grant revoke


select salary from s_emp;


select first_name,salary from s_emp;


select * from s_emp;
AA
4.表头名的原样显示
select first_name,salary as "sal" from s_emp;
双引号可以让别名包含空格
select first_name ,salary "sal_emp" from s_emp;
5.字段的数学应用
select salary*12 "year_sal" from s_emp;
//nvl 空值处理函数 nvl(值字段,如果值字段为空则返回第二个值)*******************************
nvl 空值处理函数 如果第一个参数为空就返回第二个参数的值,如果第一个参数非空,则返回第一个参数的值。
select nvl(salary*12*(1+comission_pet/100),0) "year_sal" from s_emp;//这会出现错误,空值不能进行函数运算
改  select nvl(salary,0)*12*(1+comission_pet/100) "year_sal" from s_emp;
6.连接操作符||
select first_name||'_'||last_name from s_emp;
select first_name||" "||last_name from s_emp;
7.排重操作(distinct关键字)
select distinct salary from s_emp;
select distinct salary,id from s_emp;//联合排重。。。。
//BB 条件子句(where关键字)
select first_name,salary from s_emp
where salary>=1400;
2.判断相等
select salary from s_emp
where first_name = 'carmen';
3.判断区间//数字类型可用=进行判断是否相等,字符串不要忘记单引号。oracle对大小写不敏感。bewteen and 表示一个区间
select salary , first_name from s_emp
where salary bewteen 800 and 1400;
4.判断是否在某一领域
in(list)用逗号隔开的一组值
select first_name,salary from s_emp
where dept_id in (12,13,14);
5.字段is null判读一个字段是否为NULL
select id,first_name from s_emp
where manage is null;
6.模糊查询 like+字符串 通配符%代表n各任意字符 _表示一个任意字符
select first_name from s_emp
where first_name like '_a%';
select table_name from user_table
where table_name like 'S%';//logic error


select table_name from user_table
where table_name like 'S\% escape '\';
7.逻辑连接符 and or !


CC 排序 order by
//排序种类可以分为升序(默认顺序)asc 降序(desc)
select first_name,salary from s_emp
where salar>=1
order by salary desc;
round() 四舍五入取整 trunc()截取取整
select
补充:第一排序字段,第二排序字段
select first_name,salay from s_emp
where salary >=1
order by salary asc,fist_name desc;
DD单行函数
对一列0操作后得到一个结果
组函数:对一组数据处理后得到一个结果
select count(id) from s_emp;
select lower('one dream one word') from dual;
select upper(first_name) from s_emp;
select length('one') from dual;
round()四舍五入取整 trunc() 截取取整
select round(99.99) from dual;
select trunc(99.99) from dual;
to_char字符转换函数to_char(字段)把字段变为字符串
to_char(字段值,'格式')
select salary ,to_char(salary,'fmL099,999,00') from s_emp;
EE多表查询-我们需要的数据存在于多个表当中
select first_name,dept_id from s_emp,s_dept;通过笛卡尔积来解决两个表之间的关系
select first_name,dept_id from s_emp,s_dept
where s_emp.id = s_dept.dept_id;
表的连接分成三种(等值连接、内连接、外连接)
等值连接:用等号做两个表的连接
select s_dept.name,s_regin.name
from s_dept,s_regin
where s_dept.id = s_regin.id;
表的别名
select d.name,r.name
from s_dept d,s_regin r
where d.region_id = r.id
非等值连接
//把s_emp表中first_name,salary,grade列一个清单
select first_name,salary,grade
from s_emp e,salgrade g
where salary between local and hisal;


自连接:需要把一个表看成两个表
//谁是领导:把s_emp逻辑上看成两个表,从中找出关系
select m.first_name,m.id
from s_emp e,s_emp m
where e.manage_id = m.id;
//谁是普通员工
select distinct m.first_name,m.id
from s_emp e,s_emp m
where e.region_id != s.id//error


外连接:外连接的结果集等于内连接的结果集加上匹配不上的记录(和直接选择出的是不一样的)
select distinct m.first,m.id
from s_emp e,s_emp m
where e.manage_id(+)=m.id and e.manage_id is null;
//把每个员工所在部门裂处理啊再找出没有员工的部门
select first_name,name
from s_emp,s_dept
where dept_id(+) = s_dept_id and dept_id is null;


外连接的标准实现(sql99)
left outer jion...on...左外连接
right outer jion ...on...右外连接
full jion...on....全连接
//找出哪些部门没有员工
select first_name,name
from s_emp,s_dept
where dept_id(+)=s_dept.id and dept_id is null;
哪张表发起连接哪张表的数据就要全部匹配出来
select first_name,name
from s_dept left outer jion s_emp
on dept_id = s_emp.id and dept_id is null;
//将上述改为右外连接
select first_name,name
from s_emp right outer jion s_dept
on s_dept_id = semp.dept_id and dept_id is null;


oracle不支持两边都加+的形式
union合并两个结果集 并且排重
union all 合并两个结果集但是不进行排重操作


sql99内连接
1》select first_name,name
from s_emp,s_dept
where dept_id = s_dept_id;
2》select first_name ,name
from s_emp inner jion s_dept
on dept_id = s_dept.id;
3》select first_name,name
from s_emp jion s_dept
on dept_id = s_dept.id;
//把每个员工的first_name,salary,部门名,地区名列出
select * from s_emp,s_dept,s_region
where s_emp.id = s_dept.dept_id and s_dept.id = s_region.retion_id ;


FF组函数 和 分组
组函数能把一组数据处理后得到一个结果
count() 统计个数 sum() avg()
select dept_id,count(id) from s_imp
group by dept_id;、、组函数是在group后面处理的。组函数还可出现在having后面和select后运算
where对行数据进行过滤。having对组数据进行过滤。
//部门人数大于1的部门
select dept_id,count(id) from s_emp
group by dept_id
having count(id)>1;
//按照部门号分组统计每个部分的平均工资找出平均工资大于1200的组
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary)>1200;
//显示部门名称
select dept_id,max(name),avg(salary) asal
from s_emp,s_dept
where s_emp.id = s_dept.id
group by dept_id
having avg(salary)>1200
order by asal asc;o


GG子查询:一个sql语句可出现在另一个sql语句中
(一个sql查询结果可作为另一个sql的条件)
1>where 2>having 3>from
select first_name ,id from s_emp
where id in (1,2,3,4,5);
按照部门号分组,求每个部门的平均工资找出平均工资大于平均部门工资。
select dept_id from s_emp
group by dept_id
having avg(salary)>in(
select avg(salary) from s_emp
where dept_id =42);
from你可以把sql语句的查询结果看成一张内存表
select sal from (select id,salary sal
from s_emp where salary>1000)
where sal>1400;




建表 create table 表名 (
字段名 类型,
字段名 类型
);
oracle都是字段在前,类型在后。
varchar 变长存储字符
char 定长存储,数据不够就补空格。(当字段不确定时就使用varchar当字段确定时就使用char);
date日期 select sysdate from dual;
create table test_data(
id number,
birthday date
);
插入元组
insert into test_date values (123,'12-4月-11');
insert into test_date values (1234,sysdate);
to_date(字段名,格式):时间转换函数可以把一个字符按照指定格式换成日期。
insert into test_date values to_date('2008-08-08 20:08:08','yyyy-mm-dd');
数据操作dml
insert update delete
create table test_dml (
id number primary key,
name varchar(30)
);
insert into test_dml values (1,'test');
commit;//事务提交,
rollback;放弃操作。
//有选择性的插入,括号内必须包含所有的非空字段
insert into test_dml(id) values (2);

insert into test_dml values (2,null);
0 0
原创粉丝点击