zoukankan      html  css  js  c++  java
  • SQL语句总结

    SQL语句中常用关键词及其解释如下:
    1)SELECT
    将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出 (SELECT)。语法为
    SELECT "栏位名" FROM "表格名"2)DISTINCT
    在上述 SELECT 关键词后加上一个 DISTINCT 就可以去除选择出来的栏位中的重复,从而完成求得这个表格/栏位内有哪些不同的值的功能。语法为
    SELECT DISTINCT "栏位名" FROM "表格名"3)WHERE
    这个关键词可以帮助我们选择性地抓资料,而不是全取出来。语法为
    SELECT "栏位名" FROM "表格名" WHERE "条件" 
    4)AND OR
    上例中的 WHERE 指令可以被用来由表格中有条件地选取资料。这个条件可能是简单的 (像上一页的例子),也可能是复杂的。复杂条件是由二或多个简单条件透过 AND 或是 OR 的连接而成。语法为:
    SELECT "栏位名"  FROM "表格名"  WHERE "简单条件"  {[AND|OR] "简单条件"}+
    5)IN
    在 SQL 中,在两个情况下会用到 IN  这个指令;这一页将介绍其中之一:与 WHERE 有关的那一个情况。在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入 IN  这个子句。语法为:
    SELECT "栏位名"  FROM "表格名"  WHERE "栏位名" IN ('值一', '值二', ...)  
    6)BETWEEN
    IN 这个指令可以让我们依照一或数个不连续 (discrete)的值的限制之内抓出资料库中的值,而 BETWEEN 则是让我们可以运用一个范围 (range)  内抓出资料库中的值,语法为:
    SELECT "栏位名"  FROM "表格名" WHERE "栏位名" BETWEEN '值一' AND '值二' 
    7)LIKE
    LIKE 是另一个在 WHERE  子句中会用到的指令。基本上, LIKE  能让我们依据一个模式(pattern) 来找出我们要的资料。语法为:
    SELECT "栏位名"  FROM "表格名"  WHERE "栏位名" LIKE {模式} 
    8)ORDER BY
    我们经常需要能够将抓出的资料做一个有系统的显示。这可能是由小往大 (ascending)  或是由大往小(descending)。在这种情况下,我们就可以运用 ORDER BY 这个指令来达到我们的目的。语法为:
    SELECT "栏位名"  FROM "表格名 [WHERE "条件"] ORDER BY "栏位名" [ASC, DESC] 
    9)函数
    函数允许我们能够对这些数字的型态存在的行或者列做运算,包括 AVG (平均)、COUNT (计数)、MAX (最大值)、MIN (最小值)、SUM (总合)。语法为:
    SELECT "函数名"("栏位名") FROM "表格名"  
    10)COUNT
    这个关键词能够帮我我们统计有多少笔资料被选出来,语法为:
    SELECT COUNT("栏位名") FROM "表格名"
    11)GROUP BY
    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。语法为:
    SELECT "栏位1", SUM("栏位2")  FROM "表格名"  GROUP BY "栏位1" 
    12)HAVING
    该关键词可以帮助我们对函数产生的值来设定条件。语法为:
    SELECT "栏位1", SUM("栏位2")  FROM "表格名"  GROUP BY "栏位1"  HAVING (函数条件)  
    13)ALIAS
    我们可以通过ALIAS为列名称和表名称指定别名,语法为:
    SELECT "表格别名"."栏位1" "栏位别名"  FROM "表格名" "表格别名"  
    
    下面为一个例子,通过它我们应该能很好地掌握以上关键词的使用方法。
    
    
    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、查询所有课程成绩小于60分的同学的学号、姓名;
    select S#,Sname
    from Student
    where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
    
    9、查询没有学全所有课的同学的学号、姓名;
    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);
    
    10、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
    select S#,Sname
    from Student,SC
    where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');
    
    11、删除学习“叶平”老师课的SC表记录;
    Delect SC
    from course ,Teacher
    where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';
    
    12、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
    SELECT L.C# 课程ID,L.score 最高分,R.score 最低分
    FROM SC L ,SC R
    WHERE L.C# = R.C#
    and
    L.score = (SELECT MAX(IL.score)
    FROM SC IL,Student IM
    WHERE IL.C# = L.C# and IM.S#=IL.S#
    GROUP BY IL.C#)
    and
    R.Score = (SELECT MIN(IR.score)
    FROM SC IR
    WHERE IR.C# = R.C#
    GROUP BY IR.C# );
    
    13、查询学生平均成绩及其名次
    SELECT 1+(SELECT COUNT( distinct 平均成绩)
    FROM (SELECT S#,AVG(score) 平均成绩
    FROM SC
    GROUP BY S# ) T1
    WHERE 平均成绩 > T2.平均成绩) 名次, S# 学生学号,平均成绩
    FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) T2
    ORDER BY 平均成绩 desc;
    
    14、查询各科成绩前三名的记录:(不考虑成绩并列情况)
    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#;
    
    15、查询每门功成绩最好的前两名
    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#;
  • 相关阅读:
    【BZOJ 1598】 牛跑步
    【SDOI 2010】 魔法猪学院
    【POJ 2449】 Remmarguts' Date
    【HDU 3085】 Nightmare Ⅱ
    【POJ 3635】 Full Tank
    【POJ 2230】 Watchcow
    USB设备驱动总结
    经典SQL语句大全
    float型数据与字节数组的转化
    linux下dmesg命令详解
  • 原文地址:https://www.cnblogs.com/jiangyi-uestc/p/5887245.html
Copyright © 2011-2022 走看看