Oracle SQL语法系列(一)

一、结构化查询语言(SQL

1、数据操作语言(DML

INSERT

UPDATE

DELETE

2、数据定义语言

CREATE

ALTER

DROP

RENAME

TRUNCATE

3、事务控制(TC

COMMIT

ROLLBACK

SAVEPOINT

4、数据控制语言(DCL

GRANT

REVOKE

附录:Linux下执行SQL脚本

@/tmp/create_table.sql

二、创建数据库

create database xiaoxu

user sys identified by 123456

user system identified by 123456

logfile

group 1 (‘/u01/logdata/redo01_xiaoxu.log’) size 20M,

group 2 (‘/u01/logdata/redo02_xiaoxu.log’) size 20M,

group 3 (‘/u01/logdata/redo03_xiaoxu.log’) size 20M,

maxlogfiles 6

maxlogmembers 5

maxloghistory 8

maxdatafiles 300

maxinstances 1

archivelog

force logging

datafile ‘/u02/dbdata/system_xiaoxu_01.dbf’ size 300M,

undo tablespace undotbs

datafile ‘/u03/dbdata/undo_xiaoxu_01.dbf’ size 80M,

default temporary tablespace temp

tempfile  ‘/u04/dbdata/temp_xiaoxu_01.dbf’ size 60M,

extent management local uniform size 1M,

character set AL32UTF8

time_zone = ‘Asia/BeiJing’;

 三、从数据库表中检索信息

 1、列运算

select 10 * (10 / 2 - 2)

from dual;

说明

(1)行标识符(伪劣):rowid、rownum

(2)在别名中使用空格并保持别名文本的大小写形式,就必须使用双引号“”将其括起来。

(3)使用连接操作符 || 来合并列的输出结果

select first_name || ‘  ‘ || last_name as "Customer Name"

from  customers;

(4)理解空值

①select *  from customers

where dob is null;

②select customer_id,first_name,last_name,nvl(phone,‘not phone number‘) as phone_number

from customers;

(5)禁止显示重复行

select distinct customer_id

from purchases;

(6)比较操作符

any:任意值

all:所有值

=:等于

<>或!=:不等于

>:大于

>=:大于等于

<:小于

<=:小于等于

(7)SQL操作符

like

in

between

is null

is nan

还可以使用not使一个操作符的含义相反。

(8)使用like操作符

下划线_:匹配一个字符

百分号%:匹配任意个字符

(9)逻辑操作符

x AND y

x OR y

NOT x

注意:比较操作符的优先级高于AND,而AND的优先级要高于OR。

(10)排序

ORDER BY

ORDER BY 子句必须位于from或where子句之后。

2、添加、修改、删除行

(1)向表中添加行

insert into customers

values (6,‘xiaoxu‘,‘whit‘,‘08-9月-66‘,‘900-100-1111‘);

(2)修改表中的行

update customers

set last_name = ‘Orange‘

where customer_id = 6;

(3)删除行

delete from customers

where customer_id = 6;

四、连接

1、等值连接(=

(1)连接两个表的SELECT语句

要在查询中将两个表连接起来,就需要在查询的FROM子句中同时指定两个表,在WHERE子句中指明两个表中的相关列。

select products.name,product_types.product_type_id

from products,product_types

where products.product_type_id = product_types.product_type_id

AND products.product_id = 3;

(2)连接四个表的select语句

select c.first_name,c.last_name,p.name as product,pt.name as type

from customers c,purchases pr,products p,product_types pt

where c.customer_id = pr.customer_id

and p.product_id = pr.product_id

and p.product_type_id = pt.product_type_id;

2、连接的三种类型

内连接:在连接条件中,如果某一行的列是空值,那么这行就不会返回

外连接:在连接条件中,即使某一行的列是空值,那么这行也会返回;分左外连接、右外连接

自连接:返回连接到同一个表中的行

1)外连接

在非空值表的列的另一边使用加号(+)

select p.name,pt.name

from products p,product_types pt

where p.product_type_id = pt.product_type_id (+)

order by p.name;

在左外连接中,外连接操作符(+)在等于操作符的右边:

select p.name,pt.name

from products p,product_types pt

where p.product_type_id = pt.product_type_id (+)

order by p.name;

在右外连接中,外连接操作符(+)在等于操作符的左边:

select p.name,pt.name

from products p,product_types pt

where p.product_type_id (+)= pt.product_type_id

order by p.name;

2)自连接

自连接是对同一个表进行的连接,要执行一个自连接,必须使用不同的表别名来标识在查询中每次对表的引用。

select w.first_name || ‘ ‘ || w.last_name || ‘ works for ‘ || m.first_name || ‘ ‘ || m.last_name

from employees w,employees m

where w.manager_id = m.employee_id

order by w.first_name;

使用标准的SQL语法执行连接(推荐)

3)内连接(inner join .....on .....

①两个表的内连接

select p.name,pt.name

from products p inner join product_types pt

on p.product_type_id = pt.product_type_id

order by p.name;

②多于两个表的内连接

对customers、purchases、products、product_types这4张表进行连接。

SELECT c.first_name,c.last_name,p.name as product,pt.name as type

FROM customers c INNER JOIN purchases pr

USING (customer_id)

INNER JOIN products p

USING (product_id)

INNER JOIN product_types pt

USING (product_type_id)

ORDER BY p.name;

连接逻辑图

使用USING关键字说明:

1)查询必须是等连接

2)等连接中的列必须同名

3)在USING子句中引用列时不要使用表名或别名,否则会出错

