您的位置:首页 > 数据库

标准SQL

2015-09-16 16:27 330 查看

一、SQL语句分类

select语句 查询语句

select

DDL 数据定义语言

create table 建立表

drop table 删除表

alter table 修改表

DML 数据操作语言

insert 增加数据

delete 删除数据

update 修改数据

TCL 事务控制语句

commit 提交

rollback 回滚

savepoint 保存点

二、查询语句

1.SQL中的数学运算

//一个月按照22 计算 求s_emp表中每个人的每天的平均工资
select  salary,salary/22 from s_emp;
//   一年按照16个月 计算 显示s_emp每个人的月薪和年薪
select  salary,salary*16 from s_emp;


2.字段或者表达式的别名

select  salary sal,salary*16 yearsal from s_emp;


SQL中字符串的表达

使用单引号表达

” ’ ’ ‘a’ ‘hello world’

|| 字符串拼接符

select  first_name,last_name from s_emp;
//   把first_name 和 last_name 拼接起来
select  first_name||last_name from s_emp;


4.NULL 值处理

NULL值和任何值做运算结果都是NULL

处理方式:nvl(par1,par2) 可以处理任何类型 但要求par1和par2类型一致。当par1为NULL 时会返回par2对应的值 par1不为NULL就返回par1。

select salary,
nvl(salary*12*(1+commission_pct/100),0)
from s_emp;


5.数据的排重 distinct

单字段排重:select distinct salary from s_emp;

多字段排重: 当多个字段的值都相同时 才认为是重复的数据

SELECT  distinct  id,TITLE, SALARY
FROM S_EMP;


6.常见的条件运算符

= != > < >= <=

SQL 提供的条件运算符

//   表达一个闭区间 [a,b]
where  字段 between a  and b;
//表达一个字段在一个指定的列表中取值
where  字段  in (值1,值2,值3);


7.null值的判断 : is null

where  字段 is null;


8.模糊查询like

SQL中的通配符 : % 0-n个任意字符

_ 1个任意字符

//查询s_emp 表找出 first_name 中第二个字符是a的
select first_name
from  s_emp
where first_name like '_a%';


特殊的模糊查询

//找出以S_开头的表名
select table_name from user_tables
where table_name like 'S\_%' escape '\';


9.,逻辑条件连接符

and

or

not : ca —>not ca

= != ^= <>

<=
<      >=
between a and b  not between a and b
in        not in  (注意空值)
like      not like
is null   is not null


10.排序子句

语法:select 字段名

from 表名

where 条件

order by 排序标准 排序方式; 排序方式:

升序  默认的  asc   自然顺序  字典顺序


//   按照salary 降序排序显示s_emp 表中的id first_name 和 salary
select id,first_name,salary
from  s_emp
order by salary desc;


多字段排序:如果第一排序字段的值相同时 就可以启用第二排序字段对数据进行排列。

//按照salary 降序排序显示s_emp 表中的id first_name 和 salary,如果salary相同则使用id升序排。
select id,first_name,salary
from  s_emp
order by salary desc,id asc;


tips:NULL 值在排序中的处理作为最大值处理.

11.单行函数和组函数

单行函数:针对sql语句处理的每一行都返回一个结果。sql语句影响多少行就返回多少个结果。

组函数:针对sql语句影响的这一组数据 综合处理之后得到一个结果。无论sql语句影响多少行 只返回一个结果。

//  upper(par1) 把字符串处理成大写
select first_name,upper(first_name)
from s_emp where id=1;


常见组函数:

count(par1) 统计数据的个数

max(par1) 统计最大值

min(par1) 统计最小值

avg(par1) 统计平均值

sum(par1) 统计数据的和

//  统计s_emp 表中的人数  工资的最大值 和 最小值
select count(id),max(salary),min(salary)
from  s_emp;
//  统计s_emp 工资的平均值 和 工资的和
select avg(salary),sum(salary) from s_emp;

