SQL常用指令

SQL常用指令

SQL和PL/SQL常用指令


数据库操作包括DML、DDL、DCL
数据库模式定义语言DDL(Data Definition Language)
数据操纵语言DML(Data Manipulation Language)
数据控制语言(Data Control Language)

·常用操作

select …… from dual;
dual为伪表
例如: select sysdate from dual;

SYSDATE
-----------
2016/3/4 11

desc查看表信息
desc EMP;

Name          Type         Nullable Default Comments 
------------- ------------ -------- ------- -------- 
ID            NUMBER(10)   Y                         
NAME          VARCHAR2(20) Y                         
DEPARTMENT_ID NUMBER(10)   Y                        

·DDL

常用的语法
创建数据表 create table table_name
修改数据表 alter table table_name
删除数据表 drop table table_name

创建

创建新表

create table EMP
(   
    id number(10),
    name varchar2(20),
    salary number(20),
    department_id number(10),
    job_id number(10)
    ...
);

使用子查询创建新表

create table EMP
as
select id, name, salary, department_id
from employees
where department_id = 80;

修改

修改表,增加字段

alter table EMP
add (
        department_id number(10);
        ...
    );

修改表,修改字段,类型,类型大小

alter table EMP
modify department_id number(20);

修改表, 删除字段

alter table EMP
drop column department_id;

改表名

alter table EMP
rename to employees;

删除

删除表

drop table EMP;

清楚表数据

truncate EMP;

约束

创建约束

create table EMP
(   
    id number(10),
    name varchar2(20),
    salary number(20),
    department_id number(10),
    job_id number(10)
    constraint emp_id_pk primary key(id)
);

not null约束(只能定义在列级约束)

create table EMP
(   
    id number(10),
    name varchar2(20) not null,
    salary number(20) constraint emp_sal_nn not null,
    department_id number(10),
    job_id number(10)
);

Unique唯一约束

create table EMP
(   
    id number(10),
    name varchar2(20) unique,
    email varchar2(20),
    salary number(20),
    department_id number(10),
    job_id number(10)
    constraint emp_id_uk unique(email)
);

foreign key外键约束

create table EMP
(   
    id number(10),
    name varchar2(20),
    salary number(20),
    department_id number(10),
    job_id number(10),
    constraint emp_id_pk primary key(id),
    constraint emp_department_id_fk   foreign key(department_id)
        references departments(department_id)
);

check约束

create table EMP
(   
    id number(10),
    name varchar2(20),
    salary number(20)
        constraint emp_sal_ck check(salary > 0),
    department_id number(10),
    job_id number(10)
);

-添加或删除约束,但是不能修改约束
-有效化或无效化约束
-添加 NOT NULL 约束要使用 MODIFY 语句
-无效化约束使用disable constraint 约束名,相反使用enable

·DML

查询数据

查询全部列

 select * from EMP

查询多列

select id, name from EMP

查询使用别名 可以省略as

select id as employee_id from EMP

查询合并列(注意使用双引号表示分清大小写)

select id || name as "employee" from EMP

删除重复列的查询

select distinct name from EMP

带条件的查询使用where

select id, name, salary, department_id 
from EMP

where department_id = 80;
范围条件的查询

select id, name, salary
from EMP
where salary between 2500 and 3000;

指定值条件查询

select id, name, salary 
from EMP
where name in('Tom', 'Jim');

模糊查询(%代表多个字符,_代表一个字符,escape’\’ 可以转义”_”, “\%”)

select id, name, salary
from EMP
where name Like '_T%';

查询(非)空值

select id, name, salary
from EMP
where salary is (not) null and department_id =80;

查询使用Order by排序,使用asc 和 desc 升降序

select id, name, salary
from EMP
where department_id = 80
Order by salary (asc)desc, employee_id;

增加数据

增加一条数据(给出字段需要按照顺序,给出相应的value值)
其中,主键若为自增长value为null

insert into EMP(id, name, salary )
values(0, 'Tom', 1000);

使用子查询的方式增加数据,把employees表对应字段值插入EMP表

insert into EMP(id, name, salary)
select id, name, salary from employees;

创建脚本的方式插入数据

insert into EMP(id, name, salary)
values(&id, '&name', &salary)

更新数据

更新数据(只用where指定更新范围)

update EMP
set salary  = 3000
where department_id = 80;

使用子查询方法更新数据

update EMP
set salary = (select salary from employees where id = 3)
where department_id = (select department_id
                       from employees where id = 3);

删除

删除记录,where规定范围

delete from EMP
where id = 5;

事务处理

-通常DDL和DCL语句是自动提交事务的(create,alter,drop)
-使用COMMIT 和 ROLLBACK语句,我们可以:
确保数据完整性。
数据改变被提交之前预览。
将逻辑上相关的操作分组。

-改变前的数据状态是可以恢复的
执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
DML语句所涉及到的行被锁定, 其他用户不能操作。

使用savapoint创建保存点

update ....
savapoint update_done;
insert ....
rollback to update_done;

使用rollback,回滚到删除之前,数据得到恢复

delete from EMP where id = 5;
rollback;

使用commit,数据被删除并提交,不可恢复

delete from EMP where id = 5;
commit;

多表查询

多表查询基本语法,where子句写入连接条件

select e1.id, e1.name, e2.salary, e2.department_id 
from EMP1 e1, EMP2 e2
where e1.id = e2.id;

外连接,除了满足where条件的数据外,只要左(右)外连接,就会把左(右)不满足条件的数据也加进来,右(左)的列填入null值

右外连接
select e1.id, e1.name, e2.salary, e2.department_id 
from EMP1 e1, EMP2 e2
where e1.id(+) = e2.id;

左外连接
select e1.id, e1.name, e2.salary, e2.department_id 
from EMP1 e1, EMP2 e2
where e1.id = e2.id(+);

自连接(所用的都是同一个表的数据)

select e.id, e.name, e0.salary, e0.department_id 
from EMP e, EMP e0
where e.id = e0.id;

自然连接
-NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
-在表中查询满足等值条件的数据。
-如果只是列名相同而数据类型不同,则会产生错误。
Job 表(job_id, city)

select id, name, salary, department_id, job_id, city 
from EMP
natural join Job;

使用using子句指定连接中需要用到的列,(没有用natural)
select id, name, salary, department_id, job_id, city 
from EMP
join Job using(job_id);

使用on子句多表连接

select e1.id, e1.name, e2.salary, e2.department_id, j.job_id, j.city 
from EMP1 e1
join EMP2 e2
on e1.id = e2.id
join Job j
on e2.job_id = j.job_id;

左外连接,右外连接,满连接

左外连接
select e1.id, e1.name, e2.salary, e2.department_id 
from EMP1 e1
left outer join EMP2 e2
on (e1.id = e2.id);

右外连接
select e1.id, e1.name, e2.salary, e2.department_id 
from EMP1 e1
right outer join EMP2 e2
on (e1.id = e2.id);

满连接
select e1.id, e1.name, e2.salary, e2.department_id 
from EMP1 e1
full outer join EMP2 e2
on (e1.id = e2.id);

分组查询

分组函数

avg(salary)–可以使用distinct不计算重复值
count(id) –可以使用distinct不计算重复值 count(*)计算总记录
max(salary)
min(salary)
sum(salary) –可以使用distinct不计算重复值

使用Group by(未包含在分组函数中的列,都需要放倒group by子句中)

select department_id, avg(salary)
from EMP
where department_id < 80
group by department_id;
order by department_id;

使用having,过滤分组

select department_id, avg(salary)
from EMP
where department_id < 80
group by department_id
having avg(salary) > 2000;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值