SQL全称是结构化查询语言,是一种在关系型数据库中定义和操纵数据的标准语言。
一、SQL语言的特点
1、集合性
SQL可以在高层的数据结构上进行工作,工作时不是单条得处理数据,而是对数据进行成组的处理。
所有的SQL语句可以接受集合作为输入,并且返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一台SQL语句的输入。
2、统一性
SQL为许多任务提供了统一的命令,方便学习与使用。
数据库的操作任务主要包括:
a.查询数据
b.在表中插入、修改、删除数据
c.建立、修改、删除数据对象
d.控制对数据和数据对象的读写
e.保证数据库一致性和完整性
3、易于移植性
所有主要的关系型数据库管理系统都支持SQL语言,我们可以很方便得将原先使用的SQL技能从一个RDBMS转到另一个。使用兼容SQL标准编写的程序都是可以移植的。
二、SQL语言的分类
1、数据查询语言(DQL)
select     查询
2、数据操纵语言(DML)
insert     将数据插入到数据库中
update    更新数据库中已经存在的数据
delete    删除数据库中的数据
3、事务控制语言(TCL)
用于维护数据的一致性
commit      提交对数据库的修改
rollback    撤回,取消对数据库的修改
savepoint    设置保存点
4、数据定义语言(DDL)
create    创建表
alter    修改表结构
drop    删除表
truncate    删除表数据,保留表结构
5、数据控制语言(DCL)
用于执行权限授予和权限收回操作。
grant    给用户或角色授予权限
revoke    收回用户或角色所具有的权限
三、检索数据
1、子句:
select
into
from
where
group by
having
order by
2、简单查询
1.检索所有的类
select * from dept;
2.检索指定的列
select name,age from emp;
3.带有表达式的SELECT子句
select sal*(1+0.1) from emp;
4.为列指定别名
select empno as "员工编号" from emp;
5.显示不重复记录
select distinct job from emp;
3、筛选查询
1.比较筛选
=    !=/<>     >    <    >=    <=    
2.使用关键字过滤
like % _
in(目标值1,目标值2,目标值3)
between and
is null
3.逻辑筛选
and     or
4、分组查询
group by子句 分组
having 对分组后的结果进一步做限制
select did , max(salary) from employee group by did having max(salary)>4000;
5、排序查询
order by 对数据进行排序操作(必须出现在最后)
asc升序        
desc降序    
null 最小
6、多表关联查询
1.内连接
inner join/join
使用内连接查询多个表时,必须在from子句之后定义一个on子句
select columns_list from table_name1 join table_name2 on join_condition
2.外连接
左外连接
left join/left outer join
不仅包含了满足连接条件的数据行,还包含了左表中不满足条件的数据行
select e.eid , e.ename ,d.dname,d.location from employee e left join dept d on e.did = d.did;
右外连接
right join/right outer join
不仅包含了满足连接条件的数据行,还包含了右表中不满足条件的数据行
select e.eid , e.ename ,d.dname,d.location from employee e right join dept d on d.did = e.did;
完全外连接(全外连接)
full outer join/full join
select e.eid , e.ename ,d.dname,d.location from employee e full join dept d on d.did = e.did;
3.自然连接
natural join
在检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行自动连接。在自然连接中,用户不需要明确指定进行连接的列,这个任务是由Oracle系统自动完成(消除重复的列)
4.自连接
在应用系统开发中,用户可能会拥有“自引用式”的外键。“自引用式”外键是指表中的一个列可以是该表主键的一个外键。
select e.ename , m.ename from employee e join employee m on e.mgr = m.eid ;
5.交叉连接
cross join
交叉连接实际上就是不需要任何连接条件的连接
交叉连接的结果是一个笛卡尔积,这种查询的结果是非常冗余的,但是可以通过where子句过滤出有用的记录信息
7.查询语句的执行顺序
1.from子句    执行顺序从后到前,从右到左
2.where子句    执行顺序是从右往左的   将能过滤掉最大数量记录的条件放到where子句的右边
3.group by
4.having    尽量避免使用,having会在检索出所有记录之后才对结果集进行过滤,需要排序等操作
5.select    尽量少使用“ * ”    
6.order by    
四、Oracle常用系统函数
五、子查询
单行子查询
单行子查询指的是返回一行数据的子查询语句。当在where中引用单行子查询时,可以使用单行比较运算符
select empno,sal from emp where sal > (select min(sal) from emp);
多行子查询
多行子查询指的是返回多行数据的子查询语句。当在where子句中使用多行子查询时,必须使用多行运算符(in,any,all)

查询不是销售部的员工信息
select deptno,ename,sal from emp where deptno in (select deptno from dept where dname <> 'sales');

查询工资大于部门编号为10的任意一个部门的员工工资即可的其他部门员工信息
select deptno,ename,sal from emp where sal > any (select sal from emp where deptno = 10) and deptno <> 10;

查询工资大于部门编号为30的所有员工工资的员工信息
select deptno,ename,sal from emp where sal > all (select sal from emp where deptno = 30) ;
关联子查询
在单行子查询和多行子查询中,内查询和外查询是分来执行的,也就是说内查询的执行与外查询的执行是没有关系的,外查询仅仅是使用内查询的最终结果。

在一些特殊需求的子查询中,内查询的执行需要借助于外查询,而外查询的执行又离不开内查询的执行,这时,内查询与外查询是互相关联的,这种子查询就被称为关联子查询。

检索工资大于同职位的平均工资的员工信息
select deptno,ename,sal from emp e where sal > (select avg(sal) from emp where job = e.job) ;
六、操作数据库
1.插入数据 insert
a.insert into t1 values(100,1000,2100000000);
b.insert into t1(id) values(1);
2.更新数据  update

update t1 set job = 'salers' where id = 1;
3.删除数据 delete

delete from t1 where id = 1;
 七、表操作
  建表
    a.create table tName(字段1 数据类型,字段2 数据类型...);
    b.create table t1(id tinyint);
    c.create table t1(id tinyint,id1 smallint);
  查看表结构
    a.desc tName;
    b.show  columns from tName ;
  修改表结构
     增加字段
      a.alter table tName add field 数据类型;
         alter table t1 add id2 int ;
     修改字段或者字段类型
    a.alter table tName change OldColumn NewColumn 属性;
       alter table t1 change id id0 bigint;
    b.alter table t1 modify field 属性;
       alter table t1 modify id1 int;
     删除字段
    a.alter table tName drop field;
       alter table t1 drop id2;
    修改表名
    a.rename table OldName to NewName ;
       rename table t1 to t0 ;
 删除表
       a.删除表中的记录,保留表结构
       truncate table tName ;
       truncate table t0 ;
    b.直接删除
           drop table t0;