//特殊的用法
select avg(distinct salary),
sum(distinct salary) from s_emp;


tips:组函数 对NULL值的处理方式 忽略NULL。

11.多表查询

select 需要的字段名

from 表名1,表名2

where 表之间的连接条件;

//等值连接
//显示s_dept 表中的部门名  和 部门对应的地区名。
select d.name,r.name
from  s_dept d,s_region r
where region_id=r.id;
//非等值连接
//  显示s_emp 表中每个员工的工资 以及对应的工资级别
select salary,grade
from  s_emp,salgrade
where salary  between losal and hisal;


12.特殊的连接——自连接:一张物理表中存储了两层业务含义的数据

要把其中的一层数据查询出来。

如何找出所有的领导? 8 个领导
/* 这个找出的是自己管自己的人 */
select id,first_name
from  s_emp
where  manager_id=id;
/* 把一张物理表 通过起别名看成两张逻辑表 */
select distinct m.id,m.first_name
from  s_emp e,s_emp m
where e.manager_id=m.id;


13.外链接: 外连接的结果集 等于内连接的结果集 加上匹配不上

的记录。(一个也不能少) (+)字段对面的表的数据全部被匹配出来

本质上使用的是NULL 记录匹配

//写一个查询显示每个部门的名字 和 部门对应的地区名  :s_dept    s_region
select  d.name,r.name
from  s_dept d,s_region r
where d.region_id=r.id;
//   现在公司的业务扩展了 增加了新的部门
insert into s_dept values(100,'test100',NULL);
commit;
insert into s_dept values(200,'test200',NULL);
commit;
//   如何显示所有的部门信息?
select  d.name,r.name
from  s_dept d,s_region r
where d.region_id=r.id(+)


非等值外链接

//把s_emp 表中每个员工的id  salary 以及工资对应的
工资级别显示出来。
select id,salary,grade
from  s_emp,salgrade
where salary between losal and hisal;
//给11号涨工资 涨成15000
update  s_emp set salary=15000 where id=11;
commit;
update  s_emp set salary=150 where id=21;
commit;
/* 显示所有的员工的id 和 salary 超出统计范围的
也要显示 */
select id,salary,grade
from  s_emp,salgrade
where salary between losal(+)
and hisal(+);


14.SQL99中的内连接

from a表 join b表 on 表的连接条件

where 过滤条件;

from a表 inner join b表 on 表的连接条件

where 过滤条件;

显示每个部门的名字 和 对应的地区的名字

s_dept s_region

select d.name,r.name

from s_dept d,s_region r

where d.region_id=r.id;

select d.name,r.name

from s_dept d join s_region r

on d.region_id=r.id;

select d.name,r.name

from s_dept d inner join s_region r

on d.region_id=r.id;

15.SQL99中的外连接

1)左外连接 :意思就是a表发起连接代表把a表的数据全部匹配出来。依然使用的是

NULL 记录匹配。

from a表 left outer join b表

on 表的连接条件 where 过滤条件;

2) 右外连接

from a表 right outer join b表

on 表的连接条件 where 过滤条件;

//   找出新增加的部门?
select  d.name,r.name
from  s_dept d,s_region r
where d.region_id=r.id(+);
select  d.name,r.name
from  s_dept d left outer join s_region r
on d.region_id=r.id;

//    改成右外连接
select  d.name,r.name
from   s_region r right outer join s_dept d
on d.region_id=r.id;


3)全外连接: 全外连接只是一个逻辑概念,全外连接的结果集

等译左外连接的结果集 加上右外连接的结果

集 然后减去重复的记录。

SQL99语法
from  a表 full  outer join  b表
on 表的连接条件 where 过滤条件;
Oracle中的实现
union  合并两个结果集并排重
select id from  s_emp  union
select id from s_emp;
union all  合并两个结果集不排重
select id from  s_emp  union  all
select id from s_emp;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: