结构化查询语言(SQL)

SQL分类:

DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)                  重点掌握

DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)                重点掌握

DCL—数据控制语言(GRANT,DENY,REVOKE)                           了解(一阅而过)

注:GRANT命令授予用户或角色的权限集合。

DENY命令显式地限制一个权限集合。

REVOKE命令用于撤消一个对象上的权限集合。

1、说明:创建数据库

CREATE DATABASE dbname

2、说明:删除数据库

Drop Database dbname

3、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

4、说明:删除新表drop table tabname

5、说明:增加一个列

Alter table tabname add column col type

6、说明:添加主键: Alter table tabname add primary key(col)

说明:删除主键: Alter table tabname drop primary key(col)

7、说明:创建索引:create [unique] index idxname on tabname(col….)

删除索引:drop index idxname注:索引是不可更改的,想更改必须删除重新建。

8、说明:创建视图:

create view viewname as select statement

删除视图:drop view viewname

9、说明:几个简单的基本的sql语句

选择:select * from table1 where 范围

插入:insert into table1(field1,field2) values(value1,value2)

删除:delete from table1 where 范围

更新:update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ’%value1%’

排序:select * from table1 order by field1,field2 [desc]

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1

10、说明:使用外连接

A、left outer join:

左外连接(左连接):结果集包括连接表的匹配行,也包括左连接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join:

右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:full outer join:

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

其次,大家来看一些不错的sql语句

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

法一:select * into b from a where 1<>1
法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件

