SQL server 学习总结

时间:2024.5.2

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 删除索引

数据控制语言(DCL):用来授予或回收访问数据库的某种特权,并进行控制数据

库操纵事务发生的时间及效果和对数据库实行监视等!如:

GRANT 授权

REVOKE 取消权限

ROLLBACK [WORK] TO [SAVEPOINT] 回退到某一点

ROLLBACK 回滚---回滚命令使数据库状态回到上次最后提交的状态,其操作方法

如下:

SQL> ROLLBACK;

COMMIT [WORK] 提交---在对数据库进行插入、删除和修改操作时,只有当事务

在提交到数据库时才算完成,在事务提交前,只有操作数据库的这个人才能有权

看到所做的事情,别人只有在最后提交完成后才可以看到。而提交数据有三种类

型:

显式提交

隐式提交

自动提交

显式提交:

用COMMIT命令直接完成的提交为显式提交,其命令方式为:

SQL> COMMIT;

隐式提交:

用SQL命令间接完成的提交为隐式提交,这些命令为:

ALTER AUDIT COMMENT CONNECT CREATE DISCONNECT DROP EXIT GRANT NOAUDIT

QUIT REVOKE RENAME

自动提交:

若把AUTOCOMMIT参数设置为ON,则在插入、修改、删除语句执行后,系统将自动

进行提交,这就是传说中的自动提交,其命令方式为:

SQL> SET AUTOCOMMIT ON;

上一篇文章我也介绍了ISQL*Plus和OEM,其实ISQL*Plus是在oracle 9i产品中新

增的,并在oracle 10g中得到加强。

接下来我们首先来了解一下SQL中最常用到的语句: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;

除了可以选择表中的列之外,我们还可以选择伪列。一个伪列的行为像表中的列

一样,但不是真正存储在表中的,你是不能插入、删除伪列的值。一些可用的伪

列有: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中的算术表达式

工作中可能需要修改数据的显示方式,如执行计算、假定推测等等,这些都可能

用到算术表达式。一个算术表达式可以包括列名、固定的数字值、和算术运算符

常用的运算符:

+加 -减 *乘 /除

我们可以对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;

定义列别名

在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;

文字字符串

文字字符串是包含在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;

条件和排序

条件:where子句后实现

排序:order by子句后实现

在这之前先来查询EMPLOYEES表

SQL> select employee_id,last_name,job_id department_id from employees;

如果我们需要选择出部门100的员工,如何做呢?

我们可以用where子句限制返回的行,where子句跟着from子句。格式:

select * |{[distinct] column | expression [alias] ,...} from table

[where econdition(s)];

如:SQL> select employee_id,last_name,job_id,department_id from

employees where department_id=100;

条件中使用字符串和日期

在WHERE子句中字符串和日期必须包含在单引号(‘’)中。但是,数字常数不应

该包含在单引号中。且所有的字符搜索是大小写敏感的。

oracle数据库以内部数字格式存储日期:世纪、年、月、日、小时、分和秒。默

认的日期显示是DD-MON-YYYY。

几种常见的比较条件

oracle SQL中的比较条件包含以下几种运算符号:

= 等于

> 大于

>= 大于等于

< 小于

<= 小于等于

<> 不等于

!= 不等于

^= 不等于

between...and... 在两个值之间(包含)

in(set) 匹配一个任意值列表

like 匹配一个字符模板

is null 是一个空值

is not null 不是一个空值

使用比较条件:

SQL> select last_name,salary from employees where salary<=2300;

使用between条件:

SQL> select last_name,salary from employees where salary between 3000

and 5000;

between...and...实际上是由oracle服务器转变为一对and条件:(a>=下限)and

(a<=上限),因此between...and...并没有性能上的提高,只是逻辑上的简单

使用in条件

SQL> select employee_id,last_name,salary,manager_id from employees

where manager_id in (100,101,201);

在in条件中可以使用任何数据类型。如:

SQL> select employee_id,manager_id,department_id from employees where

last_name in('hartstein','vargas');

如果in条件中的成员是字符或日期,它们必须放在单引号(‘’)中。in条件同

样也是没有得到性能上的提高,只是逻辑上简单了。

使用like条件:

有些时候不知道要搜索的确切的值,这个时候可以用like条件匹配一个字符模板

