SQL基础之数据的查询

Posted chenloveslife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL基础之数据的查询相关的知识,希望对你有一定的参考价值。

一、数据查询的一般格式:

  SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
  [INTO 新表名]
  FROM <表名或视图名>[, <表名或视图名> ] …
  [ WHERE <条件表达式> ]
  [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
  [ ORDER BY <列名2> [ ASC|DESC ] ]; 

 

二、单表查询

  1. 查询指定列与计算的值

    (1) 查询指定列:只需在SELECT子句中加入要查询指定列字段即可,有时会根据题意要求去从,那么得在字段前添加DISTINCT关键字。

 

SELECT DISTINCT  Sno
FROM SC; 

 

    (2) 查询经过计算的值:在SELECT子句中的目标列表达式可以为如下:

  •  算术表达式

  •    字符串常量

  •    函数

  •    列的别名

 

SELECT Sname,2009-Sage  --查询算术表达式结果
FROM Student;

SELECT Sname,Year of Birth:    --查询字符串常量
FROM Student;

SELECT Sname,LOWER(Sdept)    --查询经过函数处理的字段信息结果
FROM Student;

--查询结果为列的信息,不过视图上列名为别名
SELECT Sname AS NAME,’Year of Birth: ’ AS BIRTH    
FROM Student;

 

  2. 查询满足条件的元组

    (1) 比较大小

    查询谓词:=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符

 

SELECT COUNT(Jno) AS 项目总数 FROM SPJ WHERE Sno = S1;

 

    (2) 确认范围:

    查询谓词:BETWEEN AND,NOT BETWEEN AND

 

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23

 

    (3) 确认集合:

    查询谓词:IN ,  NOT IN    

 

SELECT Sname,Ssex
FROM  Student
WHERE Sdept IN ( ISMACS );

 

    (4) 字符匹配

    查询谓词:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]

    匹配串为含通配符的字符串
    %:代表任意长度(长度可以为0)的字符串
    _:代表单个字符

 

--查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE  Sname LIKE 刘%--查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname
FROM   Student
WHERE  Sname LIKE 欧阳_

 

    使用换码字符ESCAPE将通配符转义为普通字符

 

--查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT  *
FROM   Course
WHERE  Cname LIKE  DB\\_%i_ _ 
ESCAPE  \\ ‘;

 

    (5) 空值查询

    查询谓词:IS NULL 或 IS NOT NULL

 

SELECT Sno,Cno
FROM  SC
WHERE  Grade IS NULL

 

    (6) 多重条件查询

    查询谓词:AND和OR来联结多个查询条件,其中查询条件又可包含上述的查询条件。

 

SELECT Sname
FROM  Student
WHERE Sdept= CS AND Sage<20

 

   3. ORDER BY ... DESC/ASC (缺省值为升序)

    表示对查询结果的升降序显示,ASC为升序,DESC为降序。

 

SELECT Sno,Grade
FROM  SC
WHERE  Cno=  3 
ORDER BY Grade DESC

 

    注意: 

      当排序列含空值时,ASC:排序列为空值的元组最后显示,DESC:排序列为空值的元组最先显示。

      ORDER BY 不能在子查询中使用,由于ORDER BY是对查询结果的排序。

  4. GROUP BY ... HAVING ...    

    其作用对象是查询的中间结果表,最终结果表为按指定条件对查询结果的分组结果。

    GROUP BY后为分组依据(字段名),被指定的一列或多列值分组,值相等的为一组;HAVING后多为聚合函数满足条件,聚合函数将会分别作用于前面根据分组依据分完组的每个组。

 

