首页 > 代码库 > 数据库查询

数据库查询

数据库查询:
1.语法格式:
SELECT <select_list>                      /*指定要选择的列或行及其限定*/
FROM  <table_source>                  /*FROM子句,指定表或视图*/
[ WHERE  <search_condition> ]    /*WHERE子句,指定查询条件*/
[ GROUP BY <group_by_expression> ] /*GROUP BY子句,指定分组表达式*/
[ HAVING <search_condition> ]     /*HAVING子句,指定分组统计条件*/
[ ORDER BY <order_expression> [ ASC | DESC ]] 
/*ORDER子句,指定排序表达式和顺序*/


2.查询子句&相关逻辑
FROM子句:指定要查询的表名,以及对这些表进行操作的表运算符;
WHERE子句:指定一个谓词或逻辑表达式,从而过滤从FROM阶段返回的行;
GROUP BY子句:讲前面逻辑查询处理阶段返回的行按“组”进行组合,每个组由在GROUP BY子句中指定的元素决定;
HAVING子句:指定对组进行过滤的谓词或逻辑表达式,与WHERE阶段对单独的行进行过滤想对应;
SELECT子句:用于指定需要在查询返回的结果集中包含的属性(列),其中SELECT列表中的表达式可以直接基于正在查询的表的各个列;
       ORDER BY子句:用于展示数据时对输出结果中的行进   行排序。



3.列查询
1. 选择一个表中指定的列
使用SELECT语句选择一个表中的某些列,各列名之间要以逗号分隔。
例:查询XSCJ数据库的XS表中各个同学的姓名、专业名和总学分。

SELECT 姓名,专业名,总学分
FROM XS

例:查询XS表中计算机专业同学的学号、姓名和总学分。查询XS表中的所有列。
SELECT 学号,姓名,总学分
FROM XS
WHERE 专业名= 计算机

SELECT *
    FROM XS

当在SELECT语句指定列的位置上使用*号时,表示选择表的所有列。

2. 修改查询结果中的列标题
当希望查询结果中的某些列或所有列显示时使用自己选择的列标题时,可以在列名之后使用AS子句来更改查询结果的列标题名。
例:查询XS表中计算机系同学的学号、姓名和总学分,结果中各列的标题分别指定为number、name和mark。
实现方式1:
SELECT 学号 AS number, 姓名 AS name, 总学分 AS mark
FROM XS
WHERE 专业名= 计算机
实现方式2:
SELECT  学号 number,姓名 name,总学分 mark
FROM XS
WHERE 专业名= 计算机
3. 计算列值
例:按120分计算成绩显示。
SELECT  学号, 课程号, 
成绩*1.20 AS 成绩120
FROM XS_KC
4. 消除结果集中的重复行
对表只选择其某些列时,可能会出现重复行。其格式是:
SELECT DISTINCT column_name [ , column_name…]
关键字DISTINCT的含义是对结果集中的重复行只选择一个,保证行的唯一性。
例:对XSCJ数据库的XS表只选择专业名和总学分,消除结果集中的重复行。
SELECT DISTINCT 专业名,总学分
FROM XS
6. 限制结果集返回行数
例:对XSCJ数据库的XS表选择姓名、专业名和总学分,只返回结果集的前6行。
SELECT 姓名,专业名,总学分
FROM XS LIMIT 0,6