的行。oracle世界中有两个通配符(%和_)可以用来构造搜索串。其中%表示0个

或多个字符,_表示一个字符。如:

SQL> select first_name from employees where first_name like 's%';

SQL> select last_name from employees where last_name like '_o%';

我们也可以使用escape标识符可以搜索实际的%和_符号,比如你想要搜索包含

‘SA_’的字符串,可以使用如下命令:

SQL> select employee_id,last_name,job_id from employees where job_id

like '%SA\_%AN' escape '\';

而如果你想要搜索包含%SA的字符串,可以使用下面的命令:

SQL> select * from test where department_name like '\%SA%' escape '\';

escape选项指定反斜线(\)为换码符,在SQL命令中,换码符字符在下划线和百

分号的前面,原因是oracle服务器逐字解释字符串。

使用NULL/NOT NULL条件

SQL> select last_name,manager_id from employees where manager_id is

null;

SQL> select last_name,job_id,commission_pct from employees where

commission_pct is not null and rownum<10;

逻辑条件

逻辑条件用于组合两个比较条件的结果来产生一个基于这些条件的单个结果,或

者逆转一个单个条件的结果。SQL有三个逻辑运算符,分别是:and or not 如: SQL> select employee_id,last_name,job_id,salary from employees where

salary>=10000 and job_id like '%MAN%';

SQL> select employee_id,last_name,job_id,salary from employees where

salary>=10000 or job_id like '%MAN%';

SQL> select last_name,job_id from employees where job_id not in

('IT_PROG','ST_CLERK','SA_REP');

SQL> select last_name,job_id from employees where job_id not like '%

A%';

同样not运算符也可以用于另一个SQL运算符,如:in between null

.......where job_id not in ('AC_ACCOUNT','AD_VP')

.......where salary not between 10000 and 15000

.......where commission_pct is not null

优先规则

优先规则定义表达式求值和计算的顺序,默认情况下SQL的执行顺序为:算术运算

、连字操作、比较操作、is[not]null,like,[not]in5、[not]between、not逻辑

条件、and逻辑条件、or逻辑条件。如:

SQL> select last_name,job_id,salary from employees where

job_id='SA_REP' or job_id='AD_PRES' and salary>15000;

第一个条件是:job_id是AD_PRES并且薪水高于15000

第二个条件是:job_id是SA_REP

使用括号强制优先权:

SQL> select last_name,job_id,salary from employees where

(job_id='SA_REP' or job_id='AD_PRES') and salary>15000;

排序

排序分为升序、降序

语法格式:

select expr from table [where condition(s)] [order by {column,expr}

[asc|desc]];

order by指定排序显示返回的行,asc以升序排列,desc以降序排列。order by子

句在select语句的最后(除非使用了for update语句)。如:

SQL> select last_name,job_id,department_id,hire_date from employees

order by hire_date;

降序排列

SQL> select last_name,job_id,department_id,hire_date from employees

order by hire_date desc;

默认情况下oracle系统是将查询的结果进行升序排列的

反转默认排序

SQL> select last_name,salary from employees order by 2 desc;

用列别名进行排序

SQL> select employee_id,last_name,salary * 12 annsal from employees

order by annsal;

多列排序

SQL> select last_name,department_id,salary from employees order by

department_id,salary desc;

oracle sql 单行函数

函数是SQL的一个非常强有力的特性,函数能够用于:执行数据计算、修改单个数

据项、操纵输出进行行分组、格式化显示的日期和数字、转换列数据类型。SQL函

数分为单行函数和多行函数。

单行函数:这些函数仅对单个行进行运算,并且每行返回一个结果,其中单行函

数还有很多种类型,比如:字符、数字、日期、转换

多行函数:这些函数能够操纵成组的行,每个行组给出一个结果,这些函数也被

称为组函数。

单行函数的特点:只对一行值进行操作,如有多行值,将分别对多行值进行操作

,而不会将多行值作为一个整体进行操作。

语法格式:function_name(arg1,arg2,...)

function_name---是函数的名字

arg1,arg2---是由函数使用的任意参数,可以由一个列名或者一个表达式提供

常用的单行函数有:

字符函数

数字函数

日期函数

转换函数

