数据库查询

来源:互联网 发布:c语言库函数查询工具 编辑:程序博客网 时间:2024/05/19 23:25

简单的select语句

Select语句的统计功能

Select语句中的多表连接

子查询

Select语句可以从数据库中按照用户的要求检索数据,并将查询结果以表格的形式输出。

Select具有的功能:数据查询、统计、分组、排序

三个表

StudentsnosnameSsexSageSdept

Coursecnocnamecpno(先修课)、Ccredit

Scsnocnograde

 

基本的select语句

1、查询所有的列:select * from student

2、查询表中指定的列:select snosname from student

  消除值相同的行:distinct

查询选修了课程的学生的学号 select distinct sno from s

使用top [percent]返回前几行数据:

Select  top 7   *   from student

3、改变查询结果的列标题

对使用别名的操作有三种方式

(1)“列明 别名”

(2)“列名 as ‘别名’”

(3)“‘别名’=列名”

 

4、单引号的用处

使用单引号加入字符

Select aname,‘学号为:’,sno from  s

 

Where子句

1、使用where来限定查询条件(给出限制查询的范围)

Where子句中的条件表达式

类别

运算符

说明

比较

=、>、<、<=、>=、<>、!=

比较两个表达式

逻辑

And、or、not

组合两个表达式的运算结果

或取反

范围

Between、not between

搜索值是否在范围内

列表运算符

In、not in

查询值是否属于列表值之一

字符运算符

Like、not like

字符串是否匹配

未知值

Is null、is not null

查询值是否为null

1、从学生表s中查询学号为“101”学生的学号和姓名

     Select snosname from s where sno=101

 

2、从课程表c中查询课程名为“数据结构”而且学分为6分的课程信息

     Select * from c where cname=‘数据结构’and credit=6

 

