SQL语句集锦
2009-03-19 10:31
141 查看
--语 句 功 能 [/b]--数据操作 [/b]SELECT[/b] --从数据库表中检索数据行和列 [/b]INSERT[/b] --向数据库表添加新数据行 [/b]DELETE[/b] --从数据库表中删除数据行 [/b]UPDATE[/b] --更新数据库表中的数据 [/b]--数据定义 [/b]CREATE[/b] TABLE[/b] --创建一个数据库表 [/b]DROP[/b] TABLE[/b] --从数据库中删除表 [/b]ALTER[/b] TABLE[/b] --修改数据库表结构 [/b]CREATE[/b] VIEW[/b] --创建一个视图 [/b]DROP[/b] VIEW[/b] --从数据库中删除视图 [/b]CREATE[/b] INDEX[/b] --为数据库表创建一个索引 [/b]DROP[/b] INDEX[/b] --从数据库中删除索引 [/b]CREATE[/b] PROCEDURE[/b] --创建一个存储过程 [/b]DROP[/b] PROCEDURE[/b] --从数据库中删除存储过程 [/b]CREATE[/b] TRIGGER[/b] --创建一个触发器 [/b]DROP[/b] TRIGGER[/b] --从数据库中删除触发器 [/b]CREATE[/b] SCHEMA[/b] --向数据库添加一个新模式 [/b]DROP[/b] SCHEMA[/b] --从数据库中删除一个模式 [/b]CREATE[/b] DOMAIN --创建一个数据值域 [/b]ALTER[/b] DOMAIN --改变域定义 [/b]DROP[/b] DOMAIN --从数据库中删除一个域 [/b]--数据控制 [/b]GRANT[/b] --授予用户访问权限 [/b]DENY[/b] --拒绝用户访问 [/b]REVOKE[/b] --解除用户访问权限 [/b]--事务控制 [/b]COMMIT[/b] --结束当前事务 [/b]ROLLBACK[/b] --中止当前事务 [/b]SET[/b] TRANSACTION[/b] --定义当前事务数据访问特征 [/b]--程序化SQL [/b]DECLARE[/b] --为查询设定游标 [/b]EXPLAN --为查询描述数据访问计划 [/b]OPEN[/b] --检索查询结果打开一个游标 [/b]FETCH[/b] --检索一行查询结果 [/b]CLOSE[/b] --关闭游标 [/b]PREPARE --为动态执行准备SQL 语句 [/b]EXECUTE[/b] --动态地执行SQL 语句 [/b]DESCRIBE --描述准备好的查询 [/b] ---局部变量 [/b]declare[/b] @id[/b] char[/b](10) --set @id = '10010001' [/b]select[/b] @id[/b] = '10010001'[/b] ---全局变量 [/b]---必须以@@开头 [/b] --IF ELSE [/b]declare[/b] @x[/b] int[/b] @y[/b] int[/b] @z[/b] int[/b] select[/b] @x[/b] = 1 @y[/b] = 2 @z[/b]=3 if[/b] @x[/b] > @y[/b] print[/b] 'x > y'[/b] --打印字符串'x > y' [/b]else[/b] if[/b] @y[/b] > @z[/b] print[/b] 'y > z'[/b] else[/b] print[/b] 'z > y'[/b] --CASE [/b]use[/b] pangu update[/b] employee set[/b] e_wage = case[/b] when[/b] job_level = ’1’ then[/b] e_wage*1.08 when[/b] job_level = ’2’ then[/b] e_wage*1.07 when[/b] job_level = ’3’ then[/b] e_wage*1.06 else[/b] e_wage*1.05 end[/b] --WHILE CONTINUE BREAK [/b]declare[/b] @x[/b] int[/b] @y[/b] int[/b] @c[/b] int[/b] select[/b] @x[/b] = 1 @y[/b]=1 while[/b] @x[/b] < 3 begin[/b] print[/b] @x[/b] --打印变量x 的值 [/b] while[/b] @y[/b] < 3 begin[/b] select[/b] @c[/b] = 100*@x[/b] + @y[/b] print[/b] @c[/b] --打印变量c 的值 [/b] select[/b] @y[/b] = @y[/b] + 1 end[/b] select[/b] @x[/b] = @x[/b] + 1 select[/b] @y[/b] = 1 end[/b] --WAITFOR [/b]--例 等待1 小时2 分零3 秒后才执行SELECT 语句 [/b]waitfor[/b] delay ’01:02:03’ select[/b] * from[/b] employee --例 等到晚上11 点零8 分后才执行SELECT 语句 [/b]waitfor[/b] time ’23:08:00’ select[/b] * from[/b] employee ***SELECT[/b]*** select[/b] *(列名) from[/b] table_name(表名) where[/b] column_name operator value ex:(宿主) select[/b] * from[/b] stock_information where[/b] stockid = str[/b](nid) stockname = 'str_name'[/b] stockname like[/b] '% find this %'[/b] stockname like[/b] '[a-zA-Z]%'[/b] --------- ([]指定值的范围) [/b] stockname like[/b] '[^F-M]%'[/b] --------- (^排除指定范围) [/b] --------- 只能在使用like关键字的where子句中使用通配符) [/b] or[/b] stockpath = 'stock_path'[/b] or[/b] stocknumber < 1000 and[/b] stockindex = 24 not[/b] stock*** = 'man'[/b] stocknumber between[/b] 20 and[/b] 100 stocknumber in[/b](10,20,30) order[/b] by[/b] stockid desc[/b](asc[/b]) --------- 排序,desc-降序,asc-升序 [/b] order[/b] by[/b] 1,2 --------- by列号 [/b] stockname = (select[/b] stockname from[/b] stock_information where[/b] stockid = 4) --------- 子查询 [/b] --------- 除非能确保内层select只返回一个行的值, [/b] --------- 否则应在外层where子句中用一个in限定符 [/b] select[/b] distinct[/b] column_name form table_name --------- distinct指定检索独有的列值,不重复 [/b] select[/b] stocknumber ,"stocknumber + 10" = stocknumber + 10 from[/b] table_name select[/b] stockname , "stocknumber" = count[/b](*) from[/b] table_name group[/b] by[/b] stockname --------- group by 将表按行分组,指定列中有相同的值 [/b] having[/b] count[/b](*) = 2 --------- having选定指定的组 [/b] select[/b] * from[/b] table1, table2 where[/b] table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示 [/b] table1.id =* table2.id -------- 右外部连接 [/b] select[/b] stockname from[/b] table1 union[/b] [all[/b]] ----- union合并查询结果集,all-保留重复行 [/b] select[/b] stockname from[/b] table2 ***insert[/b]*** insert[/b] into[/b] table_name (Stock_name,Stock_number) value ("xxx","xxxx") value (select[/b] Stockname , Stocknumber from[/b] Stock_table2)---value为select语句 [/b] ***update[/b]*** update[/b] table_name set[/b] Stockname = "xxx" [where[/b] Stockid = 3] Stockname = default[/b] Stockname = null[/b] Stocknumber = Stockname + 4 ***delete[/b]*** delete[/b] from[/b] table_name where[/b] Stockid = 3 truncate[/b] table_name ----------- 删除表中所有行,仍保持表的完整性 [/b] drop[/b] table[/b] table_name --------------- 完全删除表 [/b] ***alter[/b] table[/b]*** --- 修改数据库表结构 [/b] alter[/b] table[/b] database[/b].owner.table_name add[/b] column_name char[/b](2) null[/b] ..... sp_help table_name ---- 显示表已有特征 [/b] create[/b] table[/b] table_name (name char[/b](20), age smallint[/b], lname varchar[/b](30)) insert[/b] into[/b] table_name select[/b] ......... ----- 实现删除列的方法(创建新表) [/b] alter[/b] table[/b] table_name drop[/b] constraint[/b] Stockname_default ---- 删除Stockname的default约束 [/b] ***function[/b](/*常用函数*/[/b])*** ----统计函数---- [/b]AVG --求平均值 [/b]COUNT --统计数目 [/b]MAX --求最大值 [/b]MIN --求最小值 [/b]SUM --求和 [/b] --AVG [/b]use[/b] pangu select[/b] avg[/b](e_wage) as[/b] dept_avgWage from[/b] employee group[/b] by[/b] dept_id --MAX [/b]--求工资最高的员工姓名 [/b]use[/b] pangu select[/b] e_name from[/b] employee where[/b] e_wage = (select[/b] max[/b](e_wage) from[/b] employee) --STDEV() [/b]--STDEV()函数返回表达式中所有数据的标准差 [/b] --STDEVP() [/b]--STDEVP()函数返回总体标准差 [/b] --VAR() [/b]--VAR()函数返回表达式中所有值的统计变异数 [/b] --VARP() [/b]--VARP()函数返回总体变异数 [/b] ----算术函数---- [/b] /***三角函数***/[/b] SIN[/b](float_expression) --返回以弧度表示的角的正弦 [/b]COS[/b](float_expression) --返回以弧度表示的角的余弦 [/b]TAN[/b](float_expression) --返回以弧度表示的角的正切 [/b]COT[/b](float_expression) --返回以弧度表示的角的余切 [/b]/***反三角函数***/[/b] ASIN[/b](float_expression) --返回正弦是FLOAT 值的以弧度表示的角 [/b]ACOS[/b](float_expression) --返回余弦是FLOAT 值的以弧度表示的角 [/b]ATAN[/b](float_expression) --返回正切是FLOAT 值的以弧度表示的角 [/b]ATAN2[/b](float_expression1,float_expression2) --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角 [/b]DEGREES[/b](numeric_expression) --把弧度转换为角度返回与表达式相同的数据类型可为 [/b] --INTEGER/MONEY/REAL/FLOAT 类型 [/b]RADIANS[/b](numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为 [/b] --INTEGER/MONEY/REAL/FLOAT 类型 [/b]EXP[/b](float_expression) --返回表达式的指数值 [/b]LOG[/b](float_expression) --返回表达式的自然对数值 [/b]LOG10[/b](float_expression)--返回表达式的以10 为底的对数值 [/b]SQRT[/b](float_expression) --返回表达式的平方根 [/b]/***取近似值函数***/[/b] CEILING[/b](numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为 [/b] --INTEGER/MONEY/REAL/FLOAT 类型 [/b]FLOOR[/b](numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为 [/b] --INTEGER/MONEY/REAL/FLOAT 类型 [/b]ROUND[/b](numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据 [/b] --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 [/b]ABS[/b](numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为 [/b] --INTEGER/MONEY/REAL/FLOAT 类型 [/b]SIGN[/b](numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型 [/b] --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型 [/b]PI[/b]() --返回值为π 即3.1415926535897936 [/b]RAND[/b]([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数 [/b] ----字符串函数---- [/b]ASCII[/b]() --函数返回字符表达式最左端字符的ASCII 码值 [/b]CHAR[/b]() --函数用于将ASCII 码转换为字符 [/b] --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值 [/b]LOWER[/b]() --函数把字符串全部转换为小写 [/b]UPPER[/b]() --函数把字符串全部转换为大写 [/b]STR[/b]() --函数把数值型数据转换为字符型数据 [/b]LTRIM[/b]() --函数把字符串头部的空格去掉 [/b]RTRIM[/b]() --函数把字符串尾部的空格去掉 [/b]LEFT[/b](),RIGHT[/b](),SUBSTRING[/b]() --函数返回部分字符串 [/b]CHARINDEX[/b](),PATINDEX[/b]() --函数返回字符串中某个指定的子串出现的开始位置 [/b]SOUNDEX[/b]() --函数返回一个四位字符码 [/b] --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值 [/b]DIFFERENCE[/b]() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异 [/b] --0 两个SOUNDEX 函数返回值的第一个字符不同 [/b] --1 两个SOUNDEX 函数返回值的第一个字符相同 [/b] --2 两个SOUNDEX 函数返回值的第一二个字符相同 [/b] --3 两个SOUNDEX 函数返回值的第一二三个字符相同 [/b] --4 两个SOUNDEX 函数返回值完全相同 [/b] QUOTENAME[/b]() --函数返回被特定字符括起来的字符串 [/b]/*select quotename('abc', '{') quotename('abc') 运行结果如下 ----------------------------------{ {abc} [abc]*/[/b] REPLICATE[/b]() --函数返回一个重复character_expression 指定次数的字符串 [/b]/*select replicate('abc', 3) replicate( 'abc', -2) 运行结果如下 ----------- ----------- abcabcabc NULL*/[/b] REVERSE[/b]() --函数将指定的字符串的字符排列顺序颠倒 [/b]REPLACE[/b]() --函数返回被替换了指定子串的字符串 [/b]/*select replace('abc123g', '123', 'def') 运行结果如下 ----------- ----------- abcdefg*/[/b] SPACE[/b]() --函数返回一个有指定长度的空白字符串 [/b]STUFF[/b]() --函数用另一子串替换字符串指定位置长度的子串 [/b] ----数据类型转换函数---- [/b]CAST[/b]() 函数语法如下 CAST[/b]() (<expression> AS[/b] <data_ type>[ length ]) CONVERT[/b]() 函数语法如下 CONVERT[/b]() (<data_ type>[ length ], <expression> [, style]) select[/b] cast[/b](100+99 as[/b] char[/b]) convert[/b](varchar[/b](12), getdate[/b]()) 运行结果如下 ------------------------------ ------------ [/b]199 Jan 15 2000 ----日期函数---- [/b]DAY[/b]() --函数返回date_expression 中的日期值 [/b]MONTH[/b]() --函数返回date_expression 中的月份值 [/b]YEAR[/b]() --函数返回date_expression 中的年份值 [/b]DATEADD[/b](<datepart> ,<number> ,<date>) --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期 [/b]DATEDIFF[/b](<datepart> ,<number> ,<date>) --函数返回两个指定日期在datepart 方面的不同之处 [/b]DATENAME[/b](<datepart> , <date>) --函数以字符串的形式返回日期的指定部分 [/b]DATEPART[/b](<datepart> , <date>) --函数以整数值的形式返回日期的指定部分 [/b]GETDATE[/b]() --函数以DATETIME 的缺省格式返回系统当前的日期和时间 [/b] ----系统函数---- [/b]APP_NAME() --函数返回当前执行的应用程序的名称 [/b]COALESCE[/b]() --函数返回众多表达式中第一个非NULL 表达式的值 [/b]COL_LENGTH(<'table_name'[/b]>, <'column_name'[/b]>) --函数返回表中指定字段的长度值 [/b]COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名 [/b]DATALENGTH[/b]() --函数返回数据表达式的数据的实际长度 [/b]DB_ID(['database_name'[/b]]) --函数返回数据库的编号 [/b]DB_NAME(database_id) --函数返回数据库的名称 [/b]HOST_ID() --函数返回服务器端计算机的名称 [/b]HOST_NAME() --函数返回服务器端计算机的名称 [/b]IDENTITY[/b](<data_type>[, seed increment]) [AS[/b] column_name]) --IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中 [/b]/*select identity(int, 1, 1) as column_name into newtable from oldtable*/[/b] ISDATE[/b]() --函数判断所给定的表达式是否为合理日期 [/b]ISNULL[/b](<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换 [/b]ISNUMERIC[/b]() --函数判断所给定的表达式是否为合理的数值 [/b]NEWID[/b]() --函数返回一个UNIQUEIDENTIFIER 类型的数值 [/b]NULLIF[/b](<expression1>, <expression2>) --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值 [/b]精妙SQL语句 说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select[/b] * into[/b] b from[/b] a where[/b] 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert[/b] into[/b] b(a, b, c) select[/b] d,e,f from[/b] b; 说明:显示文章、提交人和最后回复时间 SQL: select[/b] a.title,a.username,b.adddate from[/b] table[/b] a,(select[/b] max[/b](adddate) adddate from[/b] table[/b] where[/b] table[/b].title=a.title) b 说明:外连接查询(表名1:a 表名2:b) SQL: select[/b] a.a, a.b, a.c, b.c, b.d, b.f from[/b] a LEFT[/b] OUT JOIN[/b] b ON[/b] a.a = b.c 说明:日程安排提前五分钟提醒 SQL: select[/b] * from[/b] 日程安排 where[/b] datediff[/b]('minute'[/b],f开始时间,getdate[/b]())>5 说明:两张关联表,删除主表中已经在副表中没有的信息 SQL: delete[/b] from[/b] info where[/b] not[/b] exists[/b] ( select[/b] * from[/b] infobz where[/b] info.infid=infobz.infid ) 说明:-- [/b]SQL: SELECT[/b] A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM[/b] TABLE1, (SELECT[/b] X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE FROM[/b] (SELECT[/b] NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND FROM[/b] TABLE2 WHERE[/b] TO_CHAR[/b](UPD_DATE,'YYYY/MM'[/b]) = TO_CHAR[/b](SYSDATE, 'YYYY/MM'[/b])) X, (SELECT[/b] NUM, UPD_DATE, STOCK_ONHAND FROM[/b] TABLE2 WHERE[/b] TO_CHAR[/b](UPD_DATE,'YYYY/MM'[/b]) = TO_CHAR[/b](TO_DATE(TO_CHAR[/b](SYSDATE, 'YYYY/MM'[/b]) || '/01'[/b],'YYYY/MM/DD'[/b]) - 1, 'YYYY/MM'[/b]) ) Y, WHERE[/b] X.NUM = Y.NUM (+) AND[/b] X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B WHERE[/b] A.NUM = B.NUM 说明:-- [/b]SQL: select[/b] * from[/b] studentinfo where[/b] not[/b] exists[/b](select[/b] * from[/b] student where[/b] studentinfo.id=student.id) and[/b] 系名称='"&strdepartmentname&"'[/b] and[/b] 专业名称='"&strprofessionname&"'[/b] order[/b] by[/b] 性别,生源地,高考总成绩 说明: 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源) SQL: SELECT[/b] a.userper, a.tel, a.standfee, TO_CHAR[/b](a.telfeedate, 'yyyy'[/b]) AS[/b] telyear, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '01'[/b], a.factration)) AS[/b] JAN, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '02'[/b], a.factration)) AS[/b] FRI, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '03'[/b], a.factration)) AS[/b] MAR, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '04'[/b], a.factration)) AS[/b] APR, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '05'[/b], a.factration)) AS[/b] MAY, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '06'[/b], a.factration)) AS[/b] JUE, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '07'[/b], a.factration)) AS[/b] JUL, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '08'[/b], a.factration)) AS[/b] AGU, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '09'[/b], a.factration)) AS[/b] SEP, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '10'[/b], a.factration)) AS[/b] OCT, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '11'[/b], a.factration)) AS[/b] NOV, SUM[/b](decode(TO_CHAR[/b](a.telfeedate, 'mm'[/b]), '12'[/b], a.factration)) AS[/b] DEC FROM[/b] (SELECT[/b] a.userper, a.tel, a.standfee, b.telfeedate, b.factration FROM[/b] TELFEESTAND a, TELFEE b WHERE[/b] a.tel = b.telfax) a GROUP[/b] BY[/b] a.userper, a.tel, a.standfee, TO_CHAR[/b](a.telfeedate, 'yyyy'[/b]) 说明:四表联查问题: SQL: select[/b] * from[/b] a left[/b] inner[/b] join[/b] b on[/b] a.a=b.b right[/b] inner[/b] join[/b] c on[/b] a.a=c.c inner[/b] join[/b] d on[/b] a.a=d.d where[/b] ..... 说明:得到表中最小的未使用的ID号 SQL: SELECT[/b] (CASE[/b] WHEN[/b] EXISTS[/b](SELECT[/b] * FROM[/b] Handle b WHERE[/b] b.HandleID = 1) THEN[/b] MIN[/b](HandleID) + 1 ELSE[/b] 1 END[/b]) as[/b] HandleID FROM[/b] Handle WHERE[/b] NOT[/b] HandleID IN[/b] (SELECT[/b] a.HandleID - 1 FROM[/b] Handle a) : 我在ms sql中建了一个表,可由于种种原因有些记录重复了 : 记录完全的一模一样。 : 现在我想把重复的都删掉,只保留重复记录中的第一条。 : 我在database好象看到有介绍oracle的, select[/b] distinct[/b] * into[/b] #table_name from[/b] table_name delete[/b] from[/b] table_name select[/b] * into[/b] table_name from[/b] #table_name drop[/b] table[/b] #table_name 与此相关的是“select[/b] into[/b]”选项,可以在数据库属性 对话框中,勾起来此项,或者在Query Analyzer中执行 execute[/b] sp_dboption 'db_name'[/b],'select into'[/b],'true'[/b] 开启。默认值是关闭的。