越全越好

解决方案 »

  1.   

    刚写了个没有from的select语句,可以玩玩insert tab (a,b)
    select a=4,b=1001 where not exists (select 1 from tab where a=4)
      

  2.   

    sql面试题(xiaoku)http://topic.csdn.net/u/20081020/15/1abf54d0-f401-42ab-a75e-df90027ceba0.html
      

  3.   

    一个题目涉及到的50个Sql语句Student(S#,Sname,Sage,Ssex) 学生表 
    Course(C#,Cname,T#) 课程表 
    SC(S#,C#,score) 成绩表 
    Teacher(T#,Tname) 教师表 问题: 
    1、查询“001”课程比“002”课程成绩高的所有学生的学号; 
      select a.S# from (select s#,score from SC where C#='001') a,(select s#,score 
      from SC where C#='002') b 
      where a.score>b.score and a.s#=b.s#; 
    2、查询平均成绩大于60分的同学的学号和平均成绩; 
        select S#,avg(score) 
        from sc 
        group by S# having avg(score) >60; 
    3、查询所有同学的学号、姓名、选课数、总成绩; 
      select Student.S#,Student.Sname,count(SC.C#),sum(score) 
      from Student left Outer join SC on Student.S#=SC.S# 
      group by Student.S#,Sname 
    4、查询姓“李”的老师的个数; 
      select count(distinct(Tname)) 
      from Teacher 
      where Tname like '李%'; 
    5、查询没学过“叶平”老师课的同学的学号、姓名; 
        select Student.S#,Student.Sname 
        from Student  
        where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平'); 
    6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; 
      select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002'); 
    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; 
      select S#,Sname 
      from Student 
      where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='叶平')); 
    8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; 
      Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 
      from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score; 
    9、查询所有课程成绩小于60分的同学的学号、姓名; 
      select S#,Sname 
      from Student 
      where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); 
    10、查询没有学全所有课的同学的学号、姓名; 
        select Student.S#,Student.Sname 
        from Student,SC 
        where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名; 
        select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'; 
    12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; 
        select distinct SC.S#,Sname 
        from Student,SC 
        where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 
    13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; 
        update SC set score=(select avg(SC_2.score) 
        from SC SC_2 
        where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平'); 
    14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名; 
        select S# from SC where C# in (select C# from SC where S#='1002') 
        group by S# having count(*)=(select count(*) from SC where S#='1002'); 
    15、删除学习“叶平”老师课的SC表记录; 
        Delect SC 
        from course ,Teacher  
        where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平'; 
    16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、 
        号课的平均成绩; 
        Insert SC select S#,'002',(Select avg(score) 
        from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002'); 
    17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分 
        SELECT S# as 学生ID 
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库 
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理 
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语 
            ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩 
        FROM SC AS t 
        GROUP BY S# 
        ORDER BY avg(t.score)  
    18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 
        SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分 
        FROM SC L ,SC AS R 
        WHERE L.C# = R.C# and 
            L.score = (SELECT MAX(IL.score) 
                          FROM SC AS IL,Student AS IM 
                          WHERE L.C# = IL.C# and IM.S#=IL.S# 
                          GROUP BY IL.C#) 
            AND 
            R.Score = (SELECT MIN(IR.score) 
                          FROM SC AS IR 
                          WHERE R.C# = IR.C# 
                      GROUP BY IR.C# 
                        ); 
    19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 
        SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩 
            ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数 
        FROM SC T,Course 
        where t.C#=course.C# 
        GROUP BY t.C# 
        ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC 
    20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004) 
        SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分 
            ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数 
            ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分 
            ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数 
            ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分 
            ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数 
            ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分 
            ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数 
      FROM SC 
      

  4.   

    21、查询不同老师所教不同课程平均分从高到低显示 
      SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩 
        FROM SC AS T,Course AS C ,Teacher AS Z 
        where T.C#=C.C# and C.T#=Z.T# 
      GROUP BY C.C# 
      ORDER BY AVG(Score) DESC 
    22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004) 
        [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩 
        SELECT  DISTINCT top 3 
          SC.S# As 学生学号, 
            Student.Sname AS 学生姓名 , 
          T1.score AS 企业管理, 
          T2.score AS 马克思, 
          T3.score AS UML, 
          T4.score AS 数据库, 
          ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分 
          FROM Student,SC  LEFT JOIN SC AS T1 
                          ON SC.S# = T1.S# AND T1.C# = '001' 
                LEFT JOIN SC AS T2 
                          ON SC.S# = T2.S# AND T2.C# = '002' 
                LEFT JOIN SC AS T3 
                          ON SC.S# = T3.S# AND T3.C# = '003' 
                LEFT JOIN SC AS T4 
                          ON SC.S# = T4.S# AND T4.C# = '004' 
          WHERE student.S#=SC.S# and 
          ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) 
          NOT IN 
          (SELECT 
                DISTINCT 
                TOP 15 WITH TIES 
                ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) 
          FROM sc 
                LEFT JOIN sc AS T1 
                          ON sc.S# = T1.S# AND T1.C# = 'k1' 
                LEFT JOIN sc AS T2 
                          ON sc.S# = T2.S# AND T2.C# = 'k2' 
                LEFT JOIN sc AS T3 
                          ON sc.S# = T3.S# AND T3.C# = 'k3' 
                LEFT JOIN sc AS T4 
                          ON sc.S# = T4.S# AND T4.C# = 'k4' 
          ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC); 23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60] 
        SELECT SC.C# as 课程ID, Cname as 课程名称 
            ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] 
            ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] 
            ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] 
            ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] 
        FROM SC,Course 
        where SC.C#=Course.C# 
        GROUP BY SC.C#,Cname; 24、查询学生平均成绩及其名次 
          SELECT 1+(SELECT COUNT( distinct 平均成绩) 
                  FROM (SELECT S#,AVG(score) AS 平均成绩 
                          FROM SC 
                      GROUP BY S# 
                      ) AS T1 
                WHERE 平均成绩 > T2.平均成绩) as 名次, 
          S# as 学生学号,平均成绩 
        FROM (SELECT S#,AVG(score) 平均成绩 
                FROM SC 
            GROUP BY S# 
            ) AS T2 
        ORDER BY 平均成绩 desc; 
      
    25、查询各科成绩前三名的记录:(不考虑成绩并列情况) 
          SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数 
          FROM SC t1 
          WHERE score IN (SELECT TOP 3 score 
                  FROM SC 
                  WHERE t1.C#= C# 
                ORDER BY score DESC 
                  ) 
          ORDER BY t1.C#; 
    26、查询每门课程被选修的学生数 
      select c#,count(S#) from sc group by C#; 
    27、查询出只选修了一门课程的全部学生的学号和姓名 
      select SC.S#,Student.Sname,count(C#) AS 选课数 
      from SC ,Student 
      where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1; 
    28、查询男生、女生人数 
        Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男'; 
        Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女'; 
    29、查询姓“张”的学生名单 
        SELECT Sname FROM Student WHERE Sname like '张%'; 
    30、查询同名同性学生名单,并统计同名人数 
      select Sname,count(*) from Student group by Sname having  count(*)>1;; 
    31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime) 
        select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age 
        from student 
        where  CONVERT(char(11),DATEPART(year,Sage))='1981'; 
    32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列 
        Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ; 
    33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩 
        select Sname,SC.S# ,avg(score) 
        from Student,SC 
        where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85; 
    34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数 
        Select Sname,isnull(score,0) 
        from Student,SC,Course 
        where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='数据库'and score <60; 
    35、查询所有学生的选课情况; 
        SELECT SC.S#,SC.C#,Sname,Cname 
        FROM SC,Student,Course 
        where SC.S#=Student.S# and SC.C#=Course.C# ; 
    36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数; 
        SELECT  distinct student.S#,student.Sname,SC.C#,SC.score 
        FROM student,Sc 
        WHERE SC.score>=70 AND SC.S#=student.S#; 
    37、查询不及格的课程,并按课程号从大到小排列 
        select c# from sc where scor e <60 order by C# ; 
    38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; 
        select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003'; 
    39、求选了课程的学生人数 
        select count(*) from sc; 
    40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩 
        select Student.Sname,score 
        from Student,SC,Course C,Teacher 
        where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# ); 
    41、查询各个课程及相应的选修人数 
        select count(*) from sc group by C#; 
    42、查询不同课程成绩相同的学生的学号、课程号、学生成绩 
      select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ; 
    43、查询每门功成绩最好的前两名 
        SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数 
          FROM SC t1 
          WHERE score IN (SELECT TOP 2 score 
                  FROM SC 
                  WHERE t1.C#= C# 
                ORDER BY score DESC 
                  ) 
          ORDER BY t1.C#; 
    44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列  
        select  C# as 课程号,count(*) as 人数 
        from  sc  
        group  by  C# 
        order  by  count(*) desc,c#  
    45、检索至少选修两门课程的学生学号 
        select  S#  
        from  sc  
        group  by  s# 
        having  count(*)  >  =  2 
    46、查询全部学生都选修的课程的课程号和课程名 
        select  C#,Cname  
        from  Course  
        where  C#  in  (select  c#  from  sc group  by  c#)  
    47、查询没学过“叶平”老师讲授的任一门课程的学生姓名 
        select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平'); 
    48、查询两门以上不及格课程的同学的学号及其平均成绩 
        select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#; 
    49、检索“004”课程分数小于60,按分数降序排列的同学学号 
        select S# from SC where C#='004'and score <60 order by score desc; 
    50、删除“002”同学的“001”课程的成绩 
    delete from Sc where S#='001'and C#='001'; 
      

  5.   

    CSDN-->CSDN社区-->MS-SQL Serve-->推荐【精华】
      

  6.   

    经典SQL语句 
    1. CREATE DATABASE database_name [WITH LOG IN “pathname”] 创建数据库。 database_name:数据库名称。 “pathname”:事务处理日志文件。 创建一database_name.dbs目录,存取权限由GRANT设定,无日志文件就不能使用 BEGIN WORK等事务语句(可用START DATABASE语句来改变)。 可选定当前数据库的日志文件。 如:select dirpath form systables where tabtype = “L”; 例:create databse customerdb with log in “/usr/john/log/customer.log”; DATABASE databse-name [EXCLUSIVE] 选择数据库。 database_name:数据库名称。 EXCLUSIVE:独占状态。 存取当前目录和DBPATH中指定的目录下的数据库,事务中处理过程中不要使用此语句。 例:dtabase customerdb; 3. CLOSE DATABASE 关闭当前数据库。 database_name:数据库名称。 此语句之后,只有下列语句合法: CREATE DATABASE; DATABASE; DROP DATABSE; ROLLFORWARD DATABASE; 删除数据库前必须使用此语句。 例:close database; 4. DROP DATABASE database_name 删除指定数据库。 database_name:数据库名称。 用户是DBA或所有表的拥有者;删除所有文件,但不包括数据库目录;不允许删除当前数据库(须先关闭当前数据库);事务中处理过程中不能使用此语句,通过ROLLBACK WORK 也不可将数据库恢复。 例:drop databse customerdb; 5. CREATE [TEMP] TABLE table-name (column_name datatype [NOT NULL], …) [IN “pathname”] 创建表或临时表。 table-name :表名称。 column_name:字段名称。 data-type:字段数据类型。 path-name:指定表的存放位置 TEMP用于指定建立临时表;表名要唯一,字段要唯一;有CONNECT权限的用户可建立临时表;创建的表缺省允许CONNECT用户存取,但不可以ALTER。 例:create table user ( c0 serial not null, c1 char (10), c2 char(2), c3 smallint, c4 decimal(6,3), c5 date ) in “usr/john/customer.dbs/user; 6. ALTER TABLE ALTER TABLE table-name {ADD (newcol_name newcol_type [BEFORE oldcol_name], …) | DROP (oldcol_name, …) | MODIFY (oldcol_name newcol_type [NOT NULL], … )}, … 修改表结构。 table-name:表名称。 newcol_name:新字段名称 newcol_type:新字段类型 oldcol_name:老字段名称 可以使用单个或多个ADD子句、DROP子句、MODIFY子句,但某个字句失败,操作即中止;原字段是NULL,不允许MODIFY为NOT NULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。 例:alter table user add ( c6 char(20) before c5); 7. RENAME TABLE oldname TO newname 修改表名。 oldname:原名称。 newname:新名称。 RENAME使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。 例:rename user to bbb; 8. DROP TABLE table-name 删除表。 table-name:表名称。 删除表意味着删除其中所有数据、各字段上的索引及对表的赋权、视图等;用户不能删除任何系统目录表;语句使用者是表拥有者或拥有DBA权限,事务中处理过程中不要使用此语句。 9. RENAME COLUMN table.oldcolumn, TO newcolumn 修改字段名。 table.oldcolumn:表名及原字段名称 newcolumn:新字段名称。 语句使用者是表的拥有者或拥有DBA权限或有ALTER权限的用户,事务中处理过程中不要使用此语句。 例:rename column user.c6 to c7; 10. CREATE VIEW view-name column-list CREATE VIEW view-name column-list AS select_statement [WITH CHECK OPTION] 创建视图。 view-name:视图名称。 column-list:字段列表。 select_statement:SELECT语句。 以下语句不使用视图:ALTER TABLE,DROP INDEX,ALTER INDEX,LOCK TABLE,CREATE INDEX, RENAME TABLE;视图将延用基表的字段名,对表达式等虚字段和多表间字段重名必须指明标识其字段名;若对视图中某些字段命名,则所有字段都必须命名;视图中数据类型延用基表中的数据类型,虚字段起诀于表达式;不能使用ORDER BY和UNION子句;对视图中所有的字段要有SELECT权限;事务中处理过程中使用此语句,即使事务回滚,视图也将建立,不能恢复。 例:create view v_user as select * from user where c1 = “B1”; 11. DROP VIEW view-name 删除视图。 view-name:视图名称。 用户可删除自己建立的视图;视图的后代视图也被删除;事务中处理中不要使用此语句。 例:drop view v_user; 12. CREATE INDEX CREATE [UNIQUE/DISTINCT] [CLUSTER] INDEX index_name ON table_name ([column_name ASC/DESC],…) 创建索引。 index_name:索引名称。 table_name:表名称。 column_name:字段名称。 UNIQUE/DISTINCT:唯一索引。 CLUSTER:使表的物理存放顺序按索引排列。 ASC/DESC:升序或降序,缺省升序。 语句执行时,将表的状态置为EXCLUSIVE;复合索引最多包含8个字段,所有字段长度和不得大于120字节;事务中处理过程中使用此语句,即使事务回滚,索引将建立,不能恢复。 例:create cluster index ix_user on user(c5); 13. ALTER INDEX index-name TO [NOT] CLUSTER 修改索引性质。 index-name:索引名称。 TO [NOT] CLUSTER:去掉或加上CLUSTER属性。 语句执行时,将表的状态置为EXCLUSIVE;事务中处理过程中使用此语句,即使事务回滚,索引性质将改变,不能恢复。 例:alter index ix_user to not cluster; 14. DROP INDEX index-name 删除索引。 index-name:索引名称。 语句使用者是索引的拥有者或拥有DBA权限,事务中处理过程中不要使用此语句,否则事务无法恢复。 例:drop index ix_user; 15. CREATE SYNONYM synonym FOR table-name 创建同义名。 synonym:同义名 table-name:表名称 数据库的创建者可以使用同义名;没有赋予同义名权限的用户不能使用同义名;同义名不能和表名相同;事务中处理过程中不要使用此语句。 例:create synonym user_alias for user; 16. DROP SYNONYM synonym 删除同义名。 synonym:同义名 可以删除自己建立的同义名;事务中处理过程中不要使用此语句,否则无法恢复。 例:drop synonym user_alias; 17. UPDATE STATISTICS [FOR TABLE table-name] 更新数据库的统计数字。 table-name:表名称 此语句仅作用于当前数据库;可提高查询效率;只有执行此语句,才改变统计数据。 例:update statistics for table user; GRANT {DBA|RESOURCE|CONNECT} TO {PUBLIC|user-list} 授权命令。 PUBLIC|user-list:全部或指定的用户。 三种权限居且仅居其一,事务处理过程中不要执行GRANT语句。 例:grant resource to pulbic; GRANT tab-privilege ON table-name TO {PUBLIC|user-list} [WITH GRANT OPTION] 授表级权限。 tab-privilege:表级权限。 table-name:表名称。 PUBLIC|user-list:全部或指定的用户。 [WITH GRANT OPTION]:表示被授权用户有否权限进行二次授权。 用户可以在自己建立表达式或被[WITH GRANT OPTION]准许的表中进行赋权;限定越多的权限优先级越高。 例:grant update(c1,c6) on user to dick with grant option; 附(INFORMIX的权限) (1) 数据库的权限(控制对数据库的访问以及数据库中表的创建和删除) DBA权限:全部权利,修改系统表,建立和删除表与索引、增加和恢复表数据,以及授予其他用户数据库权限等; RESOURCE权限:允许对数据库表中的数据进行存取,建立永久性表以及索引。 CONNECT权限:只允许对数据库表中的数据进行存取,建立和删除视图与临时表。 (2)表级权限(对表的建立、修改、检索和更新等权限) ALTER:更改权限 DELETE:删除权限 INDEX:索引权限 INSERT:插入权限 SELECT [(cols)]:指定字段或所有字段上的查询权限,不指明字段缺省为所有字段。 UPDATE [(cols)] :指定字段或所有字段上的更新权限,不指明字段缺省为所有字段。 ALL [PRIVILEGES]:以上所有表级权限 19. REVOKE {DBA|RESOURCE|CONNECT} FROM {PUBLIC|user-list} 收权命令。 PUBLIC|user-list:全部或指定的用户。 三种权限居且仅居其一,事务处理过程中不要执行GRANT语句。 例:revoke resource from john; REVOKE tab-privilege ON table-name FROM {PUBLIC|user-list} 收表级权限。 tab-privilege:表级权限。 table-name:表名称。 PUBLIC|user-list:全部或指定的用户。 [WITH GRANT OPTION]:表示被授权用户有否权限进行二次授权。 用户只能取消由其本人赋予其他用户的表级存取权限;不能取消自己的权限,对SELECT和UPDATE作取消时,将取消所有表中字段的SELECT 和UPDATE权限。 例;revoke update on user from dick; LOCK TABLE table-name IN {SHARE|EXCLUSIVE} MODE 记录级加锁和表级加锁或文件加锁。 table-name:表名称。 SHARE:允许读表中数据,但不允许作任何修改 EXCLUSIVE:禁止其他任何形式访问表 每次只能对表琐定一次;事务处理过程中,BEGIN WORK后立即执行LOCK TABLE以取代记录级加锁,COMMIT WORK和 ROLLBACK WORK语句取消所有对表的加锁;若没有事务处理,锁将保持到用户退出或执行UNLOCK为止。 例:lock table user in exclusive mode; UNLOCK TABLE table-name 取消记录级加锁和表级加锁或文件加锁。 table-name:表名称。 例:unlock user; SET LOCK MODE TO [NOT] WAIT 改变锁定状态。 TO [NOT]:等待解锁,有可能被死锁或不等待并提示错误信息,表示此记录被锁,缺省值。 访问一个EXCLUSIVE状态下的记录,将返回一个错误。 START DATABSE db_name [WITH LOG IN “pathname”] 启动事务处理。 “pathname”:事务处理日志文件。 执行该语句前,需要先关闭当前数据库。 例;clost database; start databse customer with log in “/usr/john/log/customer.log”; BEGIN WORK 开始事务。例:begin work; COMMIT WORK 提交(正常结束)事务。例:commit work; ROLLBACK WORK 回滚(非正常结束)事务。例:rollback work; SELECT SELECT select_list FROM tab_name|view_name WHERE condition GROUP BY column_name HAVING condition ORDER BY column_list INTO TEMP table_name 查询语句。 select_list:选择表或* tab_name:表名称 view_name:视图名称。 condition:查询条件,可使用BETWEEN、IN、LIKE、IS NULL、LIKE、MATCHES、NOT、 AND、OR、=、!=或<>、>、 >= 、<=、<、ALL、ANY、SOME column_name:分组字段名称 condition:群聚条件 column_list:排序字段列表,缺省ASC,可指定DSC;排序时,NULL值小于非零值。 table_name:临时表名称 例:略 附(常用函数) (1)集合函数: count(*)、 sum(数据项/表达式)、avg(数据项/表达式)、max(数据项/表达式)、min(数据项/表达式) count(distinct 数据项/表达式)、sum(distinct数据项/表达式)、avg(distinct数据项/表达式) (2)代数函数和三角函数 HEX(数据项/表达式)、ROUND(数据项/表达式)、TRUNC(数据项/表达式)、 TAN(数据项/表达式)、ABS(数据项/表达式)、MOD(被除数,除数) (3)统计函数 标准差,stdev()、方差,variance()、范围,rang() (4)时间函数 DAY(日期/时间表达式):返回数字型 MONTH(日期/时间表达式):返回整数 WEEKDAY(日期/时间表达式):0
      

  7.   

    SQL操作全集 下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: 
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) 
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) 
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 
    1、说明:创建数据库 
    CREATE DATABASE database-name 
    2、说明:删除数据库 
    drop database dbname 
    3、说明:备份sql server 
    --- 创建 备份数据的 device 
    USE master 
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' 
    --- 开始 备份 
    BACKUP DATABASE pubs TO testBack 
    4、说明:创建新表 
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 
    根据已有的表创建新表: 
    A:create table tab_new like tab_old (使用旧表创建新表) 
    B:create table tab_new as select col1,col2… from tab_old definition only 
    5、说明:删除新表drop table tabname 
    6、说明:增加一个列 
    Alter table tabname add column col type 
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 
    7、说明:添加主键: Alter table tabname add primary key(col) 
    说明:删除主键: Alter table tabname drop primary key(col) 
    8、说明:创建索引:create [unique] index idxname on tabname(col….) 
    删除索引:drop index idxname 
    注:索引是不可更改的,想更改必须删除重新建。 
    9、说明:创建视图:create view viewname as select statement 
    删除视图:drop view viewname 
    10、说明:几个简单的基本的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%’ ---like的语法很精妙,查资料! 
    排序:select * from table1 order by field1,field2 [desc] 
    总数:select count * as totalcount from table1 
    求和: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 
    11、说明:几个高级查询运算词 
    A: UNION 运算符 
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 
    B: EXCEPT 运算符 
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
    C: INTERSECT 运算符 
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
    注:使用运算词的几个查询结果行必须是一致的。 
    12、说明:使用外连接 
    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: 
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。  
      

  8.   

    其次,大家来看一些不错的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、说明:在线视图查询(表名1:a ) 
    select * from (SELECT a,b,c FROM a) T where t.a > 1; 8、说明: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 9、说明:in 的使用方法 
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: 
    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 ..... 12、说明:日程安排提前五分钟提醒 
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 13、说明:一条sql 语句搞定数据库分页 
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 14、说明:前10条记录 
    select top 10 * form table1 where 范围 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) 
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 
    (select a from tableA ) except (select a from tableB) except (select a from tableC) 17、说明:随机取出10条数据 
    select top 10 * from tablename order by newid() 18、说明:随机选择记录 
    select newid() 19、说明:删除重复记录 
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 20、说明:列出数据库里所有的表名 
    select name from sysobjects where type='U' 21、说明:列出表里的所有的 
    select name from syscolumns where id=object_id('TableName') 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 
    显示结果: 
    type vender pcs 
    电脑 A 1 
    电脑 A 1 
    光盘 B 2 
    光盘 A 2 
    手机 B 3 
    手机 C 3 23、说明:初始化表table1 
    TRUNCATE TABLE table1 24、说明:选择从10到15的记录 
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 
       
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现) 
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环: 
    Randomize 
    RNumber = Int(Rnd*499) +1 
      
    While Not objRec.EOF 
    If objRec("ID") = RNumber THEN 
    ... 这里是执行脚本 ... 
    end if 
    objRec.MoveNext 
    Wend 
      
      这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示: 
    Randomize 
    RNumber = Int(Rnd*499) + 1 
      
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber 
      
    set objRec = ObjConn.Execute(SQL) 
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 
      
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。 
    再谈随机数 
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录: 
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 
      
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): 
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"   注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。   
    随机读取若干条记录,测试过 
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id) 
    Sql server:select top n * from 表名 order by newid() 
    mysqlelect * From 表名 Order By rand() Limit n 
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查) 
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ... 
    使用SQL语句 用...代替过长的字符串显示 
    语法: 
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename 
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; 
      
    Conn.Execute说明 
    Execute方法 
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种: 
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为: 
        Set 对象变量名=连接对象.Execute("SQL 查询语言") 
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。     2.执行SQL的操作性语言时,没有记录集的返回。此时用法为: 
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option] 
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。 
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。 ·BeginTrans、RollbackTrans、CommitTrans方法 
     
     这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。 
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。 
     
      

  9.   

     create table #student(UserName varchar(20),Subject varchar(20),Score int)
    insert into #student values('张三','语文',74)
    insert into #student values('张三','数学',83)
    insert into #student values('张三','物理',93)
    insert into #student values('李四','语文',74)
    insert into #student values('李四','数学',84)
    insert into #student values('李四','物理',94)
    /*
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    */
    declare @Sql varchar(1000)
    set @sql='select b.UserName'
    select @sql=@sql+' , sum(case when b.Subject= '''+Subject+''' then Score else 0 end)['+Subject+'] '
    from (select distinct(Subject) from #student) b
    set @sql=@sql+' from #student b group by b.UserName'
    exec(@sql) (2)CREATE TABLE #TA(n1 NVARCHAR(2),n2 NVARCHAR(5),n3 NVARCHAR(2),n4 INT,n5 INT)
    INSERT #TA
    SELECT N'毛巾',N'哈尔滨',N'条',10,1 UNION ALL 
    SELECT N'水杯',N'哈尔滨',N'个',20,2
    CREATE TABLE #TB(M1 NVARCHAR(5),M2 SMALLDATETIME,M3 INT,M4 INT)
    INSERT #TB
    SELECT N'一门店','20080101',20,1 UNION ALL 
    SELECT N'二门店','20080101',30,1 UNION ALL 
    SELECT N'一门店','20080101',40,2 UNION ALL 
    SELECT N'二门店','20080101',50,2 UNION ALL 
    SELECT N'一门店','20080102',60,1 UNION ALL 
    SELECT N'二门店','20080102',70,1 UNION ALL 
    SELECT N'一门店','20080102',80,2 UNION ALL 
    SELECT N'二门店','20080102',90,2/*
    想求出每个商品的现在有库存、每个门店的现有库存、总库存,如: 
    品名  产地    单位 数量  一门店  二门店  ……  总库存 
    毛巾  哈尔滨  条  10      60    70    ……  
    水杯  哈尔滨  个  20      80    90    ……  
    */declare @sql varchar(1000)
    set @sql='select a.n1,a.n2,a.n3,a.n4'
    select @sql=@sql+ ' ,sum(case when b.M1= '''+M1+''' then b.M3 else null end) ['+M1+']'
    from (select distinct (M1) from #TB) a
    set @sql=@Sql+ ' ,sum(M3) from #TA a,#TB b where a.n5=b.M4 group by a.n1,a.n2,a.n3,a.n4'
    exec(@sql)
      

  10.   

    /*合并法系列*/ 
    --合并法(函数) 
    create table tb1 

      col1 varchar(10), 
      col2 int 

    insert into tb1 select 'a',1 
    union all select 'a',2 
    union all select 'b',1 
    union all select 'b',2 
    union all select 'b',3 
    create function dbo.FC_Str(@col1 varchar(100)) 
    returns varchar(100) 
    as 
    begin 
       declare @i varchar(100) 
       set @i='' 
       select @i=@i+','+cast(col2 as varchar) from tb1 where col1=@col1 
       return(stuff(@i,1,1,'')) end 
    select col1,dbo.FC_Str(col1) from tb1 group by col1 --固定行合并法 
    create table #tb 

      col1 varchar(10), 
      col2 int 

    insert into #tb select 'a',1 
    union all select 'a',2 
    union all select 'b',1 
    union all select 'b',2 
    union all select 'c',3 select col1, 
           col2=cast(min(col2) as varchar)+ 
           case when count(*)=1 then '' 
           else +','+cast(max(col2) as varchar) end from #tb 
    group by col1 
    --临时表合并法 
    if object_id('tb') is not null drop table tb 
    create table tb 

      col1 varchar(10), 
      col2 int 

    insert into tb select 'a',1 
    union all select 'a',2 
    union all select 'b',1 
    union all select 'b',2 
    union all select 'b',3 select col1,col2=cast(col2 as varchar(100)) into #t1 from tb order by col1,col2 
    declare @col1 varchar(20) 
    declare @col2 varchar(100) 
    update #t1 set @col2= 
                       case when @col1=col1 then @col2+ ',' +col2 
                       else col2 end, 
               @col1=col1, 
               col2=@col2 select * from #t1 select col1,col2=max(col2) from #t1 group by col1
      

  11.   

    ---1字符串拆分 
    /* 
     有字符串1,23,a 
     要求按逗号拆分为表 
      1 
      23 
      a 
    */ 
    --(1)第一种方法(循环截取法) 
    create function FC_SlpitStr(@Str nvarchar(4000),@Split nvarchar(100)) 
    returns @R table (Col nvarchar(100)) 
    as 
    begin 
        declare @StrLen int 
        set @StrLen=len(@Str) 
        while charindex(@Split,@StrLen)>0 
         begin 
          insert into @R values(left(@Str,charindex(@Split,@StrLen)-1)) 
           set @Str=stuff(@Str,1,charindex(@Split,@StrLen),'') 
          end 
         insert into @R values(@Str) 
    return  
    end  
    --print dbo.FC_SlpitStr('1,23,a',',') --[database_name.]owner_name.function_name ([argument_expr][,...]) 
    declare @a nvarchar(4000) 
    set @a='1,23,a' 
    select dbo.FC_SlpitStr(@a,',') 
    --(2)动态T-sql语句 
    declare @S varchar(100) 
    set @s='1,23,a' declare @sql varchar(100) 
    set @sql='select col='''+replace(@S, ',' , ''' union all select ''')+'''' 
    print(@sql)
    ---1字符串拆分
    /*
     有字符串1,23,a
     要求按逗号拆分为表
      1
      23
      a
    */
    --(1)第一种方法(循环截取法)
    create function FC_SlpitStr(@Str nvarchar(4000),@Split nvarchar(100))
    returns @R table (Col nvarchar(100))
    as
    begin
        declare @StrLen int
        set @StrLen=len(@Str)
        while charindex(@Split,@StrLen)>0
         begin
          insert into @R values(left(@Str,charindex(@Split,@StrLen)-1))
           set @Str=stuff(@Str,1,charindex(@Split,@StrLen),'')
          end
         insert into @R values(@Str)
    return 
    end declare @a nvarchar(4000)
    set @a='1,23,a'
    select dbo.FC_SlpitStr(@a,',')
    --(2)动态T-sql语句
    declare @S varchar(100)
    set @s='1,23,a'declare @sql varchar(100)
    set @sql='select col='''+replace(@S, ',' , ''' union all select ''')+''''
    print(@sql)
      

  12.   

    一、基础1、说明:创建数据库
    CREATE DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表
    drop table tabname
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)
    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement
    删除视图:drop view viewname
    10、说明:几个简单的基本的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%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和: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
    11、说明:几个高级查询运算词
    A: UNION 运算符
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    B: EXCEPT 运算符
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。
    12、说明:使用外连接
    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:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
      

  13.   

    二、提升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) b6、说明:外连接查询(表名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.c7、说明:在线视图查询(表名1:a
    select * from (SELECT a,b,c FROM a) T where t.a > 1;8、说明: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 数值29、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field111、说明:四表联查问题:
    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 .....12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>513、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段14、说明:前10条记录
    select top 10 * form table1 where 范围15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA  except (select a from tableB) except (select a from tableC)17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()18、说明:随机选择记录
    select newid()19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 323、说明:初始化表table1TRUNCATE TABLE table124、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      

  14.   

    三、技巧1、1=1,1=2的使用,在SQL语句组合时用的较多“where 1=1” 是表示选择全部  “where 1=2”全部不选,
    如:
    if @strWhere !='
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
    end
    else
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
    end我们可以直接写成
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere2、收缩数据库
    --重建索引
    DBCC REINDEX
    DBCC INDEXDEFRAG
    --收缩数据和日志
    DBCC SHRINKDB
    DBCC SHRINKFILE3、压缩数据库
    dbcc shrinkdatabase(dbname)4、转移数据库给新用户以已存在用户权限
    exec sp_change_users_login 'update_one','newname','oldname'
    go5、检查备份集
    RESTORE VERIFYONLY from disk='E:\dvbbs.bak'6、修复数据库
    ALTER DATABASE [dvbbs] SET SINGLE_USER
    GO
    DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
    GO
    ALTER DATABASE [dvbbs] SET MULTI_USER
    GO7、日志清除
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
            @MaxMinutes INT,
            @NewSize INT
    USE    tablename            -- 要操作的数据库名
    SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名
    @MaxMinutes = 10,              -- Limit on time allowed to wrap log.
            @NewSize = 1                  -- 你想设定的日志文件的大小(M)-- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size
      FROM sysfiles
      WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' +
            CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
            CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
      FROM sysfiles
      WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
      (DummyColumn char (8000) not null)
    DECLARE @Counter  INT,
            @StartTime DATETIME,
            @TruncLog  VARCHAR(255)
    SELECT  @StartTime = GETDATE(),
            @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
          AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
          AND (@OriginalSize * 8 /1024) > @NewSize
      BEGIN -- Outer loop.
        SELECT @Counter = 0
        WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
          BEGIN -- update
            INSERT DummyTrans VALUES ('Fill Log')
            DELETE DummyTrans
            SELECT @Counter = @Counter + 1
          END
        EXEC (@TruncLog)
      END
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
            CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
            CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
      FROM sysfiles
      WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF8、说明:更改某个表
    exec sp_changeobjectowner 'tablename','dbo'9、存储更改全部表CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
    @OldOwner as NVARCHAR(128),
    @NewOwner as NVARCHAR(128)
    ASDECLARE @Name  as NVARCHAR(128)
    DECLARE @Owner  as NVARCHAR(128)
    DECLARE @OwnerName  as NVARCHAR(128)DECLARE curObject CURSOR FOR
    select 'Name'  = name,
      'Owner'  = user_name(uid)
    from sysobjects
    where user_name(uid)=@OldOwner
    order by nameOPEN  curObject
    FETCH NEXT FROM curObject INTO @Name, @Owner
    WHILE(@@FETCH_STATUS=0)
    BEGIN
    if @Owner=@OldOwner
    begin
      set @OwnerName = @OldOwner + '.' + rtrim(@Name)
      exec sp_changeobjectowner @OwnerName, @NewOwner
    end
    -- select @name,@NewOwner,@OldOwnerFETCH NEXT FROM curObject INTO @Name, @Owner
    ENDclose curObject
    deallocate curObject
    GO
    10、SQL SERVER中直接循环写入数据
    declare @i int
    set @i=1
    while @i<30
    begin
      insert into test (userid) values(@i)
      set @i=@i+1
    end
      

  15.   

    SQL语句大全SELECT * 
      FROM service_promotion 
      WHERE gmt_modified 
      >= TO_DATE('2001-9-01','yyyy-mm-dd') 
      AND gmt_modified 
      < TO_DATE('2001-9-02','yyyy-mm-dd');
    SQL Server 数据库的高级操作
    (1) 批处理
    (2) 变量
    (3) 逻辑控制
    (4) 函数
    (5) 高级查询
     (1)批处理
    将多条SQL语句作为一个整体去编译,生成一个执行计划,然后,执行!
    理解批处理的关键在于"编译",对于由多条语句组成的一个批处理,
    如果在编译时,其中,有一条出现语法错误,将会导致编译失败!
    create table t
    (
    a int,
    b int
    )
    -- 注释
    -- 如果多行注释中包含了批处理的标识符go
    -- 在编译的过程中代码将会被go分割成多个部分来分批编译
    -- 多行注释的标记将会被分隔而导致编译出错
    -- 以下几条语句是三个非常经典的批处理
    -- 你猜一下会添加几条记录!
    /*
    insert into t values (1,1)
    go
    */
    insert into t values (2,2)
    go
    /*
    insert into t values (3,3)
    */
    go
    -- 查询看添加了几条记录
    select * from t
    truncate table t
    (2)变量
    -- 全局变量
    SQL Server中全局变量由系统定义、系统维护,用户一般仅可对其进行读取!
    -- 查看SQL Server版本print @@version
    -- 服务器名称
    print @@servername
    -- 系统错误编号
    insert into t values ('a','a')
    print @@error
    insert into t values ('a','a')
    if @@error = 245
     print 'Error'
    -- SQL Server 版本的语言信息
    print @@LANGUAGE
    -- 一周的第一天从星期几算起
    print @@datefirst
    -- CPU 执行命令所耗费时间的累加
    print @@cpu_busy
    -- 获取最近添加的标识列的值
    create table tt
    (
    a int identity(3, 10),
    b int
    )
    insert into tt (b) values (1)
    print @@identity
    select * from tt
    -- 局部变量
    局部变量由用户定义,仅可在同一个批处理中调用和访问
    declare @intAge tinyint
    set @intAge = 12
    print @intAge
    declare @strName varchar(12)
    select @strName = 'state'
    print @strName
    select au_lname, @strName from authors
    (3)逻辑控制
    -- IF条件判断
    declare @i int
    set @i = 12
    if (@i > 10)
     begin    -- {
      print 'Dadadada!'
      print 'Dadadada!'
     end    -- }
    else
     begin
      print 'XiaoXiao!'
      print 'XiaoXiao!'
     end
    -- While循环控制
    declare @i int;
    set @i = 12;
    print @i
    return;
    while (@i < 18)
    begin
     print @i;
     set @i = @i + 1;
     if @i < 17
      continue;
     if @i > 15
      break;
    end;
    -- CASE 分支判断
    select au_lname, state, '犹他州' from authors where state = 'UT'
    select au_lname, state, '密西西比州' from authors where state = 'MI'
    select au_lname, state, '肯塔基州' from authors where state = 'KS'
    select au_lname, state, 
     case state
     when 'UT' then '犹他州'
     when 'MI' then '密西西比州'
     when 'KS' then '肯塔基州'
     when 'CA' then '加利福利亚'
     else state
     end
    from authors
    (4.1)系统函数
    -- 获取指定字符串中左起第一个字符的ASC码
    print ascii('ABCDEF')
    -- 根据给定的ASC码获取相应的字符
    print char(65)
    -- 获取给定字符串的长度
    print len('abcdef')
    -- 大小写转换
    print lower('ABCDEF')
    print upper('abcdef')
    -- 去空格
    print ltrim('    abcd  dfd  df  ')
    print rtrim('    abcd  dfd  df  ')
    -- 求绝对值
    print abs(-12)
    -- 幂
    -- 3 的 2 次方
    print power(3,2)
    print power(3,3)
    -- 随机数
    -- 0 - 1000 之间的随机数
    print rand() * 1000 
    -- 获取圆周率
    print pi()
    -- 获取系统时间
    print getdate()
    -- 获取3天前的时间
    print dateadd(day, -3 , getdate())
    -- 获取3天后的时间
    print dateadd(day, 3 , getdate())
    -- 获取3年前的时间
    print dateadd(year, -3 , getdate())
    -- 获取3年后的时间
    print dateadd(year, 3 , getdate())
    -- 获取3月后的时间
    print dateadd(month, 3 , getdate())
    -- 获取9小时后的时间
    print dateadd(hour, 9 , getdate())
    -- 获取9分钟后的时间
    print dateadd(minute, 9 , getdate())
    -- 获取指定时间之间相隔多少年
    print datediff(year, '2005-01-01', '2008-01-01')
    -- 获取指定时间之间相隔多少月
    print datediff(month, '2005-01-01', '2008-01-01')
    -- 获取指定时间之间相隔多少天
    print datediff(day, '2005-01-01', '2008-01-01')
    -- 字符串合并
    print 'abc' + 'def'
    print 'abcder'
    print 'abc' + '456'
    print 'abc' + 456
    -- 类型转换
    print 'abc' + convert(varchar(10), 456)
    select title_id, type, price from titles
    -- 字符串连接必须保证类型一致(以下语句执行将会出错)
    -- 类型转换
    select title_id + type + price from titles
    -- 正确
    select title_id + type + convert(varchar(10), price) from titles
    print '123' + convert(varchar(3), 123)
    print '123' + '123'
    print convert(varchar(12), '2005-09-01',110)
    -- 获取指定时间的特定部分
    print year(getdate())
    print month(getdate())
    print day(getdate())
    -- 获取指定时间的特定部分
    print datepart(year, getdate())
    print datepart(month, getdate())
    print datepart(day, getdate())
    print datepart(hh, getdate())
    print datepart(mi, getdate())
    print datepart(ss, getdate())
    print datepart(ms, getdate())
    -- 获取指定时间的间隔部分
    -- 返回跨两个指定日期的日期和时间边界数
    print datediff(year, '2001-01-01', '2008-08-08')
    print datediff(month, '2001-01-01', '2008-08-08')
    print datediff(day, '2001-01-01', '2008-08-08')
    print datediff(hour, '2001-01-01', '2008-08-08')
    print datediff(mi, '2001-01-01', '2008-08-08')
    print datediff(ss, '2001-01-01', '2008-08-08')
    -- 在向指定日期加上一段时间的基础上,返回新的 datetime 值
    print dateadd(year, 5, getdate())
    print dateadd(month, 5, getdate())
    print dateadd(day, 5, getdate())
    print dateadd(hour, 5, getdate())
    print dateadd(mi, 5, getdate())
    print dateadd(ss, 5, getdate())
    -- 其他
    print host_id()
    print host_name()
    print db_id('pubs')
    print db_name(5)
    -- 利用系统函数作为默认值约束
    drop table ttt
    create table ttt
    (
    stu_name varchar(12),
    stu_birthday datetime default (getdate())
    )
    alter table ttt
    add constraint df_ttt_stu_birthday default  (getdate()) for stu_birthday
    insert into ttt values ('ANiu', '2005-04-01')
    insert into ttt values ('ANiu', getdate())
    insert into ttt values ('AZhu', default)
    sp_help ttt
    select * from ttt
    (4.2)自定义函数
    select title_id
    from titles 
    where type = 'business'
    select stuff(title_id,1,3,'ABB'), type 
    from titles 
    where type = 'business'
    select count(title_id) from titles where type = 'business'
    select title_id from titles where type = 'business'
    select  *,count(dbo.titleauthor.title_id)
    FROM dbo.authors INNER JOIN
    dbo.titleauthor ON dbo.authors.au_id = dbo.titleauthor.au_id
    select au_id, count(title_id)
    from titleauthor
    group by au_id
    SELECT dbo.authors.au_id, COUNT(dbo.titleauthor.title_id) AS '作品数量'
    FROM dbo.authors  left outer JOIN
          dbo.titleauthor ON dbo.authors.au_id = dbo.titleauthor.au_id
    GROUP BY dbo.authors.au_id
    order by '作品数量'
    -- 自定义函数的引子(通过这个子查询来引入函数的作用)
    -- 子查询
    -- 统计每个作者的作品数
    -- 将父查询中的作者编号传入子查询
    -- 作为查询条件利用聚合函数count统计其作品数量
    select au_lname,  
     (select count(title_id) 
     from titleauthor as ta 
     where ta.au_id = a.au_id
     ) as TitleCount
    from authors as a
    order by TitleCount
    -- 是否可以定义一个函数
    -- 将作者编号作为参数统计其作品数量并将其返回
    select au_id, au_lname, dbo.GetTitleCountByAuID(au_id) as TitleCount 
    from authors
    order by TitleCount
    -- 根据给定的作者编号获取其相应的作品数量
    create function GetTitleCountByAuID(@au_id varchar(12))
    returns int
    begin
     return (select count(title_id) 
      from titleauthor
      where au_id = @au_id)
    end 
    -- 利用函数来显示每个作者的作品数量
    create proc pro_CalTitleCount
    as
    select au_id, au_lname, dbo.GetTitleCountByAuID(au_id) as TitleCount 
    from authors
    order by TitleCount
    go
      

  16.   

    -- 执行存储过程
    execute pro_CalTitleCount
    -- vb中函数定义格式
    function GetTitleCountByAuID(au_id as string) as integer 
     .......
     GetTitleCountByAuID = ?
    end function
    -- SALES 作品销售信息
    select * from sales
    -- 根据书籍编号查询其销售记录(其中,qty 表示销量)
    select * from sales where title_id = 'BU1032'
    -- 根据书籍编号统计其总销售量(其中,qty 表示销量)
    select sum(qty) from sales where title_id = 'BU1032'
    -- 利用分组语句(group by),根据书籍编号统计每本书总销售量(其中,qty 表示销量)
    select title_id, sum(qty) from sales group by title_id
    -- 是否可以考虑定义一个函数根据书籍编号来计算其总销售量
    -- 然后,将其应用到任何一条包含了书籍编号的查询语句中
    select title_id, title, dbo.GetTotalSaleByTitleID(title_id) as TotalSales
    from titles
    order by TotalSales
    -- 定义一个函数根据书籍编号来计算其总销售量
    create function GetTotalSaleByTitleID(@tid varchar(24))
    returns int
    begin
     return(select sum(qty) from sales where title_id = @tid)
    end
    -- 统计书籍销量的前10位
    -- 其中,可以利用函数计算结果的别名作为排序子句的参照列
    select top 10 title_id, title, dbo.GetTotalSaleByTitleID(title_id) as TotalSales
    from titles
    order by TotalSales desc
    -- 根据书籍编号计算其销量排名
    create function GetTheRankOfTitle(@id varchar(20))
    returns int
    begin
     return(select count(TotalSales) 
      from titles
       where ToalSales >(
      select TotalSales
       from titles
       where title_id=@id))
    end
    -- 根据书籍编号计算其销量排名
    select dbo.GetTheRankOfTitle('pc1035') from titles
    select count(title_id) + 1
    from titles 
    where dbo.GetTotalSaleByTitleID(title_id) > dbo.GetTotalSaleByTitleID('pc1035')
    -- 删除函数
    drop function GetRankByTitleId
    -- 根据书籍编号计算其销量排名
    create function GetRankByTitleId(@tid varchar(24))
    returns int
    begin
     return (select count(title_id) + 1
      from titles 
      where dbo.GetTotalSaleByTitleID(title_id) > dbo.GetTotalSaleByTitleID(@tid))
    end
    -- 在查询语句中利用函数统计每本书的总销量和总排名
    select title_id, title,
     dbo.GetTotalSaleByTitleID(title_id) as TotalSales,
     dbo.GetRankByTitleId(title_id) as TotalRank
    from titles
    order by TotalSales desc
    -- 查看表结构
    sp_help titles
    -- 查看存储过程的定义内容
    sp_helptext GetRankByTitleId
    sp_helptext sp_helptext 
    sp_helptext xp_cmdshell
    -- [ORDER DETAILS] 订单详细信息
    select * from [order details] 
    select * from [order details] where productid = 23
    -- 根据产品编号在订单详细信息表中统计总销售量
    select sum(quantity) from [order details] where productid = 23-- 构造一个函数根据产品编号在订单详细信息表中统计总销售量
    create function GetTotalSaleByPID(@Pid varchar(12))
    returns int
    begin
     return(select sum(quantity) from [order details] where productid = @Pid)
    end
    select * from products
    -- 在产品表中查询,统计每一样产品的总销量
    select productid, productname, dbo.GetTotalSaleByPID(productid) from products
    -- 
    CREATE FUNCTION LargeOrderShippers ( @FreightParm money )
    RETURNS @OrderShipperTab TABLE
       (
        ShipperID     int,
        ShipperName   nvarchar(80),
        OrderID       int,
        ShippedDate   datetime,
        Freight       money
       )
    AS
    BEGIN
       INSERT @OrderShipperTab
            SELECT S.ShipperID, S.CompanyName,
                   O.OrderID, O.ShippedDate, O.Freight
            FROM Shippers AS S INNER JOIN Orders AS O
                  ON S.ShipperID = O.ShipVia
            WHERE O.Freight > @FreightParm
       RETURN
    END
    SELECT * FROM LargeOrderShippers( $500 )-- 根据作者编号计算其所得版权费
    create function fun_RoyalTyper ( @au_id id)
    returns int
    as
    begin
     declare @rt int
     select @rt = sum(royaltyper) from titleauthor where au_id = @au_id
     return (@rt)
    end
    go
    select top 1 au_lname, au_fname, dbo.fun_RoyalTyper(au_id) as '版权费' 
    from authors
    order by  dbo.fun_RoyalTyper(au_id) desc
    go
    create function fun_MaxRoyalTyper_Au_id ()
    returns id
    as
    begin 
     declare @au_id id
     select @au_id = au_id
     from authors
     order by  dbo.fun_RoyalTyper(au_id)
     return(@au_id)
    end
    go
    select dbo.fun_MaxRoyalTyper_Au_id()
    go
    select au_lname, au_fname, dbo.fun_RoyalTyper(au_id) as '版权税'  
    from authors
    where au_id = dbo.fun_MaxRoyalTyper_Au_id()
    go
    (5)高级查询
    select title_id, price from titles
    -- 查找最高价格
    select max(price) from titles
    -- 查找最贵书籍的价格(排序),如果存在多本价格最贵的书,此方法将会遗漏
    select top 1 title_id, price 
    from titles
    order by price desc
    -- 查找最贵书籍的价格(子查询)
    select title_id, price 
    from titles
    where price = (select max(price) from titles)
    -- 查询指定出版社出版的书(连接)
    select p.pub_name as '出版社', t.title as '书籍名称'
    from publishers as p join titles as t on p.pub_id = t.pub_id
    where pub_name = 'New Moon Books'
    -- 查询指定出版社出版的书(子查询)
    select title 
    from titles 
    where pub_id = (select pub_id 
      from publishers 
      where pub_name =  'New Moon Books')
    -- 查询指定出版社出版的书(分开查询)
    select title from titles where pub_id = '0736'
    select pub_id 
    from publishers 
    where pub_name =  'New Moon Books'
    -- 重点
    -- 理解相关子查询的基础
    select * from titles where type = 'business'
    select * from titles where type = 'business123'
    select * from titles where 1 = 1 
    -- 在订单表中寻找满足以下条件的订单编号以及相应的客户编号
    -- 在详细订单表中存在对应的订单编号并且其中包含产品编号为23的产品
    -- 然后将产品编号为23的产品订购量返回判断是否大于20
    USE northwind
    SELECT orderid, customerid
    FROM orders AS or1
    WHERE 20 < (SELECT quantity FROM [order details] AS od
                 WHERE or1.orderid = od.orderid
                  AND  od.productid = 23)
    GO
    SELECT au_lname, au_fname 
    FROM authors 
    WHERE 100 IN 
     (
     SELECT royaltyper FROM titleauthor 
     WHERE titleauthor.au_ID = authors.au_id
     ) 
    select authors.au_lname,authors.au_fname
    from authors join  titleauthor on titleauthor.au_ID=authors.au_id
    where titleauthor.royaltyper =100 
    USE pubs
    SELECT au_lname, au_fname
    FROM authors
    WHERE au_id IN
       (SELECT au_id
       FROM titleauthor
       WHERE title_id IN
          (SELECT title_id
          FROM titles
          WHERE type = 'popular_comp'))
    select distinct t.type, a.au_lname, a.au_fname
    from authors as a join titleauthor as ta on a.au_id = ta.au_id
       join titles as t on ta.title_id = t.title_id
    where t.type = 'business'
    -- 查找类型为'business'或是'trad_cook'类型的书籍
    select * from titles where type = 'business'
    select * from titles where type = 'trad_cook'
    -- 查找类型为'business'或是'trad_cook'类型的书籍(Or)
    select * from titles 
    where type = 'business' or type = 'trad_cook'
    -- 查找类型为'business'或是'trad_cook'类型的书籍(In)
    select * from titles 
    where type in ('business', 'trad_cook')
    -- 查找来自'KS'或是'UT'的作者
    select au_lname, state from authors 
    where state = 'KS'--
    select au_lname, state from authors 
    where state = 'UT'
    -- 查找来自'KS'或是'UT'的作者(Or)
    select au_lname, state from authors 
    where state = 'UT' or state = 'KS'
    -- 查找来自'KS'或是'UT'的作者(In)
    select au_lname, state from authors 
    where state in ('UT', 'KS')
    select au_lname, state from authors 
    where state not in ('UT', 'KS')
    -- 查找出版了类型为'business'类型的书籍的出版社
    SELECT pub_id FROM titles WHERE type = 'business'
    SELECT pub_id,pub_name
    FROM publishers
    WHERE pub_id IN ('1389', '0736')
      

  17.   

    -- 查找出版了类型为'business'类型的书籍的出版社(In和子查询)
    SELECT pub_id,pub_name
    FROM publishers
    WHERE pub_id IN
       (SELECT pub_id
       FROM titles
       WHERE type = 'business')--
    SELECT title, advance
    FROM titles
    WHERE advance > 
       (
        SELECT MAX(advance)
        FROM publishers INNER JOIN titles ON 
          titles.pub_id = publishers.pub_id
        WHERE pub_name = 'Algodata Infosystems'
       )--
    SELECT title, advance
    FROM titles
    WHERE advance > all
       (
        SELECT advance
        FROM publishers INNER JOIN titles ON 
          titles.pub_id = publishers.pub_id
        WHERE pub_name = 'Algodata Infosystems'
     and advance is not null
       )--
    declare @i int
    set @i = 12
    if @i < null
     print 'DDDDD'
    else
     print 'XXXXX'------- 
    SELECT advance
        FROM publishers INNER JOIN titles ON 
          titles.pub_id = publishers.pub_id
        WHERE pub_name = 'Algodata Infosystems'-------------
    select title_id, price from titles
    where price > all
    (
    select price from titles where type = 'business'
    )
    select title_id, price from titles
    where price > 
    (
    select max(price) from titles where type = 'business'
    )
    select title_id, price from titles
    where price > any
    (
    select price from titles where type = 'business'
    )
    select title_id, price from titles
    where price > 
    (
    select min(price) from titles where type = 'business'
    )
    select price from titles where type = 'business'-----------
    if exists(select * from titles where type = '123')
     print 'ZZZZZ'
    else 
     print 'BBBBB'
    if exists(select * from authors 
    where city = 'Berkeley' and state ='UT')
     print 'Welcome'
    else
     print 'Bye-Bye'
    -- 筛选出'business'以及'trad_cook'类型的书籍(联合查询)
    select title_id, type from titles where type = 'business'
    union
    select title_id, type from titles where type = 'trad_cook'
    -- 统计'business'类型的书籍的总价(联合查询)
    select title, price from titles where type = 'business'
    union
    select '合计:', sum(price) from titles where type = 'business'
    -- 统计所有书籍的类型剔除重复(Distinct)
    select distinct type from titles
    -- 作者记录的复制(Select Into)
    select * into au from authors
    select * from au
    -- 查看数据表结构(Select Into并没有对数据表的约束进行复制)
    sp_help authors
    sp_help au
    -- 分页(子查询的经典应用之一)
    -- Jobs 职务信息表(pubs 数据库)
    -- 在实际项目中,显示职务信息时,而职务信息量非常庞大,可能需要将其分为若干个页面来显示
    -- 比如:每页显示4条记录,那么,第一页将显示1,2,3,4,第二页将显示5,6,7,8。。
    -- 显示所有信息
    SELECT * FROM jobs
    -- 显示前 4 信息
    select top 4 * from jobs
    -- 显示前 8 信息
    select top 8 * from jobs
    -- 显示前 12 信息
    select top 12 * from jobs
    -- 寻找规律,每一页的信息源于前(页面大小 * 页码)条信息的反序结果的前 页面大小 条记录
    -- 比如:第二页就是前 8 条记录的反序结果的前 4 条
    select top 4 * 
    from (select top 8 * from jobs) as tt
    order by job_id desc
    -- 当然,对于期望按升序显示查询结果的要求可以对查询结果进行再次排序
    select * from
    (select top 4 * 
    from (select top 8 * from jobs) as tt
    order by job_id desc) as stt
    order by job_id
    -- SQL 命令中不支持在 select 的查询列表中直接使用局部变量
    -- 比如:select top @PageSize * from jobs
    -- 那么,可以考虑对sql命令进行拼装,然后,利用系统存储过程 sp_executesql 来执行
    exec sp_executesql N'Select * from jobs'
    -- 存储过程的实现
    -- 其中,@CurrentPageSize用于确定最后一页的页面大小
    create proc proGetJobsByPage
    @CurrentPageSize int,
    @PageSize int,
    @CurrentPage int
    as
    Declare @strSql nvarchar(400)
    set @strSql = 'select * from
      (select top ' + convert(nvarchar(4), @CurrentPageSize) + ' * 
      from (select top ' + convert(nvarchar(4),(@PageSize * @CurrentPage)) + ' * from jobs) as tt
      order by job_id desc) as stt
      order by job_id'
    exec sp_executesql @strSql
    go
    -- 测试
    exec proGetJobsByPage 2, 4, 4
     
    (6)存储过程
    -- 扩展存储过程
    -- 查询系统目录下文件信息
    xp_cmdshell 'dir *.*'
    -- 启动Windows系统服务
    xp_cmdshell 'net start iisadmin' 
    (7)游标
    -- 游标的五个基本操作步骤:
    -- 声明
    declare cur_titles cursor
    for select title, price from titles
    -- 打开
    open cur_titles
    -- 提取
    fetch cur_titles
    fetch next from cur_titles
    -- 关闭
    close cur_titles
    -- 释放
    deallocate cur_titles
    -- 利用游标遍历所有书籍信息,通过冒泡排序法进行比较,找出最高价格的书
    -- 这一段为批处理版
    -- 与批处理版相比,存储过程版更方便调试以及代码的重用
    -- 声明
    declare cur_titles cursor
    for select title, price from titles
    -- 打开
    open cur_titles
    declare @title varchar(80)
    declare @price numeric(9,4)
    declare @title_temp varchar(80)
    declare @price_temp numeric(9,4)
    -- 提取
    fetch cur_titles into @title, @price
    fetch cur_titles into @title_temp, @price_temp
    while @@fetch_status = 0
    begin
     if @price < @price_temp
     begin
      set @price = @price_temp
      set @title = @title_temp
     end 
     fetch cur_titles into @title_temp, @price_temp
    end
    -- 关闭
    close cur_titles
    -- 释放
    deallocate cur_titles
    -- 显示处理结果
    print '最贵的书是: ' + @title + '  ' + '价格是: ' + convert(varchar(12),@price)
    go
    -- 定义一个存储过程
    -- 利用游标遍历所有书籍信息,通过冒泡排序法进行比较,找出最高价格的书(游标具体应用的经典)
    -- 这段存储过程的实现代码相对下面的实现方式略有不同
    -- 代码重复,但是思路更清晰
    create procedure pro_GetMaxTitle
    as
     -- 声明
     declare cur_titles cursor
     for select title, price from titles 
     -- 打开
     open cur_titles 
     -- 存储最贵的书籍信息
     declare @title varchar(80)
     declare @price numeric(9,4)
     -- 存储从游标中提取出来的书籍的信息
     declare @title_temp varchar(80)
     declare @price_temp numeric(9,4) 
     -- 提取
     fetch cur_titles into @title, @price
     -- 判断是否存在书籍信息
     if @@fetch_status <> 0
     begin
      print '没有书籍信息!'
      -- 关闭
      close cur_titles
      -- 释放
      deallocate cur_titles
      -- 结束存储过程
      return 
     end---------- 
     fetch cur_titles into @title_temp, @price_temp 
     -- 判断是否只存在一本书
     if @@fetch_status <> 0
     begin
      -- 显示处理结果
      print '最贵的书是: ' + @title + '  ' + '价格是: ' + convert(varchar(12),@price)
      -- 关闭
      close cur_titles
      -- 释放
      deallocate cur_titles
      -- 结束存储过程
      return 
     end------ 
     while @@fetch_status = 0
     begin
      if @price < @price_temp
      begin
       set @price = @price_temp
       set @title = @title_temp
      end 
      fetch cur_titles into @title_temp, @price_temp
     end 
     -- 显示处理结果
     print '最贵的书是: ' + @title + '  ' + '价格是: ' + convert(varchar(12),@price) 
     -- 关闭
     close cur_titles 
     -- 释放
     deallocate cur_titles  
    go
    -- 定义一个存储过程
    -- 利用游标遍历所有书籍信息,通过冒泡排序法进行比较,找出最高价格的书
    -- 相对上面的实现方式,以下实现方式更简洁
    create procedure pro_GetMaxTitle
    as
     -- 声明
     declare cur_titles cursor
     for select title, price from titles 
     -- 打开
     open cur_titles 
     -- 存储最贵的书籍信息
     declare @title varchar(80)
     declare @price numeric(9,4)
     -- 存储从游标中提取出来的书籍的信息
     declare @title_temp varchar(80)
     declare @price_temp numeric(9,4) 
     -- 提取
     fetch cur_titles into @title, @price
     -- 判断是否存在书籍信息
     if @@fetch_status = 0
     begin
      print '没有书籍信息!'
      goto errNoTitles
     end--------------------- 
     fetch cur_titles into @title_temp, @price_temp
     -- 判断是否只存在一本书
     if @@fetch_status = 0
     begin
      goto errOnlyOne
     end -----------------  
     while @@fetch_status = 0
     begin
      if @price < @price_temp
      begin
       set @price = @price_temp
       set @title = @title_temp
      end 
      fetch cur_titles into @title_temp, @price_temp
     end---------------- 
    errOnlyOne:
     -- 显示处理结果
     print '最贵的书是: ' + @title + '  ' + '价格是: ' + convert(varchar(12),@price) 
    errNoTitles:
     -- 关闭
     close cur_titles 
     -- 释放
     deallocate cur_titles--------- 
    go
    -- 根据作者编号查看其相应的作品年销售量
    -- 低于5000,提示: 销售量太低
    -- 高于5000,提示: 销售量太高
    create procedure pro_sales_avg (@au_id id)
    as
    if exists(select au_id from authors where au_id = @au_id)
    begin
     declare TempSales cursor
     for 
     select title, ytd_sales 
     from titleauthor ta join titles t
      on ta.title_id = t.title_id
     where au_id = @au_id----------- 
     open TempSales ---------- 
     declare @t varchar(80)
     declare @y int---------- 
     fetch TempSales
     into @t, @y
     while @@fetch_status = 0
     begin
      if 5000 > @y
       print @t + ' ' + convert(varchar(5),@y) + ' 销售量太低'
      else
       print @t + ' ' + convert(varchar(5),@y) + ' 销售量太高'
      fetch TempSales
      into @t, @y
     end------------- 
     close TempSales
     deallocate TempSales
    end
    else
     print '作者编号无效!'
    go
    exec pro_sales_avg '213-46-8915'
      

  18.   

    示例
    A. 使用简单游标和语法
    打开该游标时所生成的结果集包括 pubs 数据库的 authors 表中的所有行和列。可以更新该游标,对该游标所做的所有更新和删除均在提取中表现出来。因为没指定 SCROLL 选项,FETCH NEXT 是唯一可用的提取选项。
    */
    DECLARE authors_cursor CURSOR
    FOR 
    SELECT * FROM authors
    OPEN authors_cursor
    FETCH NEXT FROM authors_cursor
    /*
    B. 使用嵌套游标生成报表输出
    下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。
    */
    SET NOCOUNT ON
    DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
       @message varchar(80), @title varchar(80)
    PRINT "-------- Utah Authors report --------"
    DECLARE authors_cursor CURSOR 
    FOR 
    SELECT au_id, au_fname, au_lname
    FROM authors
    WHERE state = "UT"
    ORDER BY au_id
    OPEN authors_cursor
    FETCH NEXT FROM authors_cursor 
    INTO @au_id, @au_fname, @au_lname
    WHILE @@FETCH_STATUS = 0
    BEGIN
       PRINT " "
       SELECT @message = "----- Books by Author: " + 
          @au_fname + " " + @au_lname
       PRINT @message
       -- Declare an inner cursor based   
       -- on au_id from the outer cursor.
       DECLARE titles_cursor CURSOR FOR 
       SELECT t.title
       FROM titleauthor ta, titles t
       WHERE ta.title_id = t.title_id AND
       ta.au_id = @au_id   -- Variable value from the outer cursor
       OPEN titles_cursor
       FETCH NEXT FROM titles_cursor INTO @title
       IF @@FETCH_STATUS <> 0 
          PRINT "         <<No Books>>"     
       WHILE @@FETCH_STATUS = 0
       BEGIN
          
          SELECT @message = "         " + @title
          PRINT @message
          FETCH NEXT FROM titles_cursor INTO @title
       
       END
       CLOSE titles_cursor
       DEALLOCATE titles_cursor
       
       -- Get the next author.
       FETCH NEXT FROM authors_cursor 
       INTO @au_id, @au_fname, @au_lname
    END
    CLOSE authors_cursor
    DEALLOCATE authors_cursor
    GO
    -------- Utah Authors report --------
     
    ----- Books by Author: Anne Ringer
             The Gourmet Microwave
             Is Anger the Enemy?
     
    ----- Books by Author: Albert Ringer
             Is Anger the Enemy?
             Life Without Fear
    (8)触发器
    -- 设定数据库的递归触发器
    alter database pubs
     set recursive_triggers on
    go
    -- 创建数据表,并设定主键、外键以及缺省约束
    create table emp_mgr
    (
    Emp char(30) primary key,
    Mgr char(30) null foreign key references emp_mgr(Emp),
    NoOfReports int default 0
    )
    go
    -- 创建插入触发器
    create trigger emp_marins
    on emp_mgr
    for insert
    as
    declare @e char(30),@m char(30)
    declare cur_mgr cursor for 
     select emp_mgr.emp
     from emp_mgr,inserted
     where emp_mgr.emp = inserted.mgr
    open  cur_mgr
    fetch next from cur_mgr into @e
    while @@fetch_status = 0
    begin
     update emp_mgr
     set emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1
     where emp_mgr.emp = @e
     
     fetch next from cur_mgr into @e
    end 
    close cur_mgr
    deallocate cur_mgr
    go
    -- 查看数据表相关触发器
    sp_helptrigger emp_mgr
    gocreate trigger emp_mgrupd
    on emp_mgr
    for update
    as
    if update (mgr)
    begin
     update emp_mgr
     set emp_mgr.NoOfReports = emp_mgr.NoofReports + 1
     from inserted
     where emp_mgr.emp = inserted.mgr
     
     update emp_mgr
     set emp_mgr.NoOfReports = emp_mgr.NoOfReports -1
     from deleted
     where emp_mgr.emp = deleted.mgr
    end
    goinsert emp_mgr(emp,mgr) values ('Harry',null)
    insert emp_mgr(emp,mgr) values ('Alice','Harry')
    insert emp_mgr(emp,mgr) values ('Paul','Alice')
    insert emp_mgr(emp,mgr) values ('Joe','Alice')
    insert emp_mgr(emp,mgr) values ('Dave','Joe')
    go
    select * from emp_mgr
    go
    update emp_mgr 
    set mgr = 'Harry'
    where emp = 'Dave'
    go
    select * from emp_mgr
    go
    -------------------------------------------------------------------------
    *******************Transact_SQL********************
    --语 句 功 能
    --数据操作
    Select --从数据库表中检索数据行和列
    Insert --向数据库表添加新数据行
    Delete --从数据库表中删除数据行
    Update --更新数据库表中的数据
    --数据定义
    Create TABLE --创建一个数据库表
    Drop TABLE --从数据库中删除表
    Alter TABLE --修改数据库表结构
    Create VIEW --创建一个视图
    Drop VIEW --从数据库中删除视图
    Create INDEX --为数据库表创建一个索引
    Drop INDEX --从数据库中删除索引
    Create PROCEDURE --创建一个存储过程
    Drop PROCEDURE --从数据库中删除存储过程
    Create TRIGGER --创建一个触发器
    Drop TRIGGER --从数据库中删除触发器
    Create SCHEMA --向数据库添加一个新模式
    Drop SCHEMA --从数据库中删除一个模式
    Create DOMAIN --创建一个数据值域
    Alter DOMAIN --改变域定义
    Drop DOMAIN --从数据库中删除一个域
    --数据控制
    GRANT --授予用户访问权限
    DENY --拒绝用户访问
    REVOKE --解除用户访问权限
    --事务控制
    COMMIT --结束当前事务
    ROLLBACK --中止当前事务
    SET TRANSACTION --定义当前事务数据访问特征
    --程序化SQL
    DECLARE --为查询设定游标
    EXPLAN --为查询描述数据访问计划
    OPEN --检索查询结果打开一个游标
    FETCH --检索一行查询结果
    CLOSE --关闭游标
    PREPARE --为动态执行准备SQL 语句
    EXECUTE --动态地执行SQL 语句
    DESCRIBE --描述准备好的查询
    ---局部变量
    declare @id char(10)
    --set @id = '10010001'
    select @id = '10010001'
    ---全局变量
    ---必须以开头
    --IF ELSE
    declare @x int @y int @z int
    select @x = 1 @y = 2 @z=3
    if @x > @y
    print 'x > y' --打印字符串'x > y'
    else if @y > @z
    print 'y > z'
    else print 'z > y'
    --CASE
    use pangu
    update employee
    set e_wage =
    case
    when job_level = ’1’ then e_wage*1.08
    when job_level = ’2’ then e_wage*1.07
    when job_level = ’3’ then e_wage*1.06
    else e_wage*1.05
    end
    --WHILE CONTINUE BREAK
    declare @x int @y int @c int
    select @x = 1 @y=1
    while @x < 3
    begin
    print @x --打印变量x 的值
    while @y < 3
    begin
    select @c = 100*@x + @y
    print @c --打印变量c 的值
    select @y = @y + 1
    end
    select @x = @x + 1
    select @y = 1
    end
    --WAITFOR
    --例 等待1 小时2 分零3 秒后才执行Select 语句
    waitfor delay ’01:02:03’
    select * from employee
    --例 等到晚上11 点零8 分后才执行Select 语句
    waitfor time ’23:08:00’
    select * from employee
    ***Select***
    select *(列名) from table_name(表名) where column_name operator value
    ex:(宿主)
    select * from stock_information where stockid = str(nid)
    stockname = 'str_name' 
    stockname like '% find this %' 
    stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
    stockname like '[^F-M]%' --------- (^排除指定范围)
    --------- 只能在使用like关键字的where子句中使用通配符)
    or stockpath = 'stock_path'
    or stocknumber < 1000
    and stockindex = 24
    not stocksex = 'man'
    stocknumber between 20 and 100
    stocknumber in(10,20,30)
    order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
    order by 1,2 --------- by列号
    stockname = (select stockname from stock_information where stockid = 4)
    --------- 子查询
    --------- 除非能确保内层select只返回一个行的值,
    --------- 否则应在外层where子句中用一个in限定符
    select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
    select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
    select stockname , "stocknumber" = count(*) from table_name group by stockname
    --------- group by 将表按行分组,指定列中有相同的值
    having count(*) = 2 --------- having选定指定的组
    select * 
    from table1, table2 
    where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
    table1.id =* table2.id -------- 右外部连接 
    select stockname from table1
    union [all] ----- union合并查询结果集,all-保留重复行
    select stockname from table2
    ***insert***
    insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
    value (select Stockname , Stocknumber from Stock_table2)---value为select语句
    ***update***
    update table_name set Stockname = "xxx" [where Stockid = 3]
    Stockname = default
    Stockname = null
    Stocknumber = Stockname + 4
    ***delete***
    delete from table_name where Stockid = 3
    truncate table_name ----------- 删除表中所有行,仍保持表的完整性
    drop table table_name --------------- 完全删除表
    ***alter table*** --- 修改数据库表结构
    alter table database.owner.table_name add column_name char(2) null .....
    sp_help table_name ---- 显示表已有特征
    create table table_name (name char(20), age smallint, lname varchar(30))
    insert into table_name select ......... ----- 实现删除列的方法(创建新表)
    alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
    ***function(/*常用函数*/)***
      

  19.   

    ----统计函数----
    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)
    --STDEV()
    --STDEV()函数返回表达式中所有数据的标准差
    --STDEVP()
    --STDEVP()函数返回总体标准差
    --VAR()
    --VAR()函数返回表达式中所有值的统计变异数
    --VARP()
    --VARP()函数返回总体变异数
    ----算术函数----
    /***三角函数***/
    SIN(float_expression) --返回以弧度表示的角的正弦
    COS(float_expression) --返回以弧度表示的角的余弦
    TAN(float_expression) --返回以弧度表示的角的正切
    COT(float_expression) --返回以弧度表示的角的余切
    /***反三角函数***/
    ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
    ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
    ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
    ATAN2(float_expression1,float_expression2) 
    --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
    DEGREES(numeric_expression)
    --把弧度转换为角度返回与表达式相同的数据类型可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    EXP(float_expression) --返回表达式的指数值
    LOG(float_expression) --返回表达式的自然对数值
    LOG10(float_expression)--返回表达式的以10 为底的对数值
    SQRT(float_expression) --返回表达式的平方根
    /***取近似值函数***/
    CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
    --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
    ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为
    --INTEGER/MONEY/REAL/FLOAT 类型
    SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
    --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
    PI() --返回值为π 即3.1415926535897936
    RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数
    ----字符串函数----
    ASCII() --函数返回字符表达式最左端字符的ASCII 码值
    CHAR() --函数用于将ASCII 码转换为字符
    --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
    LOWER() --函数把字符串全部转换为小写
    UPPER() --函数把字符串全部转换为大写
    STR() --函数把数值型数据转换为字符型数据
    LTRIM() --函数把字符串头部的空格去掉
    RTRIM() --函数把字符串尾部的空格去掉
    LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
    CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
    SOUNDEX() --函数返回一个四位字符码 
    --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值 
    DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
    --0 两个SOUNDEX 函数返回值的第一个字符不同
    --1 两个SOUNDEX 函数返回值的第一个字符相同
    --2 两个SOUNDEX 函数返回值的第一二个字符相同
    --3 两个SOUNDEX 函数返回值的第一二三个字符相同
    --4 两个SOUNDEX 函数返回值完全相同
    QUOTENAME() --函数返回被特定字符括起来的字符串
    /*select quotename('abc', '{') quotename('abc')
    运行结果如下
    ----------------------------------{
    {abc} [abc]*/
    REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
    /*select replicate('abc', 3) replicate( 'abc', -2)
    运行结果如下
    ----------- -----------
    abcabcabc NULL*/
    REVERSE() --函数将指定的字符串的字符排列顺序颠倒
    REPLACE() --函数返回被替换了指定子串的字符串
    /*select replace('abc123g', '123', 'def')
    运行结果如下
    ----------- -----------
    abcdefg*/
    SPACE() --函数返回一个有指定长度的空白字符串
    STUFF() --函数用另一子串替换字符串指定位置长度的子串
    ----数据类型转换函数----
    CAST() 函数语法如下
    CAST() (<expression> AS <data_ type>[ length ])
    CONVERT() 函数语法如下
    CONVERT() (<data_ type>[ length ], <expression> [, style])
    select cast(100+99 as char) convert(varchar(12), getdate())
    运行结果如下
    ------------------------------ ------------
    199 Jan 15 2000
    ----日期函数----
    DAY() --函数返回date_expression 中的日期值
    MONTH() --函数返回date_expression 中的月份值
    YEAR() --函数返回date_expression 中的年份值
    DATEADD(<datepart> ,<number> ,<date>) 
    --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
    DATEDIFF(<datepart> ,<number> ,<date>)
    --函数返回两个指定日期在datepart 方面的不同之处
    DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
    DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
    GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间
    ----系统函数----
    APP_NAME() --函数返回当前执行的应用程序的名称
    COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值
    COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值
    COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名
    DATALENGTH() --函数返回数据表达式的数据的实际长度
    DB_ID(['database_name']) --函数返回数据库的编号
    DB_NAME(database_id) --函数返回数据库的名称
    HOST_ID() --函数返回服务器端计算机的名称
    HOST_NAME() --函数返回服务器端计算机的名称
    IDENTITY(<data_type>[, seed increment]) [AS column_name])
    --IDENTITY() 函数只在Select INTO 语句中使用用于插入一个identity column列到新表中
    /*select identity(int, 1, 1) as column_name
    into newtable
    from oldtable*/
    ISDATE() --函数判断所给定的表达式是否为合理日期
    ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
    ISNUMERIC() --函数判断所给定的表达式是否为合理的数值
    NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值
    NULLIF(<expression1>, <expression2>)
    --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值
      

  20.   


     当表中有 A,B两列 情况如下
    A B
    ----
    Q W
    Q M
    Q S
    即A列对应多个B列,现在要返回 A列值为Q的B列为一条记录中间用空格隔开.即W M S下面函数可以搞定 CREATE FUNCTION dbo.getBbyA
    (
      @C varchar (50)
    )
    RETURNS varchar (100)
    AS
    BEGIN
     DECLARE  @CODE VARCHAR(100)
     set @CODE=''
     SELECT @CODE=@CODE+B+'  '  from table where A=@C
     RETURN   @CODEEND
      

  21.   

    希望对你有帮助
    http://download.csdn.net/source/977691
      

  22.   

    http://w3school.com.cn/sql/index.asp这里比较全面,都是基础
      

  23.   

    1.按姓氏笔画排序:
    Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
    2.数据库加密:
    select encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同3.取回表中字段:
    declare @list varchar(1000),@sql nvarchar(1000) 
    select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
    set @sql='select '+right(@list,len(@list)-1)+' from 表A' 
    exec (@sql)4.查看硬盘分区:
    EXEC master..xp_fixeddrives5.比较A,B表是否相等:
    if (select checksum_agg(binary_checksum(*)) from A)
        =
       (select checksum_agg(binary_checksum(*)) from B)
    print '相等'
    else
    print '不相等'6.杀掉所有的事件探察器进程:
    DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
    WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
    EXEC sp_msforeach_worker '?'7.记录搜索:
    开头到N条记录
    Select Top N * From 表
    -------------------------------
    N到M条记录(要有主索引ID)
    Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID  Desc
    ----------------------------------
    N到结尾记录
    Select Top N * From 表 Order by ID Desc8.如何修改数据库的名称:
    sp_renamedb 'old_name', 'new_name' 9:获取当前数据库中的所有用户表
    select Name from sysobjects where xtype='u' and status>=010:获取某一个表的所有字段
    select name from syscolumns where id=object_id('表名')11:查看与某一个表相关的视图、存储过程、函数
    select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'12:查看当前数据库中所有存储过程
    select name as 存储过程名称 from sysobjects where xtype='P'13:查询用户创建的所有数据库
    select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
    或者
    select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x0114:查询某一个表的字段和数据类型
    select column_name,data_type from information_schema.columns
    where table_name = '表名'[n].[标题]:
    Select * From TableName Order By CustomerName [n].[标题]:
    Select * From TableName Order By CustomerName ------------------------------1. 查看数据库的版本   
      select @@version 
      
    2. 查看数据库所在机器操作系统参数   
      exec master..xp_msver 
      
    3. 查看数据库启动的参数         
      sp_configure 
            
    4. 查看数据库启动时间         
      select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 
      
      查看数据库服务器名和实例名 
      print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)         
      print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)      5. 查看所有数据库名称及大小 
      sp_helpdb 
      
      重命名数据库用的SQL 
      sp_renamedb 'old_dbname', 'new_dbname' 
      
    6. 查看所有数据库用户登录信息 
      sp_helplogins 
      
      查看所有数据库用户所属的角色信息   
      sp_helpsrvrolemember 
      
      修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程 
      
      更改某个数据对象的用户属主 
      sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner' 
      
      注意: 更改对象名的任一部分都可能破坏脚本和存储过程。 
      
      把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本 
      
    7. 查看链接服务器       
      sp_helplinkedsrvlogin 
      
      查看远端数据库用户登录信息   
      sp_helpremotelogin 
      
    8.查看某数据库下某个数据对象的大小 
      sp_spaceused @objname 
      
      还可以用sp_toptables过程看最大的N(默认为50)个表 
      
      查看某数据库下某个数据对象的索引信息 
      sp_helpindex @objname 
      
      还可以用SP_NChelpindex过程查看更详细的索引情况 
      SP_NChelpindex @objname 
      
      clustered索引是把记录按物理顺序排列的,索引占的空间比较少。 
      对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。  查看某数据库下某个数据对象的的约束信息 
      sp_helpconstraint @objname 
      
    9.查看数据库里所有的存储过程和函数 
      use @database_name 
      sp_stored_procedures  查看存储过程和函数的源代码 
      sp_helptext '@procedure_name' 
      
      查看包含某个字符串@str的数据对象名称 
      select distinct object_name(id) from syscomments where text like '%@str%' 
      
      创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数 
      
      解密加密过的存储过程和函数可以用sp_decrypt过程 
      
          10.查看数据库里用户和进程的信息 
      sp_who  查看SQL Server数据库里的活动用户和进程的信息 
      sp_who 'active'  查看SQL Server数据库里的锁的情况 
      sp_lock 
      
      进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.  spid是进程编号,dbid是数据库编号,objid是数据对象编号  查看进程正在执行的SQL语句 
      dbcc inputbuffer () 
            
      推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句 
      sp_who3 
      
      检查死锁用sp_who_lock过程 
      sp_who_lock   
        
          11.收缩数据库日志文件的方法  收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M 
      backup log @database_name with no_log 
      dbcc shrinkfile (@database_name_log, 5)      12.分析SQL Server SQL 语句的方法: 
          
      set statistics time {on | off}  set statistics io {on | off}          图形方式显示查询执行计划 
              
              在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形 
              
              文本方式显示查询执行计划  set showplan_all {on | off} 
      
      set showplan_text { on | off }  set statistics profile { on | off } 
           13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法 
      
      先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作 
      
      alter database [@error_database_name] set single_user 
      
      修复出现不一致错误的表 
      
      dbcc checktable('@error_table_name',repair_allow_data_loss) 
      
      或者可惜选择修复出现不一致错误的小型数据库名 
      
      dbcc checkdb('@error_database_name',repair_allow_data_loss)  alter database [@error_database_name] set multi_user  CHECKDB 有3个参数:  repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误, 
      以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。 
      修复操作可以在用户事务下完成以允许用户回滚所做的更改。 
      如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。 
      如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。 
      修复完成后,请备份数据库。  repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。 
      这些修复可以很快完成,并且不会有丢失数据的危险。  repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。 
      执行这些修复时不会有丢失数据的危险。
      

  24.   

    1.按姓氏笔画排序:
    Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
    2.数据库加密:
    select encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同3.取回表中字段:
    declare @list varchar(1000),@sql nvarchar(1000) 
    select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
    set @sql='select '+right(@list,len(@list)-1)+' from 表A' 
    exec (@sql)4.查看硬盘分区:
    EXEC master..xp_fixeddrives5.比较A,B表是否相等:
    if (select checksum_agg(binary_checksum(*)) from A)
        =
       (select checksum_agg(binary_checksum(*)) from B)
    print '相等'
    else
    print '不相等'6.杀掉所有的事件探察器进程:
    DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
    WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
    EXEC sp_msforeach_worker '?'7.记录搜索:
    开头到N条记录
    Select Top N * From 表
    -------------------------------
    N到M条记录(要有主索引ID)
    Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID  Desc
    ----------------------------------
    N到结尾记录
    Select Top N * From 表 Order by ID Desc8.如何修改数据库的名称:
    sp_renamedb 'old_name', 'new_name' 9:获取当前数据库中的所有用户表
    select Name from sysobjects where xtype='u' and status>=010:获取某一个表的所有字段
    select name from syscolumns where id=object_id('表名')11:查看与某一个表相关的视图、存储过程、函数
    select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'12:查看当前数据库中所有存储过程
    select name as 存储过程名称 from sysobjects where xtype='P'13:查询用户创建的所有数据库
    select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
    或者
    select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x0114:查询某一个表的字段和数据类型
    select column_name,data_type from information_schema.columns
    where table_name = '表名'[n].[标题]:
    Select * From TableName Order By CustomerName [n].[标题]:
    Select * From TableName Order By CustomerName ------------------------------1. 查看数据库的版本   
      select @@version 
      
    2. 查看数据库所在机器操作系统参数   
      exec master..xp_msver 
      
    3. 查看数据库启动的参数         
      sp_configure 
            
    4. 查看数据库启动时间         
      select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 
      
      查看数据库服务器名和实例名 
      print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)         
      print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)      5. 查看所有数据库名称及大小 
      sp_helpdb 
      
      重命名数据库用的SQL 
      sp_renamedb 'old_dbname', 'new_dbname' 
      
    6. 查看所有数据库用户登录信息 
      sp_helplogins 
      
      查看所有数据库用户所属的角色信息   
      sp_helpsrvrolemember 
      
      修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程 
      
      更改某个数据对象的用户属主 
      sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner' 
      
      注意: 更改对象名的任一部分都可能破坏脚本和存储过程。 
      
      把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本 
      
    7. 查看链接服务器       
      sp_helplinkedsrvlogin 
      
      查看远端数据库用户登录信息   
      sp_helpremotelogin 
      
    8.查看某数据库下某个数据对象的大小 
      sp_spaceused @objname 
      
      还可以用sp_toptables过程看最大的N(默认为50)个表 
      
      查看某数据库下某个数据对象的索引信息 
      sp_helpindex @objname 
      
      还可以用SP_NChelpindex过程查看更详细的索引情况 
      SP_NChelpindex @objname 
      
      clustered索引是把记录按物理顺序排列的,索引占的空间比较少。 
      对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。  查看某数据库下某个数据对象的的约束信息 
      sp_helpconstraint @objname 
      
    9.查看数据库里所有的存储过程和函数 
      use @database_name 
      sp_stored_procedures  查看存储过程和函数的源代码 
      sp_helptext '@procedure_name' 
      
      查看包含某个字符串@str的数据对象名称 
      select distinct object_name(id) from syscomments where text like '%@str%' 
      
      创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数 
      
      解密加密过的存储过程和函数可以用sp_decrypt过程 
      
          10.查看数据库里用户和进程的信息 
      sp_who  查看SQL Server数据库里的活动用户和进程的信息 
      sp_who 'active'  查看SQL Server数据库里的锁的情况 
      sp_lock 
      
      进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.  spid是进程编号,dbid是数据库编号,objid是数据对象编号  查看进程正在执行的SQL语句 
      dbcc inputbuffer () 
            
      推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句 
      sp_who3 
      
      检查死锁用sp_who_lock过程 
      sp_who_lock   
        
          11.收缩数据库日志文件的方法  收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M 
      backup log @database_name with no_log 
      dbcc shrinkfile (@database_name_log, 5)      12.分析SQL Server SQL 语句的方法: 
          
      set statistics time {on | off}  set statistics io {on | off}          图形方式显示查询执行计划 
              
              在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形 
              
              文本方式显示查询执行计划  set showplan_all {on | off} 
      
      set showplan_text { on | off }  set statistics profile { on | off } 
           13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法 
      
      先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作 
      
      alter database [@error_database_name] set single_user 
      
      修复出现不一致错误的表 
      
      dbcc checktable('@error_table_name',repair_allow_data_loss) 
      
      或者可惜选择修复出现不一致错误的小型数据库名 
      
      dbcc checkdb('@error_database_name',repair_allow_data_loss)  alter database [@error_database_name] set multi_user  CHECKDB 有3个参数:  repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误, 
      以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。 
      修复操作可以在用户事务下完成以允许用户回滚所做的更改。 
      如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。 
      如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。 
      修复完成后,请备份数据库。  repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。 
      这些修复可以很快完成,并且不会有丢失数据的危险。  repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。 
      执行这些修复时不会有丢失数据的危险。
      

  25.   

    1.按姓氏笔画排序:
    Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
    2.数据库加密:
    select encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同3.取回表中字段:
    declare @list varchar(1000),@sql nvarchar(1000) 
    select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
    set @sql='select '+right(@list,len(@list)-1)+' from 表A' 
    exec (@sql)4.查看硬盘分区:
    EXEC master..xp_fixeddrives5.比较A,B表是否相等:
    if (select checksum_agg(binary_checksum(*)) from A)
        =
       (select checksum_agg(binary_checksum(*)) from B)
    print '相等'
    else
    print '不相等'6.杀掉所有的事件探察器进程:
    DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
    WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
    EXEC sp_msforeach_worker '?'7.记录搜索:
    开头到N条记录
    Select Top N * From 表
    -------------------------------
    N到M条记录(要有主索引ID)
    Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID  Desc
    ----------------------------------
    N到结尾记录
    Select Top N * From 表 Order by ID Desc8.如何修改数据库的名称:
    sp_renamedb 'old_name', 'new_name' 9:获取当前数据库中的所有用户表
    select Name from sysobjects where xtype='u' and status>=010:获取某一个表的所有字段
    select name from syscolumns where id=object_id('表名')11:查看与某一个表相关的视图、存储过程、函数
    select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'12:查看当前数据库中所有存储过程
    select name as 存储过程名称 from sysobjects where xtype='P'13:查询用户创建的所有数据库
    select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
    或者
    select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x0114:查询某一个表的字段和数据类型
    select column_name,data_type from information_schema.columns
    where table_name = '表名'[n].[标题]:
    Select * From TableName Order By CustomerName [n].[标题]:
    Select * From TableName Order By CustomerName ------------------------------1. 查看数据库的版本   
      select @@version 
      
    2. 查看数据库所在机器操作系统参数   
      exec master..xp_msver 
      
    3. 查看数据库启动的参数         
      sp_configure 
            
    4. 查看数据库启动时间         
      select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 
      
      查看数据库服务器名和实例名 
      print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)         
      print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)      5. 查看所有数据库名称及大小 
      sp_helpdb 
      
      重命名数据库用的SQL 
      sp_renamedb 'old_dbname', 'new_dbname' 
      
    6. 查看所有数据库用户登录信息 
      sp_helplogins 
      
      查看所有数据库用户所属的角色信息   
      sp_helpsrvrolemember 
      
      修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程 
      
      更改某个数据对象的用户属主 
      sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner' 
      
      注意: 更改对象名的任一部分都可能破坏脚本和存储过程。 
      
      把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本 
      
    7. 查看链接服务器       
      sp_helplinkedsrvlogin 
      
      查看远端数据库用户登录信息   
      sp_helpremotelogin 
      
    8.查看某数据库下某个数据对象的大小 
      sp_spaceused @objname 
      
      还可以用sp_toptables过程看最大的N(默认为50)个表 
      
      查看某数据库下某个数据对象的索引信息 
      sp_helpindex @objname 
      
      还可以用SP_NChelpindex过程查看更详细的索引情况 
      SP_NChelpindex @objname 
      
      clustered索引是把记录按物理顺序排列的,索引占的空间比较少。 
      对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。  查看某数据库下某个数据对象的的约束信息 
      sp_helpconstraint @objname 
      
    9.查看数据库里所有的存储过程和函数 
      use @database_name 
      sp_stored_procedures  查看存储过程和函数的源代码 
      sp_helptext '@procedure_name' 
      
      查看包含某个字符串@str的数据对象名称 
      select distinct object_name(id) from syscomments where text like '%@str%' 
      
      创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数 
      
      解密加密过的存储过程和函数可以用sp_decrypt过程 
      
          10.查看数据库里用户和进程的信息 
      sp_who  查看SQL Server数据库里的活动用户和进程的信息 
      sp_who 'active'  查看SQL Server数据库里的锁的情况 
      sp_lock 
      
      进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.  spid是进程编号,dbid是数据库编号,objid是数据对象编号  查看进程正在执行的SQL语句 
      dbcc inputbuffer () 
            
      推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句 
      sp_who3 
      
      检查死锁用sp_who_lock过程 
      sp_who_lock   
        
          11.收缩数据库日志文件的方法  收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M 
      backup log @database_name with no_log 
      dbcc shrinkfile (@database_name_log, 5)      12.分析SQL Server SQL 语句的方法: 
          
      set statistics time {on | off}  set statistics io {on | off}          图形方式显示查询执行计划 
              
              在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形 
              
              文本方式显示查询执行计划  set showplan_all {on | off} 
      
      set showplan_text { on | off }  set statistics profile { on | off } 
           13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法 
      
      先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作 
      
      alter database [@error_database_name] set single_user 
      
      修复出现不一致错误的表 
      
      dbcc checktable('@error_table_name',repair_allow_data_loss) 
      
      或者可惜选择修复出现不一致错误的小型数据库名 
      
      dbcc checkdb('@error_database_name',repair_allow_data_loss)  alter database [@error_database_name] set multi_user  CHECKDB 有3个参数:  repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误, 
      以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。 
      修复操作可以在用户事务下完成以允许用户回滚所做的更改。 
      如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。 
      如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。 
      修复完成后,请备份数据库。  repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。 
      这些修复可以很快完成,并且不会有丢失数据的危险。  repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。 
      执行这些修复时不会有丢失数据的危险。
      

  26.   

    TSQL本身就是比较灵活的,要什么大全?
      

  27.   

    SQL基础:
      谁能解释一下什么是子查询??
     什么是联接查询???  先谢谢了`
      

  28.   

    SQL 语句总汇, 网站链接: http://www.cnblogs.com/fanjunhan/articles/297718.html
      

  29.   

    装上SQL Server的话打开它,直接按F1就可以
      

  30.   

    精妙Sql语句
    下列语句部分是Mssql语句,不可以在access中使用。
    SQL分类: 
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) 
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) 
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
    首先,简要介绍基础语句:
    1、说明:创建数据库
    CREATE DATABASE database-name 
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack 
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表: 
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表drop table tabname 
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col) 
    说明:删除主键: Alter table tabname drop primary key(col) 
    8、说明:创建索引:create [unique] index idxname on tabname(col….) 
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement 
    删除视图:drop view viewname
    10、说明:几个简单的基本的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%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和: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
    11、说明:几个高级查询运算词
    A: UNION 运算符 
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 
    B: EXCEPT 运算符 
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
    注:使用运算词的几个查询结果行必须是一致的。 
    12、说明:使用外连接 
    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: 
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
      

  31.   

    其次,大家来看一些不错的sql语句
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a2、说明:拷贝表(拷贝数据,源表名: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) b6、说明:外连接查询(表名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.c7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;8、说明: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 数值29、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)10、说明:两张关联表,删除主表中已经在副表中没有的信息 
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )11、说明:四表联查问题:
    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 .....12、说明:日程安排提前五分钟提醒 
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>513、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段14、说明:前10条记录
    select top 10 * form table1 where 范围15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()18、说明:随机选择记录
    select newid()19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U' 21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 323、说明:初始化表table1
    TRUNCATE TABLE table124、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环: 
    Randomize 
    RNumber = Int(Rnd*499) +1 
     
    While Not objRec.EOF 
    If objRec("ID") = RNumber THEN 
    ... 这里是执行脚本 ... 
    end if 
    objRec.MoveNext 
    Wend 
     
      这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示: 
    Randomize 
    RNumber = Int(Rnd*499) + 1 
     
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber 
     
    set objRec = ObjConn.Execute(SQL) 
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。 
    再谈随机数 
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录: 
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): 
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"   注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。 
    随机读取若干条记录,测试过
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysql elect * From 表名 Order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法 elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; 
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。    2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          •RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          •Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。•BeginTrans、RollbackTrans、CommitTrans方法
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
      BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。