/*查询供应了3个以上项目的供应商代码和供应的项目总数。*/
SELECT Sno, COUNT(DISTINCT Jno) AS 项目总数 
FROM SPJ 
GROUP BY Sno 
HAVING COUNT(DISTINCT Jno) > 3;

 

    注意:

 

     使用Group By子句后,Select子句的字段列表达式只能是分组依据和聚集函数

 

 

       HAVING短语与WHERE子句的主要区别是作用对象不同,其中WHERE子句作用于基表或视图,从中选择满足条件的元组,而HAVING短语作用于组,从中选择满足条件的组

 

  5. 聚合函数

  计数:
  COUNT([DISTINCT|ALL] *)
  COUNT([DISTINCT|ALL] <列名>)
  计算总和:
  SUM([DISTINCT|ALL] <列名>)
  计算平均值:
  AVG([DISTINCT|ALL] <列名>)
  最大最小值:
  MAX([DISTINCT|ALL] <列名>)
  MIN([DISTINCT|ALL] <列名>)

 

SELECT COUNT(Jno) AS 项目总数 
FROM SPJ 
WHERE Sno = S1;

 

  注意:只能在SELECT子句中或HAVING后使用。

三、连接查询

  连接查询为多表查询,即把要查询的记录在两个表中,那么就要连接两表来查询。其中包含连接谓词:用来连接两个表的条件,必须要求连接字段数据类型是可比的,

  例如:SELECT SUM(Ccredit) FROM SC, Course WHERE Sno=‘200215122‘ AND SC.Cno=Course.Cno。

  3种类型的连接查询执行过程:

    嵌套循环法(NESTED-LOOP)

    排序合并法(SORT-MERGE)

    常用于=连接索引连接(INDEX-JOIN)

  1. 等值与非等值查询

  等值连接运算符:=

  非等值连接运算符:!=

 

SELECT  *
FROM     Student,SC
WHERE  Student.Sno = SC.Sno;
SELECT  *
FROM     Student,SC
WHERE  Student.Sno != SC.Sno;

 

  自然连接则为在等值连接的基础上消除重复的列

 

SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM     Student,SC
WHERE  Student.Sno = SC.Sno;
SELECT  Student.Sno,sc.sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM     Student,SC
WHERE  Student.Sno != SC.Sno;

 

  2. 自身连接

  一个表和其自身表连接,注意必须给表起别名加以区分不同表的属性,否则sql引擎识别不出你要指定的属性,会报错。

 

--查询每门课程的有先修课程的课程名
SELECT  FIRST.Cno,SECOND.Cpno   
FROM  Course  FIRST,Course  SECOND  
WHERE FIRST.Cpno = SECOND.Cno;

 

  3. 外连接

  这里根据内连接与外连接的区别来讲解外连接:

  (1) 内联接:(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。     
    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。   
  (2) 外联接:外联接可以是左向外联接、右向外联接或完整外部联接。     

    在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     
    1)LEFT  JOIN或LEFT OUTER JOIN     
    左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       
    2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN     
    右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。       
    3)FULL  JOIN 或 FULL OUTER JOIN
    完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。   

 

/*查询每个学生及其选修课程的情况*/
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM  Student  INNER JOIN SC
ON   Student.Sno=SC.Sno; 
--结果集合种不包括未选修课的学生


/*查询所有学生的选修课程的情况*/
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM  Student LEFT OUTER  JOIN SC    
ON Student.Sno=SC.Sno;
--结果集种没有选课的学生也包含在内,Cno和Grade字段显示为null

 

  4. 多表查询

 

/*查询每个学生的学号、姓名、选修的课程名及成绩*/
SELECT Student.Sno,Sname,Cname,Grade
FROM  Student,SC,Course 
WHERE Student.Sno = SC.Sno 
AND SC.Cno = Course.Cno;

 

 

四、嵌套查询

技术分享图片

 


























以上是关于SQL基础之数据的查询的主要内容,如果未能解决你的问题,请参考以下文章

数据库基础篇—— SQL之数据查询

SQL基础之XML

数据库基础篇(二)—— SQL之数据查询

SQL基础之数据的查询

T-SQL基础之简单查询

SQL 基础之使用子查询检索数据(二十二)