- 浏览: 8459 次
文章分类
最新评论
常用SQL语句大全
下面是一些常用的SQL语句,虽然很基础,可是却很值得收藏,对于初学者非常实用
SQL常用命令使用方法
(1) 数据记录筛选
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 ?? 字段n=值n where 条件表达式"
(3) 删除数据记录
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录
sql="insert into 数据表 (字段1,字段2,字段3 ?) values (值1,值2,值3 ?)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据
表)
(5) 数据记录统计函数
AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名") 获取统的计值其它函数运用同上。
(5) 数据表的建立和删除
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) ?? )
例CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)
4. 记录集对象的方法
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端true表示是false为否 www.docin.comrs.eof 返回记录指针是否超出数据表末端true表示是false为否
rs.delete 删除当前记录但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录
Recordset对象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command
对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这
个参数系统则采用Recordset对象的Source属性。
ActiveConnection
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的
ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息
ConnectionString的字符串参数。
CursorType
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据包括
adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic分述如下
--------------------------------------------------------------
常数 常数值 说明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值启动一个只能向前移动的游标Forward
Only。
adOpenKeyset 1 启动一个Keyset类型的游标。
adOpenDynamic 2 启动一个Dynamic类型的游标。
adOpenStatic 3 启动一个Static类型的游标。
-------------------------------------------------------------
以上几个游标类型将直接影响到Recordset对象所有的属性和方法以下列表说明他们之间
的区别。
-------------------------------------------------------------
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic
adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可读写 可读
写
AbsolutePosition 不支持 不支持 可读写 可读写
ActiveConnection 可读写 可读写 可读写 可读
写
BOF 只读 只读 只读 只
读
Bookmark 不支持 不支持 可读写 可
读写
CacheSize 可读写 可读写 可读写 可读www.docin.com写
CursorLocation 可读写 可读写 可读写 可读
写
CursorType 可读写 可读写 可读写 可读
写
EditMode 只读 只读 只读 只读
EOF 只读 只读 只读 只
读
Filter 可读写 可读写 可读写 可读
写
LockType 可读写 可读写 可读写 可读
写
MarshalOptions 可读写 可读写 可读写 可读
写
MaxRecords 可读写 可读写 可读写 可
读写
PageCount 不支持 不支持 只读 只读
PageSize 可读写 可读写 可读写 可读
写
RecordCount 不支持 不支持 只读 只读
Source 可读写 可读写 可读写 可读
写
State 只读 只读 只读 只读
Status 只读 只读 只读 只读
AddNew 支持 支持 支持 支
持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支
持
Move 不支持 支持 支持 支
持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支
持
MoveNext 支持 支持 支持 支
持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支
持 www.docin.comRequery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法并不适用于Microsoft Access数据库。
LockType
Recordset对象Open方法的LockType参数表示要采用的Lock类型如果忽略这个参数那
么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、
adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等分述如下
-------------------------------------------------------------
常数 常数值 说明
--------------------------------------------------------------
adLockReadOnly 1 缺省值Recordset对象以只读方式启动无法运
行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时系统会暂时锁住其他用户的
动作以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时系统并不会锁住其他用户的
动作其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时其他用户必须将
CursorLocation属性改为adUdeClientBatch才能对数据进行增、
删、改的操作。
DB2 提供了关连式资料库的查询语言 (Structured Query Language)是一种非常口
语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的用以表示关连
式的操作包含了资料的定义以及资料的处理。SQL原来拼成SEQUEL
这语言的原型以“系统 R“的名字在 IBM 圣荷西实验室完成经过IBM内部及其他的许
多使用性及效率测试其结果相当令人满意并决定在系统R 的技术基础发展出来 IBM 的
产品。而且美国国家标准学会ANSI及国际标准化组织ISO在1987遵循一个几乎是
以 IBM SQL 为基础的标准关连式资料语言定义。
一、资料定义 Data Definition Language)
资料定语言是指对资料的格式和形态下定义的语言他是每个资料库要建立时候时首先要面
对的举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关
系等等都是在开始的时候所必须规划好的。
、建表格
CREATE TABLE table_name(
column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...
说明
DATATYPE --是资料的格式详见表。
NUT NULL --可不可以允许资料有空的尚未有资料填入。
PRIMARY KEY --是本表的主键。 www.docin.com
、更改表格
ALTER TABLE table_name
ADD COLUMN column_name DATATYPE
说明增加一个栏位没有删除某个栏位的语法。
ALTER TABLE table_name
ADD PRIMARY KEY (column_name)
说明更改表得的定义把某个栏位设为主键。
ALTER TABLE table_name
DROP PRIMARY KEY (column_name)
说明把主键的定义删除。
、建立索引
CREATE INDEX index_name ON table_name (column_name)
说明对某个表格的栏位建立索引以增加查询时的速度。
、删除
DROP table_name
DROP index_name
二、的资料形态 DATATYPEs
smallint
16 位元的整数。
interger
32 位元的整数。
decimal(p,s)
p 精确值和 s 大小的十进位整数精确值p是指全部有几个数(digits)大小值s是指小数
点後有几位数。如果没有特别指定则系统会设为 p=5; s=0 。
float
32位元的实数。
double
64位元的实数。
char(n)
n 长度的字串n不能超过 254。
varchar(n)
长度不固定且其最大长度为 n 的字串n不能超过 4000。
graphic(n)
和 char(n) 一样不过其单位是两个字元 double-bytes n不能超过127。这个形态是为
了支援两个字元长度的字体例如中文字。
vargraphic(n)
可变长度且其最大长度为 n 的双字元字串n不能超过 2000。
date
包含了 年份、月份、日期。
time
包含了 小时、分钟、秒。 www.docin.comtimestamp
包含了 年、月、日、时、分、秒、千分之一秒。
三、资料操作 Data Manipulation Language)
资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料insert)、查询资料
query、更改资料update) 、删除资料delete四种模式以下分 别介绍他们的语法
、增加资料
INSERT INTO table_name (column1,column2,...)
valueS ( value1,value2, ...)
说明
1.若没有指定column 系统则会按表格内的栏位顺序填入资料。
2.栏位的资料形态和所填入的资料必须吻合。
3.table_name 也可以是景观 view_name。
INSERT INTO table_name (column1,column2,...)
SELECT columnx,columny,... FROM another_table
说明也可以经过一个子查询subquery把别的表格的资料填入。
、查询资料
基本查询
SELECT column1,columns2,...
FROM table_name
说明把table_name 的特定栏位资料全部列出来
SELECT *
FROM table_name
WHERE column1 = xxx
[AND column2 > yyy] [OR column3 <> zzz]
说明
1.'*'表示全部的栏位都列出来。
2.WHERE 之後是接条件式把符合条件的资料列出来。
SELECT column1,column2
FROM table_name
ORDER BY column2 [DESC]
说明ORDER BY 是指定以某个栏位做排序[DESC]是指从大到小排列若没有指明则
是从小到大
排列
组合查询
组合查询是指所查询得资料来源并不只有单一的表格而是联合一个以上的
表格才能够得到结果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
说明
1.查询两个表格中其中 column1 值相同的资料。
2.当然两个表格相互比较的栏位其资料形态必须相同。
3.一个复杂的查询其动用到的表格可能会很多个。
整合性的查询 www.docin.comSELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
说明
查询符合条件的资料共有几笔。
SELECT SUM(column1)
FROM table_name
说明
1.计算出总和所选的栏位必须是可数的数字形态。
2.除此以外还有 AVG() 是计算平均、MAX()、MIN()计算最大最小值的整合性查询。
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
说明
1.GROUP BY: 以column1 为一组计算 column2 的平均值必须和 AVG、SUM等整合性查
询的关键字
一起使用。
2.HAVING : 必须和 GROUP BY 一起使用作为整合性的限制。
复合性的查询
SELECT *
FROM table_name1
WHERE EXISTS (
SELECT *
FROM table_name2
WHERE conditions )
说明
1.WHERE 的 conditions 可以是另外一个的 query。
2.EXISTS 在此是指存在与否。
SELECT *
FROM table_name1
WHERE column1 IN (
SELECT column1
FROM table_name2
WHERE conditions )
说明
1. IN 後面接的是一个集合表示column1 存在集合里面。
2. SELECT 出来的资料形态必须符合 column1。
其他查询
SELECT *
FROM table_name1
WHERE column1 LIKE 'x%'
说明LIKE 必须和後面的'x%' 相呼应表示以 x为开头的字串。
SELECT * www.docin.comFROM table_name1
WHERE column1 IN ('xxx','yyy',..)
说明IN 後面接的是一个集合表示column1 存在集合里面。
SELECT *
FROM table_name1
WHERE column1 BETWEEN xx AND yy
说明BETWEEN 表示 column1 的值介於 xx 和 yy 之间。
、更改资料
UPDATE table_name
SET column1='xxx'
WHERE conditoins
说明
1.更改某个栏位设定其值为'xxx'。
2.conditions 是所要符合的条件、若没有 WHERE 则整个 table 的那个栏位都会全部被更
改。
、删除资料
DELETE FROM table_name
WHERE conditions
说明删除符合条件的资料。
说明关于WHERE条件后面如果包含有日期的比较不同数据库有不同的表达式。具体
如下
(1)如果是ACCESS数据库则为WHERE mydate>#2000-01-01#
(2)如果是ORACLE数据库则为WHERE mydate>cast('2000-01-01' as date)
或WHERE mydate>to_date('2000-01-01','yyyy-mm-dd')
在Delphi中写成
thedate='2000-01-01';
query1.SQL.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)');
如果比较日期时间型则为
WHERE mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')
练掌握SQL是数据库用户的宝贵财 富。在本文中我们将引导你掌握四条最基本的数据操
作语句-SQL的核心功能-来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学
习后显然你已经开始算是精通SQL了。
在我们开始之前先使用CREATE TABLE语句来创建一个表如图1所示。DDL语句对
数据库对象如表、列和视进行定义。它们并不对表中的行进行处理这是因为DDL语句并
不处理数据库中实际的数据。这些工作由另一类SQL语句-数据操作语言DML语句进行
处理。
SQL中有四种基本的DML操作INSERTSELECTUPDATE和DELETE。由于这是大
多数SQL用户经常用到的我们有必要在此对它们进行一一说明。在图1中我们给出了一
个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表我们
在后面的例子中将要用到它。
连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点也是它区别于其
它类型数据库管理系统的一个标志。
在关系数据库管理系统中表建立时各数据之间的关系不必确定常把一个实体的所有信息www.docin.com存放在
一个表中。当检索数据时通过连接操作查询出存放在多个表中的不同实体的信息。连接操
作给用户带
来很大的灵活性他们可以在任何时候增加新的数据类型。为不同实体创建新的表尔后通
过连接进行查询。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立似是而非在FROM子句
中指出连接时有助于
将连接操作与WHERE子句中的搜索条件区分开来。所以在Transact-SQL中推荐使用这
种方法。
SQL-92标准所定义的FROM子句的连接语法格式为
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与连接操作的表名连接可以对同一个表操作也可以对多表操作
对同一
个表操作的连接又称做自连接。
join_type 指出连接类型可分为三种内连接、外连接和交叉连接。内连接(INNER JOIN)
使用比
较运算符进行表间某(些)列数据的比较操作并列出这些表中与连接条件相匹配的数据行。
根据所使用
的比较方式不同内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或
RIGHT JOIN)
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是外连接不只列出
与连接条件相匹
配的行而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜
索条件的数据行。
交叉连接(CROSS JOIN)没有WHERE 子句它返回连接表中所有数据行的笛卡尔积其结
果集合中的
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行
数。
连接操作中的ON (join_condition) 子句指出连接条件它由被连接表中的列和比较运算符、
逻辑
运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接但可以对这三种列进
行间接
连接。例如
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)内连接
内连接查询操作列出与连接条件匹配的数据行它使用比较运算符比较被连接列的列值。内
连接分三种
1、等值连接在连接条件中使用等于号(=)运算符比较被连接列的列值其查询结果中列出
被连接 www.docin.com表中的所有列包括其中的重复列。
2、不等连接 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。
这些
运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接在连接条件中使用等于(=)运算符比较被连接列的列值但它使用选择列表指
出查询
结果集合中所包括的列并删除连接表中的重复列。
例下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接在选择列表中删除authors 和publishers 表中重复列(city和state)
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外连接
内连接时返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)
和连接条件
的行。而采用外连接时它返回到查询结果集合中的不仅包含符合连接条件的行而且还包
括左表(左外
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者以及他们所在的城市
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
三)交叉连接
交叉连接不带WHERE 子句它返回被连接的两个表所有数据行的笛卡尔积返回到结果
集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例titles表中有6类图书而publishers表中有8家出版社则下列交叉连接检索到的记录
数将等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合
显示即执行联合查询。UNION的语法格式为
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n] www.docin.com其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时被联合查询结果集合中的重复
行将只保留一
行。
联合查询时查询结果的列标题为第一个查询语句的列标题。因此要定义列标题必须在第
一个查询语
句中定义。要对联合查询结果排序时也必须使用第一查询语句中的列名、列标题或者列序
号。
在使用UNION 运算符时应保证每个联合查询语句的选择列表中有相同数量的表达式并
且每个查询选
择表达式应具有相同的数据类型或是可以自动将它们转换为相同的数据类型。在自动转换
时对于数值类
型系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中其执行顺序是自左至右使用括号可以改变这一执行顺
序。例如
查询1 UNION (查询2 UNION 查询3)
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如要将雇员John Smith
的记录插入到本例的表中可以使用如下语句
INSERT INTO EMPLOYEES valueS
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句系统将试着将这些值填入到相应的列中。这些列按照我们创
建表时定义的顺序排列。在本例中第一个值“Smith”将填到第一个列LAST_NAME中
第二个值“John”将填到第二列FIRST_NAME中??以此类推。
我们说过系统会“试着”将值填入除了执行规则之外它还要进行类型检查。如果类型
不符如将一个字符串填入到类型为数字的列中系统将拒绝这一次操作并返回一个错误
信息。
如果SQL拒绝了你所填入的一列值语句中其他各列的值也不会填入。这是因为SQL
提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一
部分失败则整个事务都会失败系统将会被恢复或称之为回退到此事务之前的状态。
回到原来的INSERT的例子请注意所有的整形十进制数都不需要用单引号引起来
而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引
起错误。记住在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型我们必须使用SQL标准日期格式yyyy-mm-dd但是在系统中可以
进行定义以接受其他的格式。当然2000年临近请你最好还是使用四位来表示年份。
既然你已经理解了INSERT语句是怎样工作的了让我们转到EMPLOYEES表中的其
他部分
INSERT INTO EMPLOYEES valueS
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES valueS
('John','Adams','1992-01-21', www.docin.com 'Boston',20,100000);
INSERT INTO EMPLOYEES valueS
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES valueS
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES valueS
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES valueS
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最后一项中我们不知道Jones先生的工薪级别和年薪所以我们输入NULL不要
引号。NULL是SQL中的一种特殊情况我们以后将进行详细的讨论。现在我们只需认为
NULL表示一种未知的值。
有时像我们刚才所讨论的情况我们可能希望对某一些而不是全部的列进行赋值。除
了对要省略的列输入NULL外还可以采用另外一种INSERT语句如下
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
value(
'Indiana','Jones',
'1992-02-01','Indianapolis');
这样我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值如果没有
设置缺省值则填入NULL。请注意我们改变了列的顺序而值的顺序要对应新的列的顺序。
如果该语句中省略了FIRST_NAME和LAST_NAME项这两项规定不能为空SQL操作
将失败。
让我们来看一看上述INSERT语句的语法图
INSERT INTO table
[(column { ,column})]
valueS
(columnvalue [{,columnvalue}]);
和前一篇文章中一样我们用方括号来表示可选项大括号表示可以重复任意次数的项
不能在实际的SQL语句中使用这些特殊字符。value子句和可选的列名列表中必须使用
圆括号。
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库
管理中最重要的功能所以SELECT语句在SQL中是工作量最大的部分。实际上仅仅是
访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据
库中选出匹配的行和列并将结果放到临时的表中。在直接SQLdirect SQL中它将结
果显示在终端的显示屏上或者将结果送到打印机或文件中。也可以结合其他SQL语句来
将结果放到一个已知名称的表中。 www.docin.com SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数
运算“选择”或称“限制”但实际上它也可以完成其他两种关系运算-“投影”和“连接”
SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时系统返回由所选择的列以及用户选择的
表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
让我们看一下使用图1中EMPLOYEES表的一些例子这个表是我们以后所有SELECT
语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子
中使用这些结果。
假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT语句的执行将产生如图2中表2所示的结果。
由于我们在SELECT语句中只指定了一个列所以我们的结果表中也只有一个列。注
意结果表中具有重复的行这是因为有多个雇员在同一部门工作记住SQL从所选的所有
行中将值返回。要消除结果中的重复行只要在SELECT语句中加上DISTINCT子句
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
这次查询的结果如表3所示。
现在已经消除了重复的行但结果并不是按照顺序排列的。如果你希望以字母表顺序将
结果列出又该怎么做呢只要使用ORDER BY子句就可以按照升序或降序来排列结果
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH
_OFFICE的这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我
们也必须指出列名呢这是因为我们还能够按照表中其他列进行排序即使它们并不显示出
来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排
列那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序并不影响原来的表。
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了
工资括号中的内容我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下
是你将要用到的语句
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL
将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时这些行将被按照第
二列进行排序如果在第二列中又出现了重复的行时这些行又将被按照第三列进行排
序??如此类推。这次查询的结果如表5所示。
将一个很长的表中的所有列名写出来是一件相当麻烦的事所以SQL允许在选择表中
所有的列时使用*号 www.docin.com SELECT * FROM EMPLOYEES;
这次查询返回整个EMPLOYEES表如表1所示。
下面我们对开始时给出的SELECT语句的语法进行一下更新竖直线表示一个可选项
允许在其中选择一项。
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定义选择标准
在我们目前所介绍的SELECT语句中我们对结果表中的列作出了选择但返回的是表
中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置只有满足条件的行才被包括到结果表中。这些条件由
断言predicate进行指定断言指出了关于某件事情的一种可能的事实。如果该断言对
于某个给定的行成立该行将被包括到结果表中否则该行被忽略。在SQL语句中断言通
常通过比较来表示。例如假如你需要查询所有姓为Jones的职员则可以使用以下SELECT
语句
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时SQL将每一行的LAST_NAME
列与“Jones”进行比较。如果某一职员的姓为“Jones”即断言成立该职员的信息将被包
括到结果表中见表6。
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较LAST_NAME = 'Jones'但是SQL
断言还可以包含其他几种类型的比较。其中最常用的为
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=
下面给出了不是基于等值比较的一个例子
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
这一查询将返回年薪高于$50,000.00的职员参见表7。
逻辑连接符
有时我们需要定义一条不止一种断言的SELECT语句。举例来说如果你仅仅想查看
Davy Jones的信息的话表6中的结果将是不正确的。为了进一步定义一个WHERE子句
用户可以使用逻辑连接符ANDOR和NOT。为了只得到职员Davy Jones的记录用户可
以输入如下语句
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整www.docin.com个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满
足条件时可以使用OR连接符
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston
办事处的职员以外的其他所有职员的信息时你可以进行如下的查询
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某
一职员所在部门的办事处在Boston括号内的表达式返回true但是NOT操作符将该值取
反所以该行将不被选中。
断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值可以用括号将
它们括起来
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用数学上标准的表达式求值的约定-圆括号内的表达式将最先进行求值其他表
达式将从左到右进行求值。
存储过程
--1.给表中字段添加描述信息
Create table T2 (id int , name char (20))
GO
EXEC sp_addextendedproperty 'MS_Description', 'Employee ID', 'user', dbo, 'table', T2,
'column', id
EXEC sp_updateextendedproperty 'MS_Description', 'this is a test', 'user', dbo, 'table', T2,
'column', id
--2.修改数据库名称
EXEC sp_renamedb 'old_db_name', 'new_db_name'
--3.修改数据表名称和字段名称
EXEC sp_rename 'old_table_name', 'new_table_name'--修改数据表名称
EXEC sp_rename 'table_name.[old_column_name]', 'new_column_name', 'COLUMN'--修改字段
名称
--4.给定存储过程名获取存储过程内容
exec sp_helptext sp_name
www.docin.com
SQL常用命令使用方法
(1) 数据记录筛选
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 ?? 字段n=值n where 条件表达式"
(3) 删除数据记录
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录
sql="insert into 数据表 (字段1,字段2,字段3 ?) values (值1,值2,值3 ?)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据
表)
(5) 数据记录统计函数
AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名") 获取统的计值其它函数运用同上。
(5) 数据表的建立和删除
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) ?? )
例CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)
4. 记录集对象的方法
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端true表示是false为否 www.docin.comrs.eof 返回记录指针是否超出数据表末端true表示是false为否
rs.delete 删除当前记录但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录
Recordset对象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command
对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这
个参数系统则采用Recordset对象的Source属性。
ActiveConnection
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的
ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息
ConnectionString的字符串参数。
CursorType
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据包括
adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic分述如下
--------------------------------------------------------------
常数 常数值 说明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值启动一个只能向前移动的游标Forward
Only。
adOpenKeyset 1 启动一个Keyset类型的游标。
adOpenDynamic 2 启动一个Dynamic类型的游标。
adOpenStatic 3 启动一个Static类型的游标。
-------------------------------------------------------------
以上几个游标类型将直接影响到Recordset对象所有的属性和方法以下列表说明他们之间
的区别。
-------------------------------------------------------------
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic
adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可读写 可读
写
AbsolutePosition 不支持 不支持 可读写 可读写
ActiveConnection 可读写 可读写 可读写 可读
写
BOF 只读 只读 只读 只
读
Bookmark 不支持 不支持 可读写 可
读写
CacheSize 可读写 可读写 可读写 可读www.docin.com写
CursorLocation 可读写 可读写 可读写 可读
写
CursorType 可读写 可读写 可读写 可读
写
EditMode 只读 只读 只读 只读
EOF 只读 只读 只读 只
读
Filter 可读写 可读写 可读写 可读
写
LockType 可读写 可读写 可读写 可读
写
MarshalOptions 可读写 可读写 可读写 可读
写
MaxRecords 可读写 可读写 可读写 可
读写
PageCount 不支持 不支持 只读 只读
PageSize 可读写 可读写 可读写 可读
写
RecordCount 不支持 不支持 只读 只读
Source 可读写 可读写 可读写 可读
写
State 只读 只读 只读 只读
Status 只读 只读 只读 只读
AddNew 支持 支持 支持 支
持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支
持
Move 不支持 支持 支持 支
持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支
持
MoveNext 支持 支持 支持 支
持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支
持 www.docin.comRequery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法并不适用于Microsoft Access数据库。
LockType
Recordset对象Open方法的LockType参数表示要采用的Lock类型如果忽略这个参数那
么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、
adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等分述如下
-------------------------------------------------------------
常数 常数值 说明
--------------------------------------------------------------
adLockReadOnly 1 缺省值Recordset对象以只读方式启动无法运
行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时系统会暂时锁住其他用户的
动作以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时系统并不会锁住其他用户的
动作其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时其他用户必须将
CursorLocation属性改为adUdeClientBatch才能对数据进行增、
删、改的操作。
DB2 提供了关连式资料库的查询语言 (Structured Query Language)是一种非常口
语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的用以表示关连
式的操作包含了资料的定义以及资料的处理。SQL原来拼成SEQUEL
这语言的原型以“系统 R“的名字在 IBM 圣荷西实验室完成经过IBM内部及其他的许
多使用性及效率测试其结果相当令人满意并决定在系统R 的技术基础发展出来 IBM 的
产品。而且美国国家标准学会ANSI及国际标准化组织ISO在1987遵循一个几乎是
以 IBM SQL 为基础的标准关连式资料语言定义。
一、资料定义 Data Definition Language)
资料定语言是指对资料的格式和形态下定义的语言他是每个资料库要建立时候时首先要面
对的举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关
系等等都是在开始的时候所必须规划好的。
、建表格
CREATE TABLE table_name(
column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...
说明
DATATYPE --是资料的格式详见表。
NUT NULL --可不可以允许资料有空的尚未有资料填入。
PRIMARY KEY --是本表的主键。 www.docin.com
、更改表格
ALTER TABLE table_name
ADD COLUMN column_name DATATYPE
说明增加一个栏位没有删除某个栏位的语法。
ALTER TABLE table_name
ADD PRIMARY KEY (column_name)
说明更改表得的定义把某个栏位设为主键。
ALTER TABLE table_name
DROP PRIMARY KEY (column_name)
说明把主键的定义删除。
、建立索引
CREATE INDEX index_name ON table_name (column_name)
说明对某个表格的栏位建立索引以增加查询时的速度。
、删除
DROP table_name
DROP index_name
二、的资料形态 DATATYPEs
smallint
16 位元的整数。
interger
32 位元的整数。
decimal(p,s)
p 精确值和 s 大小的十进位整数精确值p是指全部有几个数(digits)大小值s是指小数
点後有几位数。如果没有特别指定则系统会设为 p=5; s=0 。
float
32位元的实数。
double
64位元的实数。
char(n)
n 长度的字串n不能超过 254。
varchar(n)
长度不固定且其最大长度为 n 的字串n不能超过 4000。
graphic(n)
和 char(n) 一样不过其单位是两个字元 double-bytes n不能超过127。这个形态是为
了支援两个字元长度的字体例如中文字。
vargraphic(n)
可变长度且其最大长度为 n 的双字元字串n不能超过 2000。
date
包含了 年份、月份、日期。
time
包含了 小时、分钟、秒。 www.docin.comtimestamp
包含了 年、月、日、时、分、秒、千分之一秒。
三、资料操作 Data Manipulation Language)
资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料insert)、查询资料
query、更改资料update) 、删除资料delete四种模式以下分 别介绍他们的语法
、增加资料
INSERT INTO table_name (column1,column2,...)
valueS ( value1,value2, ...)
说明
1.若没有指定column 系统则会按表格内的栏位顺序填入资料。
2.栏位的资料形态和所填入的资料必须吻合。
3.table_name 也可以是景观 view_name。
INSERT INTO table_name (column1,column2,...)
SELECT columnx,columny,... FROM another_table
说明也可以经过一个子查询subquery把别的表格的资料填入。
、查询资料
基本查询
SELECT column1,columns2,...
FROM table_name
说明把table_name 的特定栏位资料全部列出来
SELECT *
FROM table_name
WHERE column1 = xxx
[AND column2 > yyy] [OR column3 <> zzz]
说明
1.'*'表示全部的栏位都列出来。
2.WHERE 之後是接条件式把符合条件的资料列出来。
SELECT column1,column2
FROM table_name
ORDER BY column2 [DESC]
说明ORDER BY 是指定以某个栏位做排序[DESC]是指从大到小排列若没有指明则
是从小到大
排列
组合查询
组合查询是指所查询得资料来源并不只有单一的表格而是联合一个以上的
表格才能够得到结果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
说明
1.查询两个表格中其中 column1 值相同的资料。
2.当然两个表格相互比较的栏位其资料形态必须相同。
3.一个复杂的查询其动用到的表格可能会很多个。
整合性的查询 www.docin.comSELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
说明
查询符合条件的资料共有几笔。
SELECT SUM(column1)
FROM table_name
说明
1.计算出总和所选的栏位必须是可数的数字形态。
2.除此以外还有 AVG() 是计算平均、MAX()、MIN()计算最大最小值的整合性查询。
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
说明
1.GROUP BY: 以column1 为一组计算 column2 的平均值必须和 AVG、SUM等整合性查
询的关键字
一起使用。
2.HAVING : 必须和 GROUP BY 一起使用作为整合性的限制。
复合性的查询
SELECT *
FROM table_name1
WHERE EXISTS (
SELECT *
FROM table_name2
WHERE conditions )
说明
1.WHERE 的 conditions 可以是另外一个的 query。
2.EXISTS 在此是指存在与否。
SELECT *
FROM table_name1
WHERE column1 IN (
SELECT column1
FROM table_name2
WHERE conditions )
说明
1. IN 後面接的是一个集合表示column1 存在集合里面。
2. SELECT 出来的资料形态必须符合 column1。
其他查询
SELECT *
FROM table_name1
WHERE column1 LIKE 'x%'
说明LIKE 必须和後面的'x%' 相呼应表示以 x为开头的字串。
SELECT * www.docin.comFROM table_name1
WHERE column1 IN ('xxx','yyy',..)
说明IN 後面接的是一个集合表示column1 存在集合里面。
SELECT *
FROM table_name1
WHERE column1 BETWEEN xx AND yy
说明BETWEEN 表示 column1 的值介於 xx 和 yy 之间。
、更改资料
UPDATE table_name
SET column1='xxx'
WHERE conditoins
说明
1.更改某个栏位设定其值为'xxx'。
2.conditions 是所要符合的条件、若没有 WHERE 则整个 table 的那个栏位都会全部被更
改。
、删除资料
DELETE FROM table_name
WHERE conditions
说明删除符合条件的资料。
说明关于WHERE条件后面如果包含有日期的比较不同数据库有不同的表达式。具体
如下
(1)如果是ACCESS数据库则为WHERE mydate>#2000-01-01#
(2)如果是ORACLE数据库则为WHERE mydate>cast('2000-01-01' as date)
或WHERE mydate>to_date('2000-01-01','yyyy-mm-dd')
在Delphi中写成
thedate='2000-01-01';
query1.SQL.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)');
如果比较日期时间型则为
WHERE mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')
练掌握SQL是数据库用户的宝贵财 富。在本文中我们将引导你掌握四条最基本的数据操
作语句-SQL的核心功能-来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学
习后显然你已经开始算是精通SQL了。
在我们开始之前先使用CREATE TABLE语句来创建一个表如图1所示。DDL语句对
数据库对象如表、列和视进行定义。它们并不对表中的行进行处理这是因为DDL语句并
不处理数据库中实际的数据。这些工作由另一类SQL语句-数据操作语言DML语句进行
处理。
SQL中有四种基本的DML操作INSERTSELECTUPDATE和DELETE。由于这是大
多数SQL用户经常用到的我们有必要在此对它们进行一一说明。在图1中我们给出了一
个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表我们
在后面的例子中将要用到它。
连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点也是它区别于其
它类型数据库管理系统的一个标志。
在关系数据库管理系统中表建立时各数据之间的关系不必确定常把一个实体的所有信息www.docin.com存放在
一个表中。当检索数据时通过连接操作查询出存放在多个表中的不同实体的信息。连接操
作给用户带
来很大的灵活性他们可以在任何时候增加新的数据类型。为不同实体创建新的表尔后通
过连接进行查询。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立似是而非在FROM子句
中指出连接时有助于
将连接操作与WHERE子句中的搜索条件区分开来。所以在Transact-SQL中推荐使用这
种方法。
SQL-92标准所定义的FROM子句的连接语法格式为
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与连接操作的表名连接可以对同一个表操作也可以对多表操作
对同一
个表操作的连接又称做自连接。
join_type 指出连接类型可分为三种内连接、外连接和交叉连接。内连接(INNER JOIN)
使用比
较运算符进行表间某(些)列数据的比较操作并列出这些表中与连接条件相匹配的数据行。
根据所使用
的比较方式不同内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或
RIGHT JOIN)
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是外连接不只列出
与连接条件相匹
配的行而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜
索条件的数据行。
交叉连接(CROSS JOIN)没有WHERE 子句它返回连接表中所有数据行的笛卡尔积其结
果集合中的
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行
数。
连接操作中的ON (join_condition) 子句指出连接条件它由被连接表中的列和比较运算符、
逻辑
运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接但可以对这三种列进
行间接
连接。例如
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(一)内连接
内连接查询操作列出与连接条件匹配的数据行它使用比较运算符比较被连接列的列值。内
连接分三种
1、等值连接在连接条件中使用等于号(=)运算符比较被连接列的列值其查询结果中列出
被连接 www.docin.com表中的所有列包括其中的重复列。
2、不等连接 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。
这些
运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接在连接条件中使用等于(=)运算符比较被连接列的列值但它使用选择列表指
出查询
结果集合中所包括的列并删除连接表中的重复列。
例下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接在选择列表中删除authors 和publishers 表中重复列(city和state)
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外连接
内连接时返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)
和连接条件
的行。而采用外连接时它返回到查询结果集合中的不仅包含符合连接条件的行而且还包
括左表(左外
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者以及他们所在的城市
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
三)交叉连接
交叉连接不带WHERE 子句它返回被连接的两个表所有数据行的笛卡尔积返回到结果
集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例titles表中有6类图书而publishers表中有8家出版社则下列交叉连接检索到的记录
数将等
于6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合
显示即执行联合查询。UNION的语法格式为
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n] www.docin.com其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时被联合查询结果集合中的重复
行将只保留一
行。
联合查询时查询结果的列标题为第一个查询语句的列标题。因此要定义列标题必须在第
一个查询语
句中定义。要对联合查询结果排序时也必须使用第一查询语句中的列名、列标题或者列序
号。
在使用UNION 运算符时应保证每个联合查询语句的选择列表中有相同数量的表达式并
且每个查询选
择表达式应具有相同的数据类型或是可以自动将它们转换为相同的数据类型。在自动转换
时对于数值类
型系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中其执行顺序是自左至右使用括号可以改变这一执行顺
序。例如
查询1 UNION (查询2 UNION 查询3)
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如要将雇员John Smith
的记录插入到本例的表中可以使用如下语句
INSERT INTO EMPLOYEES valueS
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句系统将试着将这些值填入到相应的列中。这些列按照我们创
建表时定义的顺序排列。在本例中第一个值“Smith”将填到第一个列LAST_NAME中
第二个值“John”将填到第二列FIRST_NAME中??以此类推。
我们说过系统会“试着”将值填入除了执行规则之外它还要进行类型检查。如果类型
不符如将一个字符串填入到类型为数字的列中系统将拒绝这一次操作并返回一个错误
信息。
如果SQL拒绝了你所填入的一列值语句中其他各列的值也不会填入。这是因为SQL
提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一
部分失败则整个事务都会失败系统将会被恢复或称之为回退到此事务之前的状态。
回到原来的INSERT的例子请注意所有的整形十进制数都不需要用单引号引起来
而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引
起错误。记住在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型我们必须使用SQL标准日期格式yyyy-mm-dd但是在系统中可以
进行定义以接受其他的格式。当然2000年临近请你最好还是使用四位来表示年份。
既然你已经理解了INSERT语句是怎样工作的了让我们转到EMPLOYEES表中的其
他部分
INSERT INTO EMPLOYEES valueS
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES valueS
('John','Adams','1992-01-21', www.docin.com 'Boston',20,100000);
INSERT INTO EMPLOYEES valueS
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES valueS
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES valueS
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES valueS
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最后一项中我们不知道Jones先生的工薪级别和年薪所以我们输入NULL不要
引号。NULL是SQL中的一种特殊情况我们以后将进行详细的讨论。现在我们只需认为
NULL表示一种未知的值。
有时像我们刚才所讨论的情况我们可能希望对某一些而不是全部的列进行赋值。除
了对要省略的列输入NULL外还可以采用另外一种INSERT语句如下
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
value(
'Indiana','Jones',
'1992-02-01','Indianapolis');
这样我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值如果没有
设置缺省值则填入NULL。请注意我们改变了列的顺序而值的顺序要对应新的列的顺序。
如果该语句中省略了FIRST_NAME和LAST_NAME项这两项规定不能为空SQL操作
将失败。
让我们来看一看上述INSERT语句的语法图
INSERT INTO table
[(column { ,column})]
valueS
(columnvalue [{,columnvalue}]);
和前一篇文章中一样我们用方括号来表示可选项大括号表示可以重复任意次数的项
不能在实际的SQL语句中使用这些特殊字符。value子句和可选的列名列表中必须使用
圆括号。
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库
管理中最重要的功能所以SELECT语句在SQL中是工作量最大的部分。实际上仅仅是
访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据
库中选出匹配的行和列并将结果放到临时的表中。在直接SQLdirect SQL中它将结
果显示在终端的显示屏上或者将结果送到打印机或文件中。也可以结合其他SQL语句来
将结果放到一个已知名称的表中。 www.docin.com SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数
运算“选择”或称“限制”但实际上它也可以完成其他两种关系运算-“投影”和“连接”
SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时系统返回由所选择的列以及用户选择的
表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
让我们看一下使用图1中EMPLOYEES表的一些例子这个表是我们以后所有SELECT
语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子
中使用这些结果。
假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT语句的执行将产生如图2中表2所示的结果。
由于我们在SELECT语句中只指定了一个列所以我们的结果表中也只有一个列。注
意结果表中具有重复的行这是因为有多个雇员在同一部门工作记住SQL从所选的所有
行中将值返回。要消除结果中的重复行只要在SELECT语句中加上DISTINCT子句
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
这次查询的结果如表3所示。
现在已经消除了重复的行但结果并不是按照顺序排列的。如果你希望以字母表顺序将
结果列出又该怎么做呢只要使用ORDER BY子句就可以按照升序或降序来排列结果
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH
_OFFICE的这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我
们也必须指出列名呢这是因为我们还能够按照表中其他列进行排序即使它们并不显示出
来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排
列那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序并不影响原来的表。
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了
工资括号中的内容我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下
是你将要用到的语句
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL
将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时这些行将被按照第
二列进行排序如果在第二列中又出现了重复的行时这些行又将被按照第三列进行排
序??如此类推。这次查询的结果如表5所示。
将一个很长的表中的所有列名写出来是一件相当麻烦的事所以SQL允许在选择表中
所有的列时使用*号 www.docin.com SELECT * FROM EMPLOYEES;
这次查询返回整个EMPLOYEES表如表1所示。
下面我们对开始时给出的SELECT语句的语法进行一下更新竖直线表示一个可选项
允许在其中选择一项。
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定义选择标准
在我们目前所介绍的SELECT语句中我们对结果表中的列作出了选择但返回的是表
中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置只有满足条件的行才被包括到结果表中。这些条件由
断言predicate进行指定断言指出了关于某件事情的一种可能的事实。如果该断言对
于某个给定的行成立该行将被包括到结果表中否则该行被忽略。在SQL语句中断言通
常通过比较来表示。例如假如你需要查询所有姓为Jones的职员则可以使用以下SELECT
语句
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时SQL将每一行的LAST_NAME
列与“Jones”进行比较。如果某一职员的姓为“Jones”即断言成立该职员的信息将被包
括到结果表中见表6。
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较LAST_NAME = 'Jones'但是SQL
断言还可以包含其他几种类型的比较。其中最常用的为
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=
下面给出了不是基于等值比较的一个例子
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
这一查询将返回年薪高于$50,000.00的职员参见表7。
逻辑连接符
有时我们需要定义一条不止一种断言的SELECT语句。举例来说如果你仅仅想查看
Davy Jones的信息的话表6中的结果将是不正确的。为了进一步定义一个WHERE子句
用户可以使用逻辑连接符ANDOR和NOT。为了只得到职员Davy Jones的记录用户可
以输入如下语句
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整www.docin.com个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满
足条件时可以使用OR连接符
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston
办事处的职员以外的其他所有职员的信息时你可以进行如下的查询
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某
一职员所在部门的办事处在Boston括号内的表达式返回true但是NOT操作符将该值取
反所以该行将不被选中。
断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值可以用括号将
它们括起来
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用数学上标准的表达式求值的约定-圆括号内的表达式将最先进行求值其他表
达式将从左到右进行求值。
存储过程
--1.给表中字段添加描述信息
Create table T2 (id int , name char (20))
GO
EXEC sp_addextendedproperty 'MS_Description', 'Employee ID', 'user', dbo, 'table', T2,
'column', id
EXEC sp_updateextendedproperty 'MS_Description', 'this is a test', 'user', dbo, 'table', T2,
'column', id
--2.修改数据库名称
EXEC sp_renamedb 'old_db_name', 'new_db_name'
--3.修改数据表名称和字段名称
EXEC sp_rename 'old_table_name', 'new_table_name'--修改数据表名称
EXEC sp_rename 'table_name.[old_column_name]', 'new_column_name', 'COLUMN'--修改字段
名称
--4.给定存储过程名获取存储过程内容
exec sp_helptext sp_name
www.docin.com
相关推荐
Oracle 常用 SQL 语句大全 本文档总结了 Oracle 中常用的 SQL 语句,包括数据库的创建、删除、备份、表的创建、删除、修改、索引的创建、视图的创建等基本操作,以及一些高级查询运算符的使用。 一、数据库操作 ...
根据给定的文件信息,以下是对“常用 SQL 语句大全+50个常用sql语句总结”的详细解析,涵盖数据操作、数据定义、数据控制、事务控制以及程序化 SQL 等方面的重要知识点。 ### 数据操作 1. **SELECT**:用于从...
sql语句sql语句sql语句sql语句sql语句sql语句sql语句sql语句sql语句
本资料集包含了Oracle数据库中常用SQL语句的大全,注释完整,非常适合初学者和有经验的开发者参考使用。 1. **数据查询(SELECT语句)**: - `SELECT * FROM table_name;`:查询表table_name中的所有列。 - `...
net实例常用SQL语句大全, 例如:语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据...
标题中的“常用SQL语句大全,含常用高效SQL语句”指的是这是一份集合了多种常见且高效的SQL语言表达式的文档。描述中的“非常不错的文档。常用精妙SQL语句收集,含常用高效SQL语句”进一步强调了文档的价值,它包含...
以下是对标题“常用SQL语句大全-数据操作”中涉及的知识点的详细说明: 1. **SELECT**: SELECT语句是SQL中最基础也是最重要的部分,它用于从数据库中检索数据。你可以根据需求选择一个或多个列,并从一个或多个表...
本篇文章将详细解释标题和描述中提到的一些常用SQL语句及其功能。 一、数据操作 1. SELECT:用于从数据库表中检索数据行和列,是最常用的SQL语句。可以进行单表查询、多表联接查询、分组查询(GROUP BY)、排序查询...
根据提供的文件信息,本文将对其中提及的SQL知识点进行详细解释与说明,旨在为不同层次的学习者提供一个全面且易于理解的SQL语句指南。 ### 1. SELECT 语句 `SELECT` 语句是SQL中最常用的命令之一,主要用于从...
汇总:常用 SQl 语句大全。 语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 --数据...
常用SQL语句大全.txt
根据提供的文件信息,我们可以归纳出一系列重要的SQL语句及其应用场景,这些内容对于数据库管理与开发人员来说至关重要。接下来,我们将详细解析这些SQL语句,并解释它们的功能与使用场景。 ### SELECT 语句 **...
ORACLE 常用 SQL 语句大全 本文档总结了 ORACLE 中常用的 SQL 语句,包括创建数据库、删除数据库、备份数据库、创建表、删除表、增加列、删除列、添加主键、创建索引、创建视图等基本操作。同时,也涵盖了高级查询...
ORACLE常用SQL语句大全.doc
### SQL 语言入门篇——最常用 SQL 语句大全 SQL(Structured Query Language)作为一门专为关系型数据库设计的语言,被广泛应用于数据库管理和数据处理领域。本文将深入讲解一些常用的SQL语句,并通过示例来帮助...