数据查询

语句格式

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

SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
HAVING短语:筛选出只有满足指定条件的组
ORDER BY子句:对查询结果表按指定列值的升序或降序排序

示例数据库

学生表:
      Student(Sno,Sname,Ssex,Sage,Sdept)
课程表:
      Course(Cno,Cname,Cpno,Ccredit)
选课表:
      SC(Sno,Cno,Grade)

1.单表查询

查询仅涉及一个表,是一种最简单的查询操作
一、选择表中的若干列
二、选择表中的若干元组
三、对查询结果排序
四、使用集函数
五、对查询结果分组

一、选择表中的若干列

1查询指定列

[例1]  查询全体学生的学号与姓名。

SELECT Sno,Sname
FROM Student;

[例2]  查询全体学生的姓名、学号、所在系。

SELECT Sname,Sno,Sdept
FROM Student;

语句不分大小写,一般分行写,分号可不写

2查询全部列

[例3]  查询全体学生的详细记录。

SELECT  Sno,Sname,Ssex,Sage,Sdept
FROM Student;

SELECT *
FROM Student;

3. 查询经过计算的值

[例4]  查全体学生的姓名及其出生年份。

SELECT Sname,-Sage
FROM Student;

输出结果:
              Sname   2015-Sage
             ---------    -------------
               李勇       1986
               刘晨       1987
               王名       1988
               张立       1988

[例5]  查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。

SELECT Sname,'Year of Birth: ',- Sage, ISLOWER(Sdept)
FROM Student;

字符串常量用单引号

输出结果:
    Sname     'Year of Birth:'      2015-Sage   ISLOWER(Sdept)
   -------  ------------  -------  -----------
      李勇    Year of Birth:    1986       cs
       刘晨    Year of Birth:    1987       is
       王名    Year of Birth:    1988       ma
       张立    Year of Birth:    1987       is

ISLOWER是ORACLE的函数名
SQL-SERVER的函数名是LOWER

SELECT Sname,'Year of Birth: ', -Sage, LOWER(Sdept)
FROM Student;

[例5.1] 使用列别名(可选)改变查询结果的列标题

SELECT Sname  NAME,'Year of Birth: '  BIRTH,
-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;

输出结果:
     NAME    BIRTH                  BIRTHDAY   DEPARTMENT
   -------  ----------------    ----------  -------------
     李勇    Year of Birth:    1986           cs
     刘晨    Year of Birth:    1987           is
     王名    Year of Birth:    1988           ma
     张立    Year of Birth:    1987           is

二、选择表中的若干元组

1. 消除取值重复的行

在SELECT子句中使用DISTINCT短语
假设SC表中有下列数据   
    Sno       Cno       Grade
              -------    -------     -------
              95001       1         92
              95001       2         85
              95001       3         88
              95002       2         90
              95002       3         80

[例6]  查询选修了课程的学生学号。
(1)

 SELECT Sno
FROM SC;

结果:   Sno   
              -------
              95001  
              95001  
              95001  
              95002  
              95002
(2)

SELECT DISTINCT Sno
FROM SC;

结果:
              Sno   
              -------
              95001  
              95002

2.查询满足条件的元组

(1) 比较大小
在WHERE子句的<比较条件>中使用比较运算符
=,>,<,>=,<=,!= 或 <>,!>,!<,
逻辑运算符NOT

[例8]  查询所有年龄在20岁以下的学生姓名及其年龄。

SELECT Sname,Sage
FROM Student
WHERE Sage < ;

[例]  查询计算机系的学生姓名及其年龄。

SELECT Sname,Sage
FROM Student
WHERE Sdept='CS';

(2) 确定范围

使用谓词   BETWEEN …  AND  …
                        NOT BETWEEN  …  AND  …

[例10]  查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN AND ;

[例11]  查询年龄不在20~23岁之间的学生姓名、系别和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN AND ;

(3) 确定集合

使用谓词     IN (值表),  NOT IN (值表)
          值表:用逗号分隔的一组取值

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

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );

[例13]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。

SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' );

(4) 字符串匹配

[NOT] LIKE  ‘<匹配串>’
<匹配串>:含精确匹配字符和通配符
      
模糊匹配---通配符

% (百分号)  代表任意长度(长度可以为0)的字符串
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
_ (下横线)  代表任意单个字符
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串

1) 匹配串为固定字符串