例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、说明:子查询(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 数值1 and 数值2

8、说明:in 的使用方法

select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

9、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

10、说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff('minute',开始时间,getdate())>5

11、说明:前10条记录

select top 10 * form table1 where 范围

12、说明:随机取出10条数据
select top 10 * from tablename order by newid()

13、说明:列出数据库里所有的表名
select name from sysobjects where type='U'

14、说明:初始化表table1

TRUNCATE TABLE table1

15、说明:选择从10到15的记录

select top 5 * from (select top 15 * from table order by id desc) table_别名 order by id asc 

 

 

 

在前面

本节主要讲述一些基本的,常用的SQL语句,而非数据库方面的基本知识。数据库方面的知识留待以后再讲,现在就我们平常常用的一些SQL语句展开论述。

本节会涉及到SQL的基本句法,SQL的执行顺序,SQL之间的组合,动态SQL语句四个方面。这四个方面之间没有前后顺序之分,是相辅相成,其内在还是有很多联系的。

一. 四种基本的SQL语句

1. 查询

select * from table

2. 更新

update table set field=value

3. 插入

insert [into] table (field) values(value)

4. 删除

delete [from] table

二.语句的执行顺序

1.语法分析

分析语句中语法是否符合规范,衡量语句中各表达式的意义。

2.语义分析

检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。

3.选择优化器

不同的数据库有不同的算法(这个涉及到数据结构),数据库会根据自己的理解(数据库本身)为 SQL语句选择不同的优化器,不同的优化器会选择不同的“执行计划”

4.运行“执行计划”

根据“执行计划”执行SQL语句。

以上所述是数据执行时的大体路线。

5.select 语句的执行顺序

借用ItZik Ben-Gan、Lubor Kollar、Dejan Sarka所著的《Sql Server 2005 技术内幕:T-SQL查询》的一段话足以说明:

(8) select (9) distinct (11) <top_specification > <select_list>

(1)from<lef t_table>

(3) <join_type> join <right_table>

(2) on <join _condition>

(4) where <where_condition>

(5)group by <group_by_list>

(6) with {cube|rollup}

(7)having(having_condition)

(10) order by <order_by_condition>

从这个顺序可以看出,所有的查询语句都是从from开始执行的。在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的基础。

第一步:from

首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表vt1 .

第二步:on

接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2 .

第三步:join

如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3.

第四步:多表

如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3.

第五步:where

应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,对于包含outer join子句的查询,就有一个让人感到困惑的问题,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步outer join中还可以把移除的行再次添加回来,而where的移除的最终的。

第六步:group by

分组,生成虚拟表 vt4

第七步:having

         对vt4应用having筛选器,生成虚拟表 vt5

第八步:select

处理select 列表,生成虚拟表vt6

第九步:distinct

将vt6 中重复的行去掉,生成虚拟表vt7

第十步:order   by

将vt7中的行按order by 子句中的列列表排序,生成一个游标vc8

第十一步: top

从vc8的开始处选择指定数量或比例的行,生成虚拟表vt9,并返回给调用者

三. SQL语句扩展

1.select

1.1 选择性插入语句
1.1.1 Insert into  table1 (field1 )  Select field2 from table2

要求table1必须存在。

1.1.2 select field1 into table1 from table2

   要求table1不存在,在运行时会自动创建表名为table1,字段名为field1的一个表。

1.2打开其它数据源

/* OracleSvr为链接服务器名 ,本示例假定已经创建了一个名为 ORCLDB 的 Oracle 数据库别名。*/

EXEC sp_addlinkedserver 'OracleSvr',  --链接服务器名OracleSvr,sysname类型

   'MSDAORA', --provider_name数据源提供程序,此处为oracle

   'ORCLDB' --数据源名称

GO

Select * from OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')

如果有多个sql server实例:

SELECT *FROM  [servername\instancename.]pubs.dbo.authors.

注意:一个对象的完整名称包括四个标识符:服务器名称、数据库名称、所有者名称和对象名称。其格式如下:

[ [ [ server. ] [ database ] .] [ owner_name ] .] object_name

中间的名称可以省略,但是.不可以省略。如:server…object_name

2.update

2.1多表更新

Update table1 set  table1.field 1=table2.field2  from

table1,table2 /*猜测下连接方式全联接 FULL [OUTER] JOIN */

where  table1.field3= table2 .filed3

知识:SQL Server的update语句中from后可跟多个表,Oracle则不支持该用法

Oracle 中:Update  table1  set  table1.field1=

(select table2.field2 from table2 where .field3= table2 .filed3)

3.insert

3.1 插入语句的规范问题

在sql server 2000,sql server 2005中

标准语句:insert into  table(field)  values (value)

提示:在access中不正确,原因sql语句不规范,因此在书写sql语句的过程中一定要按正规的语法来写。

4.delete

4.1标准删除

标准语句:delete from table where condition

提示:同insert

4.2其它删除
4.2.1  truncate

语法:truncate table  table_name

删除表中所有行,不记录单个行删除操作,不记录日志,,所有速度比Delete快。

4.2.2  drop

语句: Drop table table_name

删除表及相关,有fk约束的不能删,先去年fk;系统表不能使用。

5.order by

功能:排序

技巧:order by newid() 随机排序

四. 动态SQL语句

4.1基本原则

4.1.1预编译问题

在EXECUTE执行之前,数据库不会编译 EXECUTE 语句内的语句,动态SQL语句就是放到存储过程中,它也不会预先编译。

4.1.2什么时候使用动态SQL语句

字段名,表名,数据库名作为变量时,必须用动态SQl语句

4.2.exec[ute]

4.2.1语法

exec (‘select * from table_name where name=’’’+@name+’’’’) --括号不能少

4.2.2传递参数

           --假设存储过程test_sp中需要一个参数:类型nvarchar(50) 名称 @parm

Declare @parms nvarchar(50)

Set @parms=’测试变量’

Exec test_sp  [@parm=]@parms –方括号内的可以省略

如果是批处理中的第一句,则可以省略Exec

4.2.3输出参数

declare @num int, @field int,

      @sqls nvarchar(4000)

Set @field=1

set @sqls='select @a=count(*) from table_name  where field=@field'

exec sp_executesql @sqls,N'@a int output,@field int',@num output ,@field

select @num

4.3.sp_executesql

语法:exec[ute] sp_executesql N’select * from table_name where field=@field’,N’@field int’,@field=1

使用sp_exexutesql比使用exec更有效率.

结束语

以上是SQL中常用的语句,及其执行时的顺序。不管是SQL Server系列,mysql,access,Oracle系列这些都基本相同。如果要在数据库方面做高深的研究,则多看一下其自带的帮助,多练习,多看一些数据库原理方面的书。

posted @ 2013-04-11 23:10  ~风~  阅读(357)  评论(0编辑  收藏  举报