(4)全外连接(full outer join

select p.name,pt.name

from products p full outer join product_types pt

using (product_type_id)

order by p.name;

5)交叉连接

使用ON或USING子句,可以避免产生笛卡尔积。

3、子查询

子查询的类型有:

单行子查询

多行子查询

多列子查询

关联子查询

嵌套子查询

(1)单行子查询

①在where子句中使用子查询

select employee_id,last_name

from employees

where salary < any

(select low_salary

from salary_grades);

②在having子句中使用子查询

③在from子句中使用子查询(内联视图)

select product_id

from

(select product_id from products where product_id <3 );

(2)多行子查询

可以在多行子查询中使用any或all操作符。

在查询中any操作符之前,必须使用一个=、<>、<、>、>=、<=操作符

select employee_id,last_name

from employees

where salary < any

(select  low_salary

from salary_grades);

(3)关联子查询

关联子查询会引用外部SQL语句中的一列或多列

select product_id,product_type_id,name,price

from products outer

where price >

(select avg(price) from products inner

where inner.product_type_id = outer.product_type_id);

(4)包含子查询的UPDATE和DELETE语句

例如将员工ID为4的工资设置为子查询返回的高工资级别的平均值:

update employees

set salary =

(select avg(high_salary) from salary_grades)

where employee_id =4;

五、高级查询

1、集合操作符


操作符


说明


Union all


返回包括重复的行


Union


返回不包括重复的行


intersect


返回两个查询检索出的共有行


minus

说明

使用集合操作符时,所有查询返回的列数以及列的类型必须匹配,但列名可以不同。

select product_id,product_type_id,name

from products

union

select prd_id,prd_type_id,name

from more_products;

2、使用报表函数

查询2003年前三个月的每月销量总和(total_month_amount),以及所有产品类型销量的总和(total_product_type_amount):

select month,prd_type_id,

sum(sum(amount) over (partition by month)) as total_month_amount,

sum(sum(amount)) over (partition by prd_type_id) as total_product_type_amount

from all_sales

where year = 2003 and month <= 3;

3、修改表的内容

复制表结构到新表

①数据一起复制:

create table 新表 as select * from 旧表

②只复制表结构而不复制数据:

create table t2 as select * from t1 where id<1000;

注释:components表中的id最小值为1000,所以这里假如选择小于这个最小值的行,那么就是该表的结构。

六、数据库的完整性

1、主键约束

2、外键约束

3、数据库事务

事务的两个动作,即提交和回滚。同时,可以在事务的任何一个地方设置保存点(savepoint)。

事务的ACID特性

原子性:事务是原子的,一个事务包含的所有SQL语句是不可分割的工作单元。

一致性:事务必须确保数据库的状态保持一致。

隔离性:多个事务可以独立运行,彼此不会产生影响

持久性:事务一旦提交,数据库的变化就会永久被保留下来。

4、并发事务

5、事务锁

6、事务隔离级别

幻像读取

不可重复读取

脏读

7、查询闪回

 七、用户、特权和角色

1、创建用户及其权限

create user xiaoxu identified by 123456;

授权

grant create session,connect to xiaoxu;

修改密码

alter user xiaoxu identified by 1234567;

删除用户

drop user xiaoxu;

授予用户的两种有用角色是:CONNECT、RESOURCE。

向用户授予系统特权

grant create table,create user to xiaoxu;

查询授予用户的系统特权,以该用户登录数据库

Select * from user_sys_privs

撤销用户系统特权

revoke create table from xiaoxu;

2、对象特权

对象特权允许用户对数据库对象执行特定的操作。

①将employees表的select对象特权授予student用户

Grant select on employees to student;

②将employee表的last_name和salary列的update对象特权授予student,并可授予其他用户该权限

Grant update (last_name,salary) on employees to student with grant option;

说明:

若希望用户可将对象特权授予其他用户,使用grant选项

若希望用户可将系统特权授予其他用户,使用admin选项

③查询已授予的对象特权

Select * from user_tab_privs_made

Where table_name = ‘employees’;

④撤销用户的对象特权

撤销student用户对products表的insert特权

