注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

浩瀚星云

上善若水 厚德载物<学习版>

 
 
 

日志

 
 

基本SQL语句用法  

2008-07-07 20:14:44|  分类: VF程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1. 数据定义

在 SQL 语言里包含一套用于数据定义的命令。

1.1 SQL 里的基本数据类型

INTEGER:有符号全长二进制整数(31位精度)。

SMALLINT:有符号半长二进制整数(15位精度)。

DECIMAL (p[,q]): 有符号的封装了的十进制小数,最多有 p 位数,并假设有 q 位在小数点右边。 如果省略 q ,则认为是 0。

FLOAT:有符号双字浮点数。

CHAR(n): 长度为 n 的定长字符串。

VARCHAR(n): 最大长度为 n 的变长字符串。

1.2 创建表

数据定义的最基本的命令是创建一个新关系(新表)的命令CREATE TABLE命令,语法如下:

CREATE TABLE table_name

     (name_of_attr_1 type_of_attr_1

      [, name_of_attr_2 type_of_attr_2

      [, ...]]);

      

Example 1-1 创建表

要创建 供应商和部件数据库里的表,要使用下面的 SQL 语句:

CREATE TABLE SUPPLIER

     (SNO    INTEGER,

      SNAME VARCHAR(20),

      CITY   VARCHAR(20));

     

CREATE TABLE PART

     (PNO    INTEGER,

      PNAME VARCHAR(20),

      PRICE DECIMAL(4 , 2));

     

CREATE TABLE SELLS

     (SNO INTEGER,

      PNO INTEGER);

1.3 创建索引

索引用于加速对关系的访问。如果关系 R 有一个建立在属性 A 上的索引,那么我们检索满足 t(A) = a 的所有元组 t 用的时间和这样的元组数 t 成比例,而不是与 R 的大小成比例。

在 SQL 里创建一个索引, 使用 CREATE INDEX 命令。语法是:

CREATE INDEX index_name

     ON table_name ( name_of_attribute );

Example 1-12. 创建索引

要在关系 SUPPLIER 的属性 SNAME 上创建一个名为 I 的索引, 我们使用下面语法:

CREATE INDEX I ON SUPPLIER (SNAME);

      

所创建的索引是自动维护的,也就是说,当向关系 SUPPLIER 插入新的记录时, 索引 I 相应做调节。请注意有索引存在时, 用户能感觉到的唯一的变化就是速度的提升。

1.4 创建视图

一个视图可以看作一个虚拟表, 也就是说,数据库里的一个 物理上不存在的,但是用户看起来却存在的表。 与之相比,当我们谈到一个 基本表时, 则是在物理存储中的确物理地存放着表中每一行的内容。

视图没有它们自身的,物理上分开的,可区分的存储区。 实际上,系统把视图的定义(也就是说,为视图物化的应如何访问物 理上存储在基本表中内容的规则)存放在系统表里的某个地方(参阅 系统表)。 关于实现视图的不同技巧,请参考 SIM98.

在 SQL 里使用 CREATE VIEW 命令定义视图。语法是:

CREATE VIEW view_name

     AS select_stmt

      

这里 select_stmt 是一个与定义在 Select(选择) 里一样的有效选择语句。 请注意在视图创建时并不执行 select_stmt。 它只是存储在 系统表里,当对视图进行查询时将执行。

假设给出下面的视图定义(我们再次使用来自 供应商和部件数据库里的表):

CREATE VIEW London_Suppliers

     AS SELECT S.SNAME, P.PNAME

         FROM SUPPLIER S, PART P, SELLS SE

         WHERE S.SNO = SE.SNO AND

               P.PNO = SE.PNO AND

               S.CITY = 'London';

      

现在我们可以把这个虚拟的关系 London_Suppliers当作是另外一个基本表:

SELECT * FROM London_Suppliers

     WHERE PNAME = 'Screw';

      

将返回下面的表:

SNAME | PNAME

-------+-------

Smith | Screw                 

      

要计算这个结果,数据库系统必须先对基本表SUPPLIER,SELLS 和 PART 先进行一次 隐藏的访问。 它是通过对这些基本表运行该视图定义里面给出的查询实现隐藏访问的。 然后,余下的附加条件(在查询里给出的对视图的条件)就可以应用上来, 最后获取结果表。

1.5 删除表,删除索引,删除视图

要删除表(包括该表存储的所有记录),使用 DROP TABLE 命令:

DROP TABLE table_name;--------------- 完全删除表

truncate table_name ----------- 删除表中所有行,仍保持表的完整性

       

要删除 SUPPLIER 表,使用下面语句:

DROP TABLE SUPPLIER;

      

DROP INDEX 命令用于删除一个索引:

DROP INDEX index_name;

      

最后用 DROP VIEW 删除一个给出的视图:

