SQL(Structure Query Language):结构化查询语言,是用于访问关系型数据库的专用语言,同样也是数据库的核心语言。它功能强大、效率高、简单易学易维护。正因为它简单,也就暴露出它的缺点来,就好比便宜没好货一样(当然,SQL绝对是物美价廉的实惠“货”)。
SQL是非过程性语言,即大多数语句都是独立执行的,与上下文无关,而绝大部分应用都是一个完整的过程,显然用SQL完全实现这些功能是很困难的,而为了解决这个问题大多数数据库公司作了如下两方面的工作:
(1):扩充SQL,在SQL中引入过程性结构
(2):把SQL嵌入到高级语言中,以便一起完成一个完整的应用
SQL的分类
SQL语言共分为三大类:数据操作语言(DML),数据定义语言(DDL),数据控制语言(DCL)
数据操作语言主要有四种形式:
插入:INSERT
更新:UPDATE
删除:DELETE
查询:SELECT
数据定义语言主要用来创建数据库中的各种对象---表、视图、索引、同义词、聚簇等
CREATE DATABASE 创建数据库
CREATE TABLE 创建表
DROP TABLE 删除表
ALTER TABLE 修改表的结构
CREATE VIEW 创建视图
DROP VIEW 删除视图
CREATE INDEX 创建索引
DROP INDEX 删除索引
CREATE VIEW 创建视图
DROP VIEW 删除视图
CREATE INDEX 创建索引
DROP INDEX 删除索引
数据控制语言(DCL):用来授予或回收访问数据库的某种特权,并进行控制数据库操纵事务发生的时间及效果和对数据库实行监视等!如:
GRANT 授权
REVOKE 取消权限
ROLLBACK [WORK] TO [SAVEPOINT] 回退到某一点
ROLLBACK 回滚---回滚命令使数据库状态回到上次最后提交的状态,其操作方法如下:
SQL> ROLLBACK;
COMMIT [WORK] 提交---在对数据库进行插入、删除和修改操作时,只有当事务在提交到数据库时才算完成,在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。而提交数据有三种类型:
显式提交
隐式提交
自动提交
GRANT 授权
REVOKE 取消权限
ROLLBACK [WORK] TO [SAVEPOINT] 回退到某一点
ROLLBACK 回滚---回滚命令使数据库状态回到上次最后提交的状态,其操作方法如下:
SQL> ROLLBACK;
COMMIT [WORK] 提交---在对数据库进行插入、删除和修改操作时,只有当事务在提交到数据库时才算完成,在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。而提交数据有三种类型:
显式提交
隐式提交
自动提交
显式提交:
用COMMIT命令直接完成的提交为显式提交,其命令方式为:
SQL> COMMIT;
用COMMIT命令直接完成的提交为显式提交,其命令方式为:
SQL> COMMIT;
隐式提交:
用SQL命令间接完成的提交为隐式提交,这些命令为:
ALTER AUDIT COMMENT CONNECT CREATE DISCONNECT DROP EXIT GRANT NOAUDIT QUIT REVOKE RENAME
用SQL命令间接完成的提交为隐式提交,这些命令为:
ALTER AUDIT COMMENT CONNECT CREATE DISCONNECT DROP EXIT GRANT NOAUDIT QUIT REVOKE RENAME
自动提交:
若把AUTOCOMMIT参数设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是传说中的自动提交,其命令方式为:
SQL> SET AUTOCOMMIT ON;
若把AUTOCOMMIT参数设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是传说中的自动提交,其命令方式为:
SQL> SET AUTOCOMMIT ON;
上一篇文章我也介绍了ISQL*Plus和OEM,其实ISQL*Plus是在oracle 9i产品中新增的,并在oracle 10g中得到加强。
接下来我们首先来了解一下SQL中最常用到的语句:SELECT(查询)
那么我们通过SELECT语句可以做哪些事情呢?可以做如下几种操作:
列选择:选择表中特定的列
行选择:选择表中特定的行
连接:能够使用SELECT语句的连接功能来进行数据库对象的连接,并返回几个对象的集合的数据,这些数据被存储在不同的表、视图中(所谓视图可以将其想象成表,只是一般不存储实际的数据),在这些不同的表、视图之间是可以创建连接的。连接可以针对两个表或者视图,也可以针对多个表或者视图。并且连接还有不同的类型,比如外连接、内连接、左连接、右连接等。
那么我们通过SELECT语句可以做哪些事情呢?可以做如下几种操作:
列选择:选择表中特定的列
行选择:选择表中特定的行
连接:能够使用SELECT语句的连接功能来进行数据库对象的连接,并返回几个对象的集合的数据,这些数据被存储在不同的表、视图中(所谓视图可以将其想象成表,只是一般不存储实际的数据),在这些不同的表、视图之间是可以创建连接的。连接可以针对两个表或者视图,也可以针对多个表或者视图。并且连接还有不同的类型,比如外连接、内连接、左连接、右连接等。
来看一下SELECT命令的语法,一个SELECT语句必须包括一个SELECT子句和一个FROM子句:
SELECT * |{[DISTINCT] column | expression [alias],...} FROM table;
其中[]里面的内容是可选项
SELECT 是一个或多个字段的列表
* 选择所有的列
DISTINCT 禁止重复
column|expression 选择指定的字段或表达式
alias 给所选择的列不同的标题
FROM 指定包含列的表
如:
列出所有列:SQL> select * from test;
列出所有列:SQL> select department_id,department_name,manager_id,location_id from test;
列出指定列:SQL> select department_id,department_name from test;---当然这里的列的排列顺序是可以自定义的,你也可以这样:select department_name,department_id from test;
SELECT * |{[DISTINCT] column | expression [alias],...} FROM table;
其中[]里面的内容是可选项
SELECT 是一个或多个字段的列表
* 选择所有的列
DISTINCT 禁止重复
column|expression 选择指定的字段或表达式
alias 给所选择的列不同的标题
FROM 指定包含列的表
如:
列出所有列:SQL> select * from test;
列出所有列:SQL> select department_id,department_name,manager_id,location_id from test;
列出指定列:SQL> select department_id,department_name from test;---当然这里的列的排列顺序是可以自定义的,你也可以这样:select department_name,department_id from test;
除了可以选择表中的列之外,我们还可以选择伪列。一个伪列的行为像表中的列一样,但不是真正存储在表中的,你是不能插入、删除伪列的值。一些可用的伪列有:CURRVAL NEXTVAL LEVEL ROWID ROWNUM。其中CURRVAL NEXTVAL来自于序列(SEQUENCE),LEVEL来自于分析函数,ROWID显示了该列的实际存储位置,ROWNUM显示了该列在当前条件下的顺序号。
注意:在ISQL*Plus中子句最后的分号(;)不是必须的,但是还是推荐使用!
在SQL语句中我们可以使用别名来覆盖列标题,比如:
SQL> select last_name,hire_date,salary from test;可以改成:
SQL> select last_name ln,hire_date hd,salary sr from test;
在SQL语句中我们可以使用别名来覆盖列标题,比如:
SQL> select last_name,hire_date,salary from test;可以改成:
SQL> select last_name ln,hire_date hd,salary sr from test;
SQL中的算术表达式
工作中可能需要修改数据的显示方式,如执行计算、假定推测等等,这些都可能用到算术表达式。一个算术表达式可以包括列名、固定的数字值、和算术运算符。
常用的运算符:
+加 -减 *乘 /除
我们可以对NUMBER、DATE、TIMESTAMP使用加、减的操作,如:
select 2+department_id,department_id-2,department_id*3,department_id/4 from test;
其运算优先级和数学中是一样的,先乘除后加减,“()”里面优先执行!如:
SQL> select department_name,2*(department_id+200-2) from test;
工作中可能需要修改数据的显示方式,如执行计算、假定推测等等,这些都可能用到算术表达式。一个算术表达式可以包括列名、固定的数字值、和算术运算符。
常用的运算符:
+加 -减 *乘 /除
我们可以对NUMBER、DATE、TIMESTAMP使用加、减的操作,如:
select 2+department_id,department_id-2,department_id*3,department_id/4 from test;
其运算优先级和数学中是一样的,先乘除后加减,“()”里面优先执行!如:
SQL> select department_name,2*(department_id+200-2) from test;
定义空值
空是一个难以获得的、未分配的、未知的,或不适用的值(相当于值被设置为NULL)。空和0或者和空格是不相同的,0是一个数字,而空格是一个字符。任何列的数据类型都可以包含为空,但是某些约束如:NOT NULL和PRIMARY KEY可以用来防止在列中为空!空值无法和数字型的列和常量进行计算,但是可以和字符串类型的列和常量进行连接。如:
SQL> select department_id,department_name,testn-2 from test;
SQL> select department_id,department_name,testn+2 from test;
由上面的两个语句可以看到没有任何结果,因为空值无法和数字型的列和常量进行计算。但是继续看下面的SQL语句:
SQL> select department_id,department_name,testn||'test' from test;
空是一个难以获得的、未分配的、未知的,或不适用的值(相当于值被设置为NULL)。空和0或者和空格是不相同的,0是一个数字,而空格是一个字符。任何列的数据类型都可以包含为空,但是某些约束如:NOT NULL和PRIMARY KEY可以用来防止在列中为空!空值无法和数字型的列和常量进行计算,但是可以和字符串类型的列和常量进行连接。如:
SQL> select department_id,department_name,testn-2 from test;
SQL> select department_id,department_name,testn+2 from test;
由上面的两个语句可以看到没有任何结果,因为空值无法和数字型的列和常量进行计算。但是继续看下面的SQL语句:
SQL> select department_id,department_name,testn||'test' from test;
定义列别名
在SELECT列表中的列名后面指定别名,列名和别名之间用空格分开。默认情况下,别名标题用大写字母显示。如果别名中包含空格或者特殊字符(例如 # 或者 & 等等),或者大小写敏感,将别名放在双引号“”中。如:
SQL> select department_id did,department_name dname from test;
SQL> select department_id as did,department_name as dname from test;
SQL> select department_id "did",department_name "dname" from test;
SQL> select department_id as 部门编号,department_name as 部门名称 from test;
以上几种方法均可以用!
虽然列别名用小写字母定义,但是在查询显示结果中,列标题用大写字母显示,因为默认情况下列标题用大写字母显示。还有注意的输出的列标题与列名的定义完全相同。
在一个SQL语句中,一个列别名既能用在SELECT语句中也能用在ORDER BY子句中,但是不能在WHERE子句中使用列别名。如:
SQL> select department_id did,department_name dname,2/testn ot from test order by did;
可正常查询
SQL> select department_id did,department_name dname,2/testn ot from test order by did where did>0;
这里不能正常查询,会报错
在SELECT列表中的列名后面指定别名,列名和别名之间用空格分开。默认情况下,别名标题用大写字母显示。如果别名中包含空格或者特殊字符(例如 # 或者 & 等等),或者大小写敏感,将别名放在双引号“”中。如:
SQL> select department_id did,department_name dname from test;
SQL> select department_id as did,department_name as dname from test;
SQL> select department_id "did",department_name "dname" from test;
SQL> select department_id as 部门编号,department_name as 部门名称 from test;
以上几种方法均可以用!
虽然列别名用小写字母定义,但是在查询显示结果中,列标题用大写字母显示,因为默认情况下列标题用大写字母显示。还有注意的输出的列标题与列名的定义完全相同。
在一个SQL语句中,一个列别名既能用在SELECT语句中也能用在ORDER BY子句中,但是不能在WHERE子句中使用列别名。如:
SQL> select department_id did,department_name dname,2/testn ot from test order by did;
可正常查询
SQL> select department_id did,department_name dname,2/testn ot from test order by did where did>0;
这里不能正常查询,会报错
连字运算符
主要作用:连接列或者字符串到其它的列,构造一个字符表达式的合成列
表示方法:||
学习目的:进行列与列之间、列与算术表达式之间或者列与常数值之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列。如:
SQL> select department_id||department_name as "depart" from test;
主要作用:连接列或者字符串到其它的列,构造一个字符表达式的合成列
表示方法:||
学习目的:进行列与列之间、列与算术表达式之间或者列与常数值之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成一个单个的输出列。如:
SQL> select department_id||department_name as "depart" from test;
文字字符串
文字字符串是包含在SELECT列表中的一个字符串,一个数字或者一个日期,并且不是列名或者别名。
文字字符串是包含在SELECT列表中的一个字符串,一个数字或者一个日期,并且不是列名或者别名。
相同的行
默认情况下除非你特别指出,否则sqlplus显示的查询结果中不限制重复的行。如:
SQL> select * from numtest;
你会看到有很多重复的行,那么如何去除重复的行呢?很简单,在SELECT子句中用DISTINCT关键字就能去掉相同的行,同样在DISTINCT关键字后面可以指定多个列。如:
SQL> select distinct * from numtest;
SQL> select distinct numt from numtest;
SQL> select distinct name from numtest;
默认情况下除非你特别指出,否则sqlplus显示的查询结果中不限制重复的行。如:
SQL> select * from numtest;
你会看到有很多重复的行,那么如何去除重复的行呢?很简单,在SELECT子句中用DISTINCT关键字就能去掉相同的行,同样在DISTINCT关键字后面可以指定多个列。如:
SQL> select distinct * from numtest;
SQL> select distinct numt from numtest;
SQL> select distinct name from numtest;