[例14]  查询姓名为'刘晨'学生的详细情况。

     SELECT *
FROM Student
WHERE Sname LIKE '刘晨';
等价于:
SELECT *
FROM Student
WHERE Sname = '刘晨';

2) 匹配串为含通配符的字符串

[例15]  查询所有姓刘学生的姓名、学号和性别。

   SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';

[例16]  查询姓"欧阳"且全名为三个字的学生的姓名。

 SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';

[例17]  查询名字中第2个字为‘阳’字的学生的姓名和学号。

     SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_阳%';

[例18]  查询所有不姓刘的学生姓名。

  SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';

(5) 涉及空值的查询

使用谓词 IS NULL 或 IS NOT NULL
 “IS NULL” 不能用 “= NULL” 代替

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

   SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;

[例22]  查所有有成绩的学生学号和课程号。

   SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

(6) 多重条件查询

用逻辑运算符AND和 OR来联结多个查询条件
 AND的优先级高于OR
 
[例23]  查询计算机系年龄在20岁以下的学生姓名。

SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<;

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

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' )

可改写为:

SELECT Sname,Ssex
FROM Student
WHERE Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS ';

改写[例10]
[例10]  查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。    

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN AND ;

可改写为:

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage>= AND Sage<=;

三、对查询结果排序

使用ORDER BY子句
 可以按一个或多个属性列排序
 升序:ASC;(缺省)
 降序:DESC;
 

[例24]  查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。

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

[例25]  查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

    SELECT  *
FROM Student
ORDER BY Sdept,Sage DESC;

四、使用集函数

5类主要集函数
1. 行计数COUNT
2. 计算总和SUM    
3. 计算平均值AVG
4. 求最大值 MAX     
5. 求最小值MIN

行计数的两种形式
(1) COUNT(*)
      对每行计数
 

[例26]  查询学生总人数。

  SELECT COUNT(*)
FROM Student;

查询计算机系的学生人数

    SELECT COUNT(*)
FROM Student
WHERE SDEPT=‘CS’

查询1号课不及格人数

    SELECT COUNT(*)
FROM SC
WHERE CNO= AND GRADE<

(2)COUNT( <列名> )
对<列名>非空的行计数
COUNT( [DISTINCT|ALL] <列名> )
       DISTINCT:计数时要先取消指定列中的重复值
       ALL:不取消重复值,ALL为缺省值

[例27]  查询选修了课程的学生人数。

SELECT COUNT(DISTINCT Sno)
FROM SC;

注:对Sno非空的行,排除重复Sno计数。
       以避免重复计算学生人数

有什么区别?

()    
SELECT COUNT(*)
FROM SC;
对SC每行计数 ()
SELECT COUNT(Sno)
FROM SC;
Sno非空行计数,因Sno为主属性,所以与(1)相同 ()
SELECT COUNT(DISTINCT Sno)
FROM SC;
SNO去重复行计数

()
SELECT COUNT(Grade)
FROM SC;
GRADE非空行计数

[例28]  计算1号课程的学生平均成绩。

SELECT AVG(Grade)
FROM SC
WHERE Cno= ' 1 ';

(成绩为null的行不参与计算)

[例29]  查询选修1号课程的学生最高分数。

SELECT MAX(Grade)
FROM SC
WHER Cno= ' 1 ';

[例]  计算1号课程的平均成绩,最高分,最低分,选课人数

 SELECT AVG(Grade), MAX(Grade),MIN(Grade), COUNT(*)
FROM SC
WHERE Cno= ' 1 ';

五、对查询结果分组

使用GROUP BY子句分组     
细化集函数的作用对象
 未对查询结果分组,集函数将作用于整个查询结果
 对查询结果分组后,集函数将分别作用于每个组

分组后的聚集函数将作用于每一个组,即每一个组都有一个函数值

同时这个分组是先进行的排序,这也是为什么分组后的结果是按照顺序排列的。

使用GROUP BY子句分组

[例30]  求各个课程号及相应的选课人数,平均成绩。

SELECT Cno,COUNT(*),AVG(Grade)
FROM SC
GROUP BY Cno;

结果
             Cno        COUNT(*)    AVG(Grade)
             1             22                    75
             2             34                    80
             3             44                    78

易犯错误:

SELECT Sno, Cno, COUNT(*),AVG(Grade)--在统计查询中,这里只允许有分组属性和集函数
FROM SC
GROUP BY Cno;