Revoke insert on products to student;

 3、角色

(1)创建角色

create role hr_manager;

(2)    为角色授权

Grant create user to hr_manager;

(3)    将角色授予用户

Grant hr_manager to student;

(4)    查询授予用户的角色

Select * from user_role_privs;

(5)    查询授予角色的系统特权

Select * from role_sys_privs;

(6)    查询授予角色的对象特权

Select * from role_tab_privs

Where role = ‘hr_manager’;

(7)    撤销角色

Revoke hr_manager from student;

(8)    从角色中撤销特权

Revoke all on product_types from hr_manager;

(9)    删除角色

Drop role hr_manager;

八、创建表、序列、索引和视图

1、表

(1)创建表

create table student (

id int constraint student_id_pk primary key,

status varchar2(40),

last_modified date default sysdate

);

(2)修改表

添加列

alter table student

add modified_by int;

修改列的数据类型

Alter table student

Modify status char(15);

删除列

Alter table student

Drop column status;

2、 约束

(1)添加check约束

(2)添加not null约束

(3)添加foreign key约束

(4)添加unique约束

(5)删除约束

Alter table student

Drop constraint student_id_pk;

(6)查询约束信息

Select * from user_constraints;

(7)    查询有关列的约束信息

Select * from user_cons_columns

Where table_name = ‘student’;

时间: 2024-10-28 20:58:18

Oracle SQL语法系列(一)的相关文章

Oracle —— Sql语法总结

-- 定义语句块 declare v_name varchar2(30) := 'Jack' -- 定义变量 begin select v_name from dual; exception when others then dbms_output.put_line('有异常'); end; -- if 判断 declare v_num1 number; v_num2 number; v_result varchar2(10); begin if v_num1 is null or v_num2

DB2 SQL语法系列(二)

一.数据库的基本查询 1. 使用case语句替换查询结果集中的数据 case语法格式为: case when 条件1 then 表达式1 when 条件2 then 表达式2 …….. else 表达式 end as 替换的新列名 例如,查询student表中专业为计算机的各同学的学号.姓名和总学分,对其总学分按以下规则进行替换:若总学分为空值,替换为“尚未获取学分”:若总学分小于50,替换为“未修够学分”:若总学分大于等于50,则替换为“修够学分可授予学士学位”:列标题修改为“是否修够学分”.

DB2 SQL语法系列(一)

一.创建数据库 1.创建一个名为“test”的数据库 db2 “create database test automatic storage yes on ‘/home/db2inst1/dbdata’ dbpath on ‘/home/db2inst1/dbctl’using codeset utf-8 territory cn collate using system” 分析: collate using < system | identity | compatibility >,指定数据

ORACLE SQL练习(五)

--日期转换为字符串 SELECT DATE_HIRE, TO_CHAR(DATE_HIRE, 'Month dd yyyy') HIRE FROM EMPLOYEE_PAY_TBL; SELECT EMPLOYEE_TBL.EMP_ID, EMPLOYEE_TBL.LAST_NAME, EMPLOYEE_PAY_TBL.POSITION FROM EMPLOYEE_TBL, EMPLOYEE_PAY_TBL WHERE EMPLOYEE_TBL.EMP_ID = EMPLOYEE_PAY_TB

ORACLE分页查询SQL语法——最高效的分页

--1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM emp t WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') AND ROWNUM <= 20) table_

SQL基础系列(1)-基本语法--转载w3school

1.    建原始表 USE [Northwind] GO /****** Object:  Table [dbo].[Persons]    Script Date: 2016/6/8 7:31:57 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Persons]( [id] [INT] IDENTITY(1,1) NOT NULL, [LastName] [NVARCHAR](50)

db2和oracle sql 语句中计算两个时间差的语法

db2 sql语句中计算两个日期相差的语法 结束日期为:2015-10-10  11:30:00 开始日期为:2015-09-09  10:40:00 (1)timestampdiff(8,char(结束时间-开始时间) )(加时分秒计算,会舍去零数)值为744小时 (2)(days(结束时间)-days(开始时间))*24 +hour(结束时间)-hour(开始时间) (不加时分秒计算)值为745小时 (3)Days(结束日期)-days(开始日期)的值为31天 (4)Day(结束日期)-da

sql语法值ORACLE简介

前言 1977年提出了关系型数据库,大型的数据库产品有oracle.db2和Sybase: 中型的右SqlServer和mysql;小型的代表为access. 正文 数据库的常用术语:dbms是数据库管理系统: dbms是关系型数据库管理系统和dba是数据库管理员的意识 oracle的安装 安装过程简单略过. 安装好之后有个数据库实例sid,即库名. 1) 连接数据库之前记得开启oracleXXX(SID)TNSListener服务和oracleServiceXXX(SID)这两个服务. ora

Oracle SQL性能优化系列

1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行an