3、从成绩表sc中查询成绩在7080之间的信息(betweennot

 

 

2、int子句给出列值范围

 

如果需要确定表达式的取值是否是属于某一列表值之一,可以用关键字innot in来限定查询条件

4、从课程表course中查询课程编号为010203的课程信息(innot

     select * from course 

     where cno in ('01','02','03')

3、使用like 实现模糊查询(字符串是否匹配)

通配符

含义

%

任意多个字符

_(下划线)

单个字符

 

格式:    [not] like <匹配串>[Escape<换码字符>]

 

5:查询学号为’101’学生的详细情况

        Select * from s where sno like '101'

      如果like匹配串中不含通配符,可以用 代替

       等价于   Select * from s where sno ='101'

 

6、从学生表s中查询姓 李 的同学的的学号和姓名(likenot like

 select snamesno from s where sname like '%'

 

7、查询姓‘欧阳’,且全名为3个汉字的学生的学号和姓名

Select sname from s where sname like’欧阳_ _

如果用户要查询的字符串本身就含有通配符%_,这时候就需要使用Escape

 

8、查询以‘DB_’开头,且倒数第三个字符为i的课程的详细信息

     Select * from course 

     Where cname like DB\_%i_ _Escape\

      

    匹配串是‘DB\_%i_ _’  \换码字符,先转义成普通的‘_’字符,

    后边的_ _,仍作为通配符,Escape\’,表示\为转码字符

 

 

涉及空值的查询

 

[]  某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。(is nullis not null

select snocno from sc 

where grade is null

多重条件查询

逻辑运算符:AND和 OR来联结多个查询条件

[]  查询计算机系年龄在20岁以下的学生姓名。

     SELECT Sname FROM  Student

      WHERE Sdept= 'CS' AND Sage<20

[]  查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

SELECT SnameSsex

FROM Student

WHERE Sdept IN ( 'IS''MA''CS' )

可改写为:

SELECT SnameSsex

FROM   Student

WHERE  Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS '

4、使用order by 子句

对查询结果进行排序,要在排序的列名后使用关键字Asc(缺省)或者Desc(降序)

当排序列含空值时

ASC:排序列为空值的元组最后显示

DESC:排序列为空值的元组最先显示

 []、把成绩表sc的信息按成绩由高到低排序

  select  snocnograde  from  sc 

  order  by  grade  desc

 

Order by 子句可以指定多个列

[]、从课程c表中查询任课教师、课程号、课程名,要求查询结果首先按照教师名降序排序,教师名一样的,则按课程号升序排序

  select  teacher,cno,cname  from  c

  order  by  teacher  desc,cno

Select语句的统计功能

5、使用聚合函数

   聚合函数是对一组值执行计算并返回单一的值

常用的一些聚合函数:count(返回组中项目的数量,返回值为int类型)、

  avgsummaxminvar(统计方差)

计数:COUNT[DISTINCT|ALL] *

COUNT[DISTINCT|ALL] <列名>

 

[]、统计学生表s中学生人数

select  countsnoas 总人数 from s

例、查询sc表中grade的最大值、最小值、总和和平均值

使用group by子句(分组统计语句)

group by 显示分组的汇总数据

[]  求各个课程号及相应的选课人数。

   SELECT CnoCOUNT(Sno) FROM SC GROUP BY Cno

   查询过程:按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求得每组的学生人数。

[]查询选修了3门以上课程的学生学号。

 select sno from SC 

 group by Sno 

 having  COUNT(*) >3

Having用法与where用法类似

不同:

        having只用于group by

        having短语作用于组,从中选择满足条件的组。

         having可以使用聚合函数,而where不能

         where是用于在初始表中筛选结果

当同时含有where子句、group by子句、having子句及聚合函数时,执行顺序:执行where子句查找符合条件的数据,使用group by子句对数据进行分组,使用having子句进一步筛选不符合条件的组

 连接查询

连接查询:同时涉及多个表的查询

[]  查询每个学生及其选修课程的情况

              SELECT  Student.*SC.*  FROM     StudentSC

              WHERE  Student.Sno = SC.Sno

等价于:

  SELECT  Student.SnoSnameSsexSageSdeptCnoGrade

  FROM     StudentSC

  WHERE  Student.Sno = SC.Sno

自身连接:一个表与其自己进行连接

需要给表起别名以示区别

由于所有属性名都是同名属性,因此必须使用别名前缀

[]查询每一门课的间接先修课(即先修课的先修课)

    SELECT  a.Cnob.Cpno

     FROM  Course  aCourse  b

     WHERE a.Cpno = b.Cno

 

 

 

 

 

复合条件连接:WHERE子句中含多个连接条件

 

[]查询选修2号课程且成绩在90分以上的所有学生

SELECT Student.Sno, Sname

FROM    Student, SC

WHERE Student.Sno = SC.Sno AND   SC.Cno= 2’ AND SC.Grade > 90;       

                      /* 连接谓词*/                 /* 其他限定条件 */

 

 []查询每个学生的学号、姓名、选修的课程名及成绩

SELECT Student.SnoSnameCnameGrade

FROM    StudentSCCourse    /*多表连接*/

WHERE Student.Sno = SC.Sno 

                and SC.Cno = Course.Cno

子查询

一个select……from……where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或者having短语中的查村成为嵌套查询或子查询

查询过程:首先执行内部查询,传递给外层语句,并作为外层语句的查询条件来使用

通常子查询的结果是一个集合

【例子】查询与“刘晨”在同一个系学习的学生。此查询要求可以分步来完成

    ① 确定“刘晨”所在系名             

        SELECT  Sdept  FROM  Student                            

         WHERE  Sname= '刘晨 '

    结果为: CS

   ② 查找所有在CS系学习的学生。    

        SELECT   SnoSnameSdept     

        FROM   Student                 

        WHERE  Sdept= 'CS '

 

 

将第一步查询嵌入到第二步查询的条件中

    SELECT SnoSnameSdept

    FROM Student

    WHERE Sdept  IN

                  (SELECT Sdept

                   FROM Student

                   WHERE Sname= ‘ 刘晨 ’)

查询选修了课程名为“信息系统”的学生学号和姓名

  SELECT SnoSname                     ③ 最后在Student关系中

   FROM    Student                              取出SnoSname

  WHERE Sno  IN

          (SELECT Sno                          ② 然后在SC关系中找出选

            FROM    SC                            修了3号课程的学生学号

            WHERE  Cno IN

                  (SELECT Cno                                        

                                                ① 首先在Course关系中找出

                    FROM Course                                       

                                         “信息系统”的课程号,为3

                    WHERE Cname= ‘信息系统’

                   )

             )

studentsnosnamessexsagesdept

coursecnocnamecproccredit

scsnocnograde

用连接查询实现

     SELECT SnoSname

      FROM    StudentSCCourse

      WHERE Student.Sno = SC.Sno  AND

                     SC.Cno = Course.Cno AND

                     Course.Cname=‘信息系统’;

0 0