[例30]  求各个课程号及相应的选课人数,平均成绩。

SELECT Cno,COUNT(*) ,AVG(Grade)
FROM SC
GROUP BY Cno; 

对具有可分组的列分组,输出这个列和统计信息

用多个列分组

[例31]  查询每个系男女生人数。

SELECT Sdept, Ssex, COUNT(*)
FROM Student
GROUP BY Sdept, Ssex;

如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则使用HAVING短语筛选最终输出结果

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

 SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >=;

[例33]  查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数

 SELECT  Sno,  COUNT(*)
FROM SC
WHERE Grade>=
GROUP BY Sno
HAVING COUNT(*)>=;

WHERE子句与HAVING短句的区别在于作用对象不同。

WHERE子句作用于基本表或视图,从中选择满足条件的元组(表中的一行)

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

数据库——SQL数据单表查询的更多相关文章

  1. 数据库SQL的多表查询

    数据库 SQL 的多表查询:eg: table1: employees, table2: departments,table3: salary_grades; 一:内连接: 1):等值连接: 把表em ...

  2. python实现简易数据库之二——单表查询和top N实现

    上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...

  3. sql语句-单表查询

    一:单表查询 CREATE TABLE `Score`( `s_id` ), `c_id` ), `s_score` ), PRIMARY KEY(`s_id`,`c_id`) ); ); ); ); ...

  4. MySQL数据库篇之单表查询

    主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...

  5. SQL数据查询之——单表查询

    一.SQL数据查询的一般格式 数据查询是数据库的核心操作.SQL提供了SELECT语句进行数据查询,其一般格式为: SELECT [ALL | DISTINCT]<目标列表达式>[,< ...

  6. 数据库常用SQL语句(一):常用的数据库、表操作及单表查询语句

    以MySql数据库为例进行说明 1.数据库操作语句 2.表的操作语句 3.表中的字段操作语句 4.MYSQL支持的完整性约束 数据库管理系统提供了一致机制来检查数据库表中的数据是否满足规定的条件,以保 ...

  7. 学数据库还不会Select,SQL Select详解,单表查询完全解析?

    查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> .. ...

  8. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  9. Django框架----数据库表的单表查询

    一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",cou ...

随机推荐

  1. Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid

    Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...

  2. 极限编程核心价值:尊重(Respect)

    原文:https://deviq.com/respect 极限编程核心价值:简单(Simplicity) 极限编程核心价值:沟通(Communication) 极限编程核心价值:反馈(Feedback ...

  3. Moleskine智能笔+专用本:写完随时传到手机

    http://www.totiot.com/61805.html Moleskine公司生产的速写本和速写板一直是涂鸦爱好者和速记员们的首选.该公司还联合Adobe. Livescribe. Ever ...

  4. Java之时间转换

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse( ...

  5. OpenCV——边缘检测入门、Canny边缘检测

    边缘检测的一般步骤: 最优边缘检测的三个评价标准: 低错误率:表示出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报: 高定位性:标识出的边缘要与图像实际边缘尽可能接近: 最小响应:图像中的边缘只能 ...

  6. python不要使用可变对象作为参数的默认值

    幽灵乘客例子: . 如上:如果为空时,bus2和bus3引用的是相同的一个list,就会造成粗错误 实际工作中,如果不想改变某个参数值,那么通过以上这种赋值也会改变 解决方式self.passenge ...

  7. Android ListView下拉刷新时卡的问题解决小技巧

    问题:ListView下拉刷新时看上去非常的卡 解决方案: 在BaseAdapter的getView方法中,有三个参数 public View getView(int position, View c ...

  8. opencv7-ml之统计模型

    在opencv的ml模块中有个统计模型类,而其他的比如朴素贝叶斯分类器.knn.svm等等其他模型都是基于该模型上派生出来的.所以先介绍下该模型. 该类的定义在文件"opencv\sourc ...

  9. 转自:strcmp函数实现及详解

    strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果,函数形式如下:int strcmp(constchar*str1,constchar*str2);其中str1和st ...

  10. 关于PCB的线宽与过孔

    关于PCB的线宽与过孔 我们在画PCB时一般都有一个常识,即走大电流的地方用粗线(比如50mil,甚至以上),小电流的信号可以用细线(比如10mil). 对于某些机电控制系统来说,有时候走线里流过的瞬 ...