4.设定查询条件
WHERE <search_condition>
其中: search_condition为查询条件。
1. 表达式比较
比较运算符用于比较两个表达式值,共有7个,分别是: =(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<>(不等于)、!=(不等于)。
例:查询XSCJ数据库XS表中通信工程专业总学分大于等于42的同学的情况。
SELECT *
FROM XS
WHERE 专业名 = 通信工程 and 总学分 >=  42
2. 模式匹配
LIKE谓词用于指出一个字符串是否与指定的字符串相匹配返回逻辑值TRUE或FALSE。LIKE谓词表达式的格式为:
string_expression [ NOT ] LIKE string_expression,其中
%:表示任意个或多个字符。可匹配任意类型和长度的字符。
_:表示任意单个字符。它常用来限制表达式的字符长度语句:(可以代表一个中文字符)
例:查询XSCJ数据库XS表中计算机系的学生情况。查询XSCJ数据库XS表中姓“王”且单名的学生情况。
SELECT *
FROM XS
WHERE 专业名 LIKE 计算机

SELECT *
FROM XS
WHERE 姓名 LIKE 王_
3. 范围比较
用于范围比较的关键字有两个:BETWEEN和IN。
当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围,格式为:
expression [ NOT ] BETWEEN expression1 AND expression2
例:查询XSCJ数据库XS表中不在1979年出生的学生情况。查询XSCJ数据库XS表中专业名为“计算机”或“通信工程”或“无线电”的学生的情况。

SELECT *
FROM XS
WHERE 出生时间 NOT BETWEEN 1979-1-1 and 1979-12-31

SELECT *
FROM XS
WHERE 专业名 IN  (计算机, 通信工程, 无线电)

SELECT *
FROM XS
WHERE 专业名 = 计算机 or 专业名 = 通信工程 or 专业名 = 无线电
4. 空值比较
当需要判定一个表达式的值是否为空值时,使用IS NULL关键字,格式为:
expression IS [ NOT ] NULL
当不使用NOT时,若表达式expression的值为空值,返回TRUE,否则返回FALSE;当使用NOT时,结果刚好相反。

例:查询XSCJ数据库中总学分尚不确定的学生情况。
SELECT *
FROM XS
WHERE 总学分 IS NULL
5.子查询通常与IN、EXIST谓词及比较运算符结合使用。
(1)IN子查询
IN子查询用于进行一个给定值是否在子查询结果集中的判断,格式为:
expression [ NOT ] IN  ( subquery )
其中subquery是子查询。 
例:在XSCJ数据库中有描述课程情况的表KC和描述学生成绩表的表XS_KC。要查找选修了课程号为101的课程的学生的情况:
SELECT * 
FROM XS
WHERE 学号 IN
( SELECT 学号 FROM XS_KC  WHERE 课程号 = 101 )
注意IN和NOT IN子查询只能返回一列数据。
例:查找未选修离散数学的学生的情况。
SELECT * 
FROM XS
WHERE 学号 NOT IN
      ( SELECT 学号
        FROM XS_KC
        WHERE 课程号 IN
            ( SELECT 课程号
                FROM KC
                WHERE  课程名 = 离散数学 
        )
    )
(2)比较子查询
这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算。
语法格式为:
expression { < | <= | = | > | >= | != | <> } { ALL | SOME | ANY } ( subquery )
例:查找比所有计算机系的学生年龄都大的学生。
SELECT * 
FROM XS
WHERE  出生时间 <ALL
    ( SELECT 出生时间
        FROM XS
        WHERE 专业名 = 计算机
    )
例:找出选修了课程206,并且其该门课程成绩不低于101课程的最低成绩的学生学号。
SELECT 学号 
FROM XS_KC
WHERE 课程号 = 206 AND 成绩 >= ANY 
        ( SELECT 成绩
                          FROM XS_KC
                          WHERE 课程号 = 101
         )
(3)EXISTS子查询
EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXIST刚好相反。
语法格式为:
[ NOT ] EXISTS ( subquery )
例:查找选修206号课程的学生姓名。
SELECT 姓名
FROM XS
WHERE EXISTS
  ( SELECT *
         FROM XS_KC
         WHERE 学号 = XS.学号 AND 课程号 = 206 
    )
例:查找选修了全部课程的同学的姓名。

SELECT 姓名
   FROM XS
   WHERE NOT EXISTS
      (    SELECT *
          FROM KC
            WHERE NOT EXISTS
            ( SELECT *
                  FROM XS_KC
                  WHERE 学号=XS.学号 AND 课程号=KC.课程号
             )
      )
本例即查找没有一门功课不选修的学生。



6.SELECT的查询对象由FROM子句指定,其格式为:
[ FROM {<table_source>} [,…n] ]
其中table_source指出了要查询的表或视图。
1. 连接谓词
可以在SELECT语句的WHERE子句中使用比较运算符给出连接条件对表进行连接,将这种表示形式称为连接谓词表示形式。
例:查找XSCJ数据库每个学生的情况以及选修的课程情况。
SELECT XS.* , XS_KC.*
       FROM XS , XS_KC
       WHERE XS.学号 = XS_KC.学号
2. 以JOIN关键字指定的连接
FROM子句的joined_table表示将多个表连接起来。
<joined_table>::=
<table_source> <join_type> <table_source> ON <search_condition>
 | <table_source> CROSS JOIN <table_source>
 | <joined_table>
例:查找XSCJ数据库每个学生的情况以及选修的课程情况。
SELECT *
    FROM XS INNER JOIN XS_KC 
   ON XS.学号 = XS_KC.学号
(2) 外连接
外连接包括三种:
  左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行;
  右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行;
  完全外连接(FULL OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。
例:查找所有学生情况,及他们选修的课程号,若学生未选修任何课,也要包括其情况。
SELECT XS.* , 课程号
   FROM XS LEFT OUTER JOIN XS_KC ON XS.学号 = XS_KC.学号
(3) 交叉连接
交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每行与第二个表的每一行拼接后形成的表,因此结果表的行数等于两个表行数之积。

例:列出学生所有可能的选课情况。
SELECT 学号,姓名,课程号,课程名
       FROM XS CROSS JOIN KC
1. 聚合函数
(1)SUM和AVG
SUM和AVG分别用于求表达式中所有值项的总和与平均值,语法格式为:
SUM / AVG ( [ ALL | DISTINCT ] expression )
例:求选修101课程的学生的平均成绩。
SELECT AVG(成绩) AS 课程101平均成绩
   FROM XS_KC   
   WHERE 课程号 = 1012)MAX和MIN
MAX和MIN分别用于求表达式中所有值项的最大值与最小值,语法格式为:
MAX / MIN ( [ ALL | DISTINCT ] expression )
例:求选修101课程的学生的最高分和最低分。
SELECT MAX(成绩) AS 课程101的最高分 , MIN(成绩)       AS 课程101的最低分
   FROM XS_KC   
   WHERE 课程号 = 1013COUNT
COUNT用于统计组中满足条件的行数或总行数,格式为:
COUNT ( { [ ALL | DISTINCT ] expression } | * )
例:求学生的总人数。
SELECT COUNT(*) AS 学生总数
       FROM XS
注:COUNT(*) 不需要任何参数。
3. HAVING子句
使用GROUP BY子句和聚合函数对数据进行分组后,还可以使用HAVING子句对分组数据进行进一步的筛选。 
例:查找XSCJ数据库中平均成绩在85分以上的学生的学号和平均成绩。
SELECT 学号 , AVG(成绩) AS 平均成绩
       FROM XS_KC
       GROUP BY 学号
       HAVING AVG(成绩) >=85




7.排序
例:将计算机专业的学生按出生时间先后排序。
SELECT *
   FROM XS
   WHERE 专业名 = 计算机
   ORDER BY 出生时间
2. UNION子句
使用UNION子句可以将两个或多个SELECT查询的结果合并成一个结果集,其格式为:
{ <query specification> | (<query expression> ) }
  UNION [ ALL ] <query specification> | (<query expression> )
  [ UNION [ ALL ] <query specification> | (<query expression> ) […n] ]
其中query specification和query expression都是SELECT查询语句。
使用 UNION 组合两个查询的结果集的基本规则是: 
① 所有查询中的列数和列的顺序必须相同。
② 数据类型必须兼容。 
例:设在XSCJ数据库中建两个表:数学系学生、外语系学生,表结构与XS表相同,两个表分别存储数学系和外语系的学生情况,下列语句将这两个表的数据与XS表中的数据进行合并查询。
SELECT *
   FROM XS
   UNION ALL
   SELECT *
      FROM 数学系学生
   UNION ALL
   SELECT *
      FROM 外语系学生

 

数据库查询