通用函数

字符函数:

字符函数包括:大小写处理函数、字符处理函数

大小写处理函数:LOWER UPPER INITCAP

字符处理函数:CONCAT SUBSTR LENGTH INSTR LPAD|RPAD TRIM REPLACE

LOWER:将指定字符串内字符变为小写 如:select lower('what is this') from

dual;

UPPER:将指定字符串内字符变为大写 如:select upper('what is this') from

dual;

INITCAP:将字符串中单词的第一个字母转换为大写,其它则转换为小写 如:select initcap('what is this') from dual;

CONCAT:连接字符串,等同于|| 如:

SQL> select concat('aa','bb') from dual;

CONC

----

aabb

SUBSTR:截取指定长度的字符串。

n1---开始长度

n2---截取的字符串长度,如果为空,默认截取到字符串结尾

注意:如果n1为0的时候,则从第一个字符算起。

同时当n1>0的时候,oracle默认是从左向右确认起始位置进行截取。如: SQL> select substr('what is this',5,3) from dual;

SUB

---

is

但是如果n1<0的时候,oracle默认是从右向左确认起始位置进行截取。如: SQL> select substr('what is this',-6,3) from dual;

SUB

---

s t

当n1>c1.length的时候则返回为空。

LENGTH:返回指定字符串的长度。如:

SQL> select length('1234567') from dual;

LENGTH('1234567')

-----------------

7

INSTR:至于INSTR函数的作用看如下命令

SQL> select instr('abcdefg','e',-3) from dual;

INSTR('ABCDEFG','E',-3)

-----------------------

5

格式:instr(c1,c2[,n1[,n2]])

作用:返回c2在c1中的位置。其中c1是原字符串,c2是要寻找的字符串,n1是查

询起始位置(正值表示从

左到右、负值表示从右到左。而大小表示位置,比如3表示左边第3处开始;-3表

示右边第三处开始),如

果为0,则返回的也是0。n2是第几个匹配项的意思。

LPAD:返回指定长度等于n的字符串,这里有几个注意点:

n<c1.length则从右到左截取指定长度返回

n>c1.length并且c2 is null则以空格从左向右补充字符长度至n并返回

n>c1.length并且c2 is not null则以指定字符c2从左向右补充c1长度至n并返回

如:

SQL> select lpad('what is this',5),lpad('what is this',25),lpad('what

is this',25,'-') from

dual;

LPAD( LPAD('WHATISTHIS',25) LPAD('WHATISTHIS',25,'-')

----- ------------------------- -------------------------

what what is this -------------what is this

RPAD:返回指定长度等于n的字符串,基本与上面的LPAD相同,只是补充字符是从

右向左,方向正好与

LPAD相反

数字函数:

数字函数包括:ROUND、TRUNC、MOD

ROUND:四舍五入函数

TRUNC:截断函数,不进行四舍五入

MOD:求余函数

对于这三类数字函数的用法我用三个例子来说明一下:

ROUND函数:

SQL> select round(23.56),round(23.56, 1),round(23.56, -1) from dual;

ROUND(23.56) ROUND(23.56,1) ROUND(23.56,-1)

------------ -------------- ---------------

24 23.6 20

TRUNC函数:

SQL> select trunc(23.56),trunc(23.56, 1),trunc(23.56, -1) from dual;

TRUNC(23.56) TRUNC(23.56,1) TRUNC(23.56,-1)

------------ -------------- ---------------

23 23.5 20

TRUNC(n1[,n2])返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置

时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。

MOD函数:

SQL> select mod(24,5) from dual;

MOD(24,5)

----------

4

MOD(n1,n2)函数返回n1除n2的余数,而如果n2=0则返回n1的值

日期函数

oracle数据库以内部数字格式存储日期,表示世纪、年、月、日、小时、分和秒 世纪信息可从sysdate函数中获得,但是默认情况下日期字段中的世纪部分是不显

示在屏幕上的

data数据类型总是以4位内部数字存储年信息:两位数字代表世纪、两位数字代表

系统日期

current_date用来返回当前session所在时区的默认时间

SQL> select current_date from dual;

CURRENT_DATE

-----------------

20100514 11:10:49

SQL> alter session set nls_date_format = 'mm-dd-yyyy';

Session altered.

SQL> select current_date from dual;

CURRENT_DA

----------

05-14-2010

current_date和sysdate是一样的,但是如果同时用current_date和sysdate时,

可能会有点差别。

SQL> select sysdate from dual;

SYSDATE

----------

05-14-2010

用日期计算

运算 结果 说明

date+number 日期 加上一个天数到一个日期 date-number 日期 从一个日期上减一个天数 date-date 天数 用一个日期减去另一个日期 date+number/24 日期 加上一个小时到一个日期上 日期函数

months_between用来返回两个月份之间的月份差

SQL> select months_between(sysdate,sysdate) from dual;

MONTHS_BETWEEN(SYSDATE,SYSDATE)

-------------------------------

SQL> select months_between(sysdate,add_months(sysdate,3)) from dual; MONTHS_BETWEEN(SYSDATE,ADD_MONTHS(SYSDATE,3))

---------------------------------------------

-3

add_months返回指定日期月份+n之后的值,n可以为任何整数

SQL> select add_months(sysdate,1) from dual;

ADD_MONTHS(SYSDAT

-----------------

20100614 16:19:03

SQL> select add_months(sysdate,-2) from dual;

ADD_MONTHS(SYSDAT

-----------------

20100314 16:22:35

next_day用来指定n2天后的第一天

SQL> select next_day(sysdate,5) from dual;

NEXT_DAY(SYSDATE,

-----------------

20100520 16:25:14

SQL> select next_day(sysdate,'sunday') from dual;

NEXT_DAY(SYSDATE,

-----------------

20100516 16:29:22

注意:如果是用星期字符,则它的兴起形式需要与当前session默认时区中的星期

形式相同

last_day用来指定时间所在月的最后一天

SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDATE)

-----------------

20100531 16:36:16

转换函数

在某些情况下,oracle服务器使用一种数据类型的数据,但是在一些特定情况下

我们希望使用一种不同数据类型的数据,如果这种情况发生,oracle服务器自动

转换数据为期望的数据类型。这种数据类型的转换可以被oracle服务器隐式进行

,或由用户显式进行。

隐式数据类型转换

隐式数据类型转换用转换函数进行。转换函数使其从一种数据类型转换到另一种

数据类型。且第一个数据类型为输入数据类型,第二个数据类型为输出数据类型

。不建议用它!

显示数据类型转换

SQL提供了三种函数来从一种数据类型转换到另一种数据类型:

to_char

to_number

to_date

其中to_char函数又可以分为三小类:

转换字符--->字符(将nchar,nvarchar2,clob,nclob类型转换成char类型)

SQL> select to_char('AABBCC') from dual;

TO_CHA

------

AABBCC

转换时间--->字符(将data,timestamp,timestamp with time zone转换成

varchar2)

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY

-------------------

2010-05-14 17:12:29

转换数值--->字符(将制定数值转换为varchar2类型并返回)

SQL> select to_char(-100,'l99g999d99mi') from dual;

TO_CHAR(-100,'L99G99

--------------------

$100.00-

to_date将char,nchar,varchar2,nvarchar2转换为日期类型

SQL> select to_date(2454336,'j') from dual;

TO_DATE(2454336,'

-----------------

20070823 00:00:00

SQL> select to_date('2010-5-14 17:19:00','yyyy-mm-dd hh24:mi:ss') from

dual;

TO_DATE('2010-5-1

-----------------

20100514 17:19:00

to_number将char,nchar,varchar2,nvarchar2型字串转换为数值类型并返回 SQL> select to_number('-100.00','9g999d99') from dual;

TO_NUMBER('-100.00','9G999D99')

-------------------------------

-100

嵌套函数

单行函数能够被嵌套任意层次,嵌套函数的计算式从最里层到最外层的。 看下面的例子:

SQL> select add_months(sysdate,1) from dual;

ADD_MONTHS(SYSDAT

-----------------

20100614 16:19:03

当然我们还可以继续嵌套,这里只需要有这样的灵活性即可!!!!!

通用函数

通用函数并不针对某种具体的数据类型,它们可以对几乎所有的数据类型进行操

作,因此被称为通用函数!

常用的通用函数有:

nvl、nvl2

nullif

coalesce

nvl:如果字符1为null,则oracle将字符2自动转换成字符1的类型 SQL> select nvl(null,'12') from dual;

NV

--

12

nvl2:如果字符1非空则返回字符2,如果字符1为空则返回字符3

SQL> select nvl2('a','b','c'),nvl2(null,'b','c') from dual;

N N

- -

b c

nullif:当字符1=字符2的时候返回空值,当字符1不等于字符2时返回字符1 SQL> select nullif('a','b'),nullif('a','a') from dual;

N N

- -

a

coalesce用于返回序列中的第一个非空值

SQL> select coalesce(null,5,6,null,9) from dual;

COALESCE(NULL,5,6,NULL,9)

-------------------------

5

在很多时候一个表的数据已经无法满足我们对查询和统计的要求,这个时候就需

要从不同的表、视图中选择数据,那么我们就需要从多表中选择数据。 多表选择数据可以是两个表或者视图,也可以是两个以上的表或者视图。

从多表查询数据也被称为多表连接,连接时数据库中常用的查询数据的方法。 我们先来如下的sql语句:

SQL> select jocky.deptno,jocky.dname from dept jocky;

DEPTNO DNAME

---------- --------------

10 ACCOUNTING

20 RESEARCH

30 SALES

40 OPERATIONS

这里的jocky是我自行设定的表别名,再来看看如下操作:

SQL> select ji.ename,ji.job,ji.sal from emp ji;

ENAME JOB SAL

---------- --------- ----------

SMITH CLERK 800

ALLEN SALESMAN 1600

WARD SALESMAN 1250

JONES MANAGER 2975

MARTIN SALESMAN 1250

BLAKE MANAGER 2850

那么如何进行表连接呢?

SQL> select jocky.deptno,jocky.dname,ji.ename,ji.job,ji.sal

2 from dept jocky,emp ji;

DEPTNO DNAME ENAME JOB SAL ---------- -------------- ---------- --------- ----------

10 ACCOUNTING SMITH CLERK 800 10 ACCOUNTING ALLEN SALESMAN 1600 10 ACCOUNTING WARD SALESMAN 1250 10 ACCOUNTING JONES MANAGER 2975 10 ACCOUNTING MARTIN SALESMAN 1250 10 ACCOUNTING BLAKE MANAGER 2850 10 ACCOUNTING CLARK MANAGER 2450 部分省略!

有效连接条件与笛卡尔积

当一个连接条件无效或被遗漏时,其结果是一个笛卡尔积,其中所有行的组合都

被显示(如我上面的操作),也就是第一个表中的所有行链接到第二个表中的所有

行。所以一个笛卡尔积会产生大量的行,其结果没什么实际意义,所以应该尽量

使用where子句来限制一下输出。

SQL> select * from jocky; SQL> select * from ji;

EMPLOYEE_ID NAME NAME SALARY

----------- ---------- ---------- ----------

1 jocky jocky 10000

2 john john 5800

3 smith smith 8900

4 mike mike 6666

5 kyte kyte 9000

SQL> select a.employee_id,a.name,b.salary

2 from jocky a,ji b

3 where a.name = b.name

4 order by salary;

EMPLOYEE_ID NAME SALARY

----------- ---------- ----------

2 john 5800

4 mike 6666

3 smith 8900

5 kyte 9000

1 jocky 10000

连接的类型

oracle sql的连接类型有下面几种:

equjion等值连接

no-equjion非等值连接

outer join外连接

self join自连接

其中外连接又分为:左连接、右连接、全外连接。

表连接原则

当数据从多表中查询时要使用连接条件,一个表中的行按照对应列中的公值被连

接到另一个表中的行(是不是有点绕口啊!即通常所说的主键和外键)。

为了连接n个表在一起,你最少需要n-1个连接条件。但是如果表中有一个连接主

键,那就另当别论了!

等值连接

等值连接是使用最多的一种连接方式

连接条件是两个表中的某个列相等(就如我上面的操作),当然上面的操作也可以

写成:

SQL> select employee_id,a.name,salary

2 from jocky,ji

3 where jocky.name = ji.name

4 order by salary;

EMPLOYEE_ID NAME SALARY

----------- ---------- ----------

2 john 5800

4 mike 6666

3 smith 8900

5 kyte 9000

1 jocky 10000

除了order by还可以用and来作为附加条件。

等值连接中的列别名、表别名

如果连接的两个表(或者两个以上)表中有相同名字的列,那么此列表现形式为“

表名.列名”

表别名最多可以有30个字符

如果在from子句中表别名被用于指定的表,那么在整个select语句中都要使用表

别名。

表别名只对当前的select语句有效。

不能对不同的表适用相同的表别名,如果使用,则只对使用的第一个表起作用。 多于两个表的等值连接

前面提到连接n个表需要n-1个连接条件,先来看看下面三个表:

SQL> select * from jocky; SQL> select * from ji; SQL> select * from

oracle;

EMPLOYEE_ID NAME NAME SALARY NAME SEX ----------- ---------- ---------- ---------- ---------- ----------

1 jocky jocky 10000 jocky man

2 smith smith 8900 smith man

3 mike mike 9000 mike woman 4 john john 6500 john woman 5 jack jack 7000 jack man

连接操作:

SQL> select a.employee_id,a.name,b.salary,c.sex

2 from jocky a,ji b,oracle c

3 where a.name = b.name

4 and b.name = c.name;

EMPLOYEE_ID NAME SALARY SEX

----------- ---------- ---------- ----------

1 jocky 10000 man

2 smith 8900 man

3 mike 9000 woman

4 john 6500 woman

5 jack 7000 man

非等值连接

连接条件不是两个表的某列(或者某些列)相等,就是非等值连接。

其用的并不多

现在假设有两个表,分别为a和b

非等值连接的条件是:a的salary列中的大小在b的min_salary和max_salary之间

,命令:

select ......

from ......

where a.salary between b.min_salary and max_salary;

外连接

普通的表连接(包括上面演示的部分)被称为内连接,内连接的特点是如果一个

行不满足连接条件,该行将不出现在查询结果中。

当使用外连接,不满足连接条件的行也会在输出结果中。先看下面两张表: SQL> select * from jocky; SQL> select * from ji;

EMPLOYEE_ID NAME NAME SALARY

----------- ---------- ---------- ----------

1 jocky jocky 10000

2 mike mike 8000

3 smith smith 2500

4 blues blues 5000

5 john john 6800

green 5500

如果使用上面的等值连接的话,那么green用户是不会显示出来的!如果我们非要

使green那行显示出来,那么我们就需要用到外连接;外连接的符号式+。如: SQL> select a.employee_id,a.name,b.salary

2 from jocky a,ji b

3 where a.name(+)=b.name;

EMPLOYEE_ID NAME SALARY

----------- ---------- ----------

1 jocky 10000

2 mike 8000

3 smith 2500

4 blues 5000

5 john 6800

5500

显示b表中不满足的行,如果想显示a表中不满足的行则改写成a.name = b.name

(+);

但是不支持两边都(+)

全外连接

SQL> select a.employee_id,a.name,b.salary

2 from jocky a full outer join ji b

3 on (a.name = b.name);

EMPLOYEE_ID NAME SALARY

----------- ---------- ----------

1 jocky 10000

2 mike 8000

3 smith 2500

4 blues 5000

5 john 6800

5500

左外连接

SQL> select a.employee_id,a.name,b.salary

2 from jocky a

3 left outer join ji b

4 on (a.name = b.name);

EMPLOYEE_ID NAME SALARY

----------- ---------- ----------

1 jocky 10000

2 mike 8000

3 smith 2500

4 blues 5000

5 john 6800

右外连接

SQL> select a.employee_id,a.name,b.salary

2 from jocky a

3 right outer join ji b

4 on(a.name = b.name);

EMPLOYEE_ID NAME SALARY

----------- ---------- ----------

1 jocky 10000

2 mike 8000

3 smith 2500

4 blues 5000

5 john 6800

5500

自连接

自连接是一种使用很少的连接形式,可以是等值或非等值的连接!自连接示例: SQL> select a.name || 'salary is' || b.salary

2 from ji a,ji b

3 where a.name = b.name;

A.NAME||'SALARYIS'||B.SALARY

-----------------------------------------------------------

jockysalary is10000

mikesalary is8000

smithsalary is2500

bluessalary is5000

johnsalary is6800

greensalary is5500

SQL1999连接语法介绍

SQL 1999标准,也简称SQL 99,是国际标准组织于19xx年定义的SQL标准,目前所

有大、中型数据库都支持它

交叉连接

其实就等同于笛卡尔积

命令:select a.name,b.salary from jocky a cross join ji b;

SQL> select a.name,b.salary from jocky a cross join ji b;

NAME SALARY

---------- ----------

jocky 10000

jocky 8000

jocky 2500

jocky 5000

jocky 6800

jocky 5500

mike 10000

mike 8000

mike 2500

自然连接

SQL> select a.employee_id,b.salary from jocky a natural join ji b; EMPLOYEE_ID SALARY

----------- ----------

1 10000

2 8000

3 2500

4 5000

5 6800

更多相关推荐:
Dreamweaver的个人总结

个人总结学习Dreamweaver的这一个学期张老师讲了Dreamweaver知识和基本的PHP知识让我受益匪浅自己能够做一个小型的静态网页计算机知识是博大精深的它需要不断的学习来解决现实里的实际问题Adobe...

Dreamweaver网页制作技巧心得体会

Dreamweaver网页制作技巧心得体会熟悉网页设计的网友就知道,调用Style的方法很多,我们可以单击鼠标右键选择CustonStyle来调用Style标准,也可以在状态栏中的元素列表上单击右键来调用Sty…

Dreamweaver课程总结

Dreamweaver课程总结Web静态页面与浏览器基础知识:web静态页面:web静态页面是指在浏览器显示出来的一系列的文字和各种的表格图片的集合。web静态页面具有的优点是:1.相应快。在同等条件下。一个静…

dreamweaver 网页设计总结

任务驱动教学的实践与探索----------谈《Dreamweaver网页设计》的实践教学刘敏:《任务驱动教学反思与重建》提出“任务驱动”教学法,是一改以往由教师提出任务的做法,让教师通过创设情景、作品演示、调…

Dreamweaver课程总结

第一章网页设计基础一TCPIP协议传输控制协议互联网络协议TCP和IP可以单独使用但经常是协同工作互相补充简单地说IP提供了数据传输的灵活性TCP提供了数据传输的可靠性二Internet采用一种唯一通用的地址格...

dreamweaver实验报告

实验报告课程名称指导教师学院专业班级学生姓名学号一实验目的和要求1熟悉Dreamweaver操作界面文档和本地站点的创建2练习使用Dreamweaver编辑网页二实验原理掌握Dreamweaver的操作环境利用...

Dreamweaver考题总结

Dreamweaver考题总结技巧综合1涉及菜单或者面板题目将英文翻译为中文或者中文翻译成英文就为正确答案例16267810151721226728303132349121314192根据常识做出合乎逻辑的判断...

Dreamweaver网页设计_实训报告

广播电视大学实训报告书一说明1浅灰色部分由学生填写2白色部分为教师判分用3本报告与学生实际作品相关联实训报告书二说明1浅灰色部分由学生填写2白色部分为教师判分用3本报告与学生实际作品相关联实训报告书三说明1浅灰...

Flash和Dreamweaver要点总结

FLASH动画处理技术要点操作要点1动画的存储格式新建打开文件常规文件按模板创建显示帧2打开库素材导入使用已有库中的图片P9修改文件属性3工作区工作区域选择窗口工作区传统库窗口库属性窗口属性4图层普通图层引导图...

校内实习之Dreamweaver mx 20xx网页制作心得的计划书

校内实习计划书姓名学号学院专业信息与计算科学实习内容DreamweaverMX下的网页设计与制作辅助软件FireworksMXFlash校内实习计划书一目的为了让自己在实习期间学有所成培养自己的自学能力将理论和...

Dreamweaver实验报告 - 副本

实验报告教技1101班1103014032苏永吉一实验目的要求1熟悉Dreamweaver的操作界面能够创建站点和文档利用其基本功能进行简单的编辑操作2能够使用Dreamweaver软件制作简单的网页二实验仪器...

Dreamweaver网页设计实训报告-06

中央广播电视大学实训报告书说明1浅灰色部分由学生填写2白色部分为教师判分用3本报告与学生实际作品相关联

dreamweaver学习总结(10篇)