DROP VIEW view_name;

      

2 数据操作

2.1 插入数据

一旦表创建完成,就可以用命令 INSERT INTO 向里面填充元组。语法是:

INSERT INTO table_name (name_of_attr_1

     [, name_of_attr_2 [,...]])

     VALUES (val_attr_1 [, val_attr_2 [, ...]]);

      

要向关系 SUPPLIER 中插入第一条元组(来自 供应商和部件数据库),我们使用下面语句:

INSERT INTO SUPPLIER (SNO, SNAME, CITY)

     VALUES (1, 'Smith', 'London');

      

要向关系 SELLS 插入第一条元组,我们用:

INSERT INTO SELLS (SNO, PNO)

     VALUES (1, 1);

---value为select语句,如下结构:

  insert into table_name (Stock_name,Stock_number)

  value (select Stockname , Stocknumber from

  Stock_table2);

      

2.2 Update(更新)

要修改元组中的一个或者多个属性的值,使用 UPDATE 命令。语法是:

UPDATE table_name

     SET name_of_attr_1 = value_1

         [, ... [, name_of_attr_k = value_k]]

     WHERE condition;

      

要修改表关系 PART 中部件 'Screw' 的属性 PRICE 的值,我们用:

UPDATE PART

     SET PRICE = 15

     WHERE PNAME = 'Screw';

      

记录名为 'Screw' 的属性 PRICE 的新值现在是 15。

  ***update***

  update table_name set Stockname = "xxx" [where Stockid = 3]

  Stockname = default

  Stockname = null

  Stocknumber = Stockname + 4

2.3 Delete(删除)

要从一个表中删除一条记录,使用 DELETE FROM 命令。语法是:

DELETE FROM table_name

     WHERE condition;

      

要删除 SUPPLIER 表中名为 'Smith' 的供应商,使用下面的语句:

DELETE FROM SUPPLIER

     WHERE SNAME = 'Smith';

3. 数据查询

SQL中最为复杂的部分便是数据查询了,我们将它分为简单查询,连接查询,函数查询,嵌套查询。

下面我们将从简单查询开始,由浅入深向大家讲解SQL中的数据查询。

3.1 简单查询

单表查询,基本用法:

select *(列名) from table_name(表名) where column_name operator value;

ex:

  select * from stock_information where stockid = str(nid);

-------使用关键字:

--------- 只能在使用like关键字的where子句中使用通配符%等;

  select * from stock_information where stockname like '% find this %';

  select * from stock_information where stockname stockname like '[a-zA-Z]%'; --------- ([]指定值的范围)

  select * from stock_information where stockname stockname like '[^F-M]%'   ; --------- (^排除指定范围)

  select * from stock_information where stockid = str(nid) or stockpath = 'stock_path';

  select * from stock_information where stockid = str(nid) and stockindex = 24;

  select * from stock_information where stockid = str(nid) not stock*** = 'man';

  select * from stock_information where stockid = str(nid) stocknumber between 20 and 100;

  select * from stock_information where stocknumber in(10,20,30)

  select * from stock_information order by stockid desc(asc) --------- 排序,desc-降序,asc-升序

  select * from stock_information order by 1,2 --------- by列号

3.2 连接查询

多表查询,基本语法:

select *(列名) from table1,table2 [,table3,...] where column_name operator value;

  select * from table1, table2 where table1.id *= table2.id ;

     -------- 左外部连接,table1中有的而table2中没有得以null表示

  select * from table1, table2 where table1.id =* table2.id -------- 右外部连接

3.3 函数查询

  ***function(/*常用函数*/)***

  ----统计函数----

  AVG --求平均值

  COUNT --统计数目

  MAX --求最大值

  MIN --求最小值

  SUM --求和

  -------------------------AVG

  use pangu

  select avg(e_wage) as dept_avgWage from employee group by dept_id;

  -------------------------MAX

  --求工资最高的员工姓名

  use pangu

  select e_name from employee where e_wage =(select max(e_wage) from employee);

3.4 嵌套查询

SQL: select * into b from a where 1<>1

说明:拷贝表(拷贝数据,源表名:a 目标表名:b)

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

说明:显示文章、提交人和最后回复时间

SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

说明:外连接查询(表名1:a 表名2:b)

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

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

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

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

SQL:

delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

说明:--

SQL:

SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1,(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, (SELECT NUM, UPD_DATE, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, WHERE X.NUM = Y.NUM (+)AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B WHERE A.NUM = B.NUM

说明:--

SQL:

select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩

说明:

从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)

SQL:

SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration FROM TELFEESTAND a, TELFEE b WHERE a.tel = b.telfax) a GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

说明:四表联查问题:

SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

说明:得到表中最小的未使用的ID号

SQL:

SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)  

  评论这张
 
阅读(447)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017