SQL数据查询之——单表查询
一、SQL数据查询的一般格式
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,其一般格式为:
SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]···
FROM<表名或视图名>[,<表名或视图名>···] | (SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC | DESC]];
整个SELECT语句的含义是,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果还要按<列名2>的值的升序或降序排序。
SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
二、SQL单表查询(仅涉及一个表的查询)
1.选择表中的若干列
(1)查询指定列
查询全体学生的学号与姓名
SELECT Sno,Sname
FROM Student;
查询全体学生的姓名、学号、所在系
SELECT Sname,Sno,Sdept
FROM Student;
(2)查询全部列
查询全体学生的详细记录
SELECT *
FROM Students;
等价于
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
(3)查询经过计算的值
查询全体学生的姓名及其出生年份
SELECT Sname,2014-Sage //查询结果的第2列是一个 算术表达式
FROM Student;
注意:用当时的年份(假设为2014年)减去学生的年龄,这样所得的即是学生的出生年份。
查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名
SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;
2.选择表中的若干组
(1)消除取值重复的行
查询选修了课程的学生学号
SELECT DISTINCT Sno
FROM SC;
(2)查询满足条件的元组
查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件如下表所示
|
查询条件 |
谓词 |
|
比较 |
=,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比较运算符 |
|
确定范围 |
BETWEEN AND,NOT BETWEEN AND |
|
确定集合 |
IN,NOT IN |
|
字符匹配 |
LIKE,NOT LIKE |
|
空值 |
IS NULL,IS NOT NULL |
|
多重条件(逻辑运算) |
AND,OR,NOT |
查询计算机科学系全体学生的名单
SELECT Sname
FROM Student
WHERE Sdept='CS'
查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
查询考试成绩不合格的学生的学号
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
查询年龄在20~23岁之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23
查询年龄在20~23岁之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23
查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名、系别和年龄
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
查询学号为201215121的学生的详细情况
SELECT *
FROM Student
WHERE Sno LIKE ''
等价于
SELECT *
FROM Student
WHERE Sno=''
此处介绍下字符匹配
谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:
[NOT] LIKE'<匹配串>' [ESCAPE '<换码字符>']
其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符 % 和 _ 。其中:
- %(百分号)代表任意长度(长度可以为0)的字符串。例如:a%b 表示以a开头,以b结尾的任意长度的字符串。如acb、addgb、ab等。
- _(下划线)代表任意单个字符。例如:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb、agb等。
查询所有姓刘的学生的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';
查询姓“欧阳”且全名为三个汉字的学生的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_'
注意:数据库字集为ASCII时一个汉字需要两个_;当字符集为GBK时只需要一个。
查询名字中第二个字为“阳”的学生的姓名和学号
SELECT Sname,Sno,
FROM Student
WHERE Sname LIKE '_阳%';
查询所有不姓刘的学生的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';
如果用户要查询的字符串本身就含有通配符%或_,这时就要使用 ESCAPE '<换码字符>' 短语对通配符进行转义了。
查询DB_Design 课程的课程号和学分
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB \ _Design' ESCAPE '\';
ESCAPE '\' 表示 “\” 为换码字符。这样匹配串中紧跟在 “\” 后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。
查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT *
FROM Course
WHERE Cname LIKE 'DB \_%i__'ESCAPE '\';
某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL; /*分数Grade是空值*/
注意:这里的“IS”不能用等号(=)代替。
查所有有成绩的学生学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
查询计算机科学系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;
3.ORDER BY 子句
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno=''
ORDER BY Grade DESC;
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
4. 聚集函数
为了进一步方便用户,增强检索功能,SQL提供了许多聚集函数,主要有:
|
COUNT(*) |
统计元组个数 |
|
COUNT([DISTINCT|ALL]<列名>) |
统计一列中值的个数 |
|
SUM([DISTINCT|ALL]<列名>) |
计算一列值的总和(此列必须是数值型) |
|
AVG([DISTINCT|ALL]<列名>) |
计算一列值的平均值(此列必须是数值型) |
|
MAX([DISTINCT|ALL]<列名>) |
求一列值中的最大值 |
|
MIN([DISTINCT|ALL]<列名>) |
求一列值中的最小值 |
如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。
如果不指定 DISTINCT 短语或指定 ALL 短语(ALL为默认值),则表示不取消重复值。
查询学生总人数
SELECT COUNT(*)
FROM Student;
查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
计算选修1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno='';
查询选修1号课程的学生最高分数
SELECT MAX(Grade)
FROM SC
WHERE Cno='';
查询学生201215012选修课程的总学分数
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='' AND SC.Cno=Course.Cno;
注意:WHERE 子句中是不能用聚集函数作为条件表达式的。聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。
5.GROUP BY子句
将查询结果按某一列或多列的值分组,值相等的为一组。
求各个课程号及相应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询选修了三门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
查询平均成绩大于等于90分的学生学号和平均成绩
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90 (错误!)
GROUP BY Sno;
因为WHERE子句中是不能用聚集函数作为条件表达式的,正确的查询语句应该是:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
HAVING AVG(Grade)>=90;
三、总结
此次整理了SQL数据查询中有关单表查询的程序,其中应格外注意
- 字符匹配中 % 和 _ 的区别。
- ESCAPE 的 换码操作。
- 聚集函数只能用于 SELECT子句 和 GROUP BY子句 中的 HAVING 子句。
SQL数据查询之——单表查询的更多相关文章
- SQL基本查询_单表查询(实验二)
SQL基本查询_单表查询(实验二) 查询目标表结构及数据 emp empno ename job hiedate sal comn deptno 1007 马明 内勤 1992-6-12 4000 2 ...
- SQL基础--查询之一--单表查询
SQL基础--查询之一--单表查询
- MySQL简单查询和单表查询
MySQL记录操作 概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用 ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- MySQL数据查询之单表查询
单表查询 简单查询 - 创建表 DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCREMEN ...
- mysql第四篇:数据操作之单表查询
单表查询 一.简单查询 -- 创建表 DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCRE ...
- sql多表查询(单表查询略过)
表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...
- 查询数据SELECT 之单表查询
一.单表查询的语法与关键字的执行优先级""" # 单表查询# 单标查询完整与法:# select distinct(关键字,代表查询的意思,后面跟)字段1,字段2...( ...
- (七)MySQL数据操作DQL:单表查询1
(1)单表查询 1)环境准备 mysql> CREATE TABLE company.employee5( id int primary key AUTO_INCREMENT not null, ...
随机推荐
- [Windows Azure] Getting Started with Windows Azure SQL Database
In this tutorial you will learn the fundamentals of Windows Azure SQL Database administration using ...
- iOS开发之按钮的基本使用
实现功能: 点击向上的箭头,按钮图片向上,移动,点击向下的箭头,按钮图片向下移动 点击向左的箭头,按钮图片向左移动,点击向右的箭头,按钮图片向右移动, 点击加号图片放大,点击减号,图片缩小 第一步: ...
- JAVA Zero Copy的相关知识【转】
转自:https://my.oschina.net/cloudcoder/blog/299944 摘要: java 的zero copy多在网络应用程序中使用.Java的libaries在linux和 ...
- java动态加载jar包,并运行其中的类和方法
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...
- 【转】mysql 索引过长1071-max key length is 767 byte
问题 create table: Specified key was too long; max key length is 767 bytes 原因 数据库表采用utf8编码,其中varchar(2 ...
- 一句命令激活windows/office
激活windows 服务器地址:kms.03k.org (点击检测KMS服务器是否正常) 更新: 脚本维护更新:2016-11-02 服务端版本:2017-06-17 (1111) 有疑问可以戳QQ群 ...
- Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 ISAPI CGI
Win7 +IIS 刚配置的网站,输入网址后报以下错误: 应用程序“PFIZERQUERY”中的服务器错误 Internet Information Services 7.5 错误摘要 HTTP 错误 ...
- Orcale分析函数OVER(PARTITION BY... ORDER BY...)的讲解
顾名思义,PARTITION 中文是分割的意思,ORDER 是排序的意思,所以翻译一下就是先把一组数据按照制定的字段进行分割成各种组,然后组内按照某个字段排序. 以实际案例来说明这个函数的使用, 首先 ...
- spring batch中MyBatisPagingItemReader分页使用介绍
假如是mysql的话,SQL语句 <![CDATA[select * from ( SELECT so.* FROM t_tm_sales_order so where so.last_modi ...
- JAVA-JSP内置对象之out对象进行页面输出
相关资料:<21天学通Java Web开发> out对象 out对象进行页面输出1.通过out对象的print()方法和println()方法进行页而输出.2.不同的println()方法 ...