一、单表查询
单表查询指仅涉及一个表的查询
1.查询列
1)查询全部列指定列
选择表中的全波列或者部分列,这就是关系代数中的投影运算
该语句的执行过程:从选定的表中取出一个元组,取出该元组在选定的属性上的值,形成一个新的元组作为输出。对该表所有元组做相同的处理,最后形成一个结果关系作为输出。
# 最基本的SELECT语句: SELECT 字段1,字段2,... FROM 表名 SELECT 1 + 1,3 * 2; SELECT 1 + 1,3 * 2 FROM DUAL; #dual:伪表
- 结果
全部列:
#查询全体学生的详细记录 SELECT * FROM Student;
- 结果
部分列:
#查询全体学生的学号与姓名(指定列) SELECT Sno, Sname FROM Student;
- 结果:
2)查询经过计算的值
SELECT子句的<目标表达式>不仅可以是表中的属性列,也可以是表达式、字符串常量、函数等
计算之后的列默认名称为计算的公式:
#查询全体学生的姓名及其出生年份 SELECT Sname, 2004-Sage FROM Student;
- 结果:
3)列的别名
用户也可以通过指定别名来改变计算的列标题,对于含有算术表达式、常量、函数名的目标列表达式较为常用。
命名方式:紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
#查询全体学生的姓名及其出生年份(假设今年是2004年)和所在的院系,要求用小写字母表示所有的系名 SELECT Sname AS 'NAME', 'Year of Birth:' BIRTH, 2004-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT FROM Student;
- 结果
2.查询元组
1)消除取值重复的行(DISTINCT)
两个本来并不完全相同的元组,投影到指定的某些列上之后,可能变成相同的行了,可以通过DISTINCT来取消重复的行
如果按照默认方式选定某一列:
#查询选修了课程的学生学号 SELECT Sno FROM SC;
- 结果有重复行
加入DISTINCT:
#去重 SELECT DISTINCT Sno FROM SC;
- 结果
2)条件查询(WHERE)
常用的运算符:
- 算数运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 正则表达式
运算操作较为简单,查询方式也比较灵活,这里就不一一介绍了。
常用的有比较(>、<……)、确定范围(BETWEEN……AND)、确定集合(IN)、字符匹配(LIKE)、涉及空值的查询(IS NULL / IS NOT NULL)、多重条件查询(AND / OR)
简单的示例:
#查询所有年龄小于20岁的学生姓名及年龄 SELECT Sname, Sage FROM Student WHERE Sage < 20;
- 结果
3.空值参与运算
在某些属性中,经常会遇见NULL的情况,但是如果这一列带着NULL要参与运算,如果算作默认的运算,后面的结果都会是NULL
如果不加处理:
SELECT employee_id,salary "月工资",salary * (1 + commission_pct) * 12 "年工资",commission_pct FROM employees;
- 结果:
如果想要得到一个符合条件的值,可以根据实际情况,将NULL转化为合适的值
在这里,NULL代表没有奖金,所以应该转化为0再做运算:
#实际问题的解决方案:引入IFNULL SELECT employee_id,salary "月工资",salary * (1 + IFNULL(commission_pct,0)) * 12 "年工资",commission_pct FROM `employees`;
- 正确的结果
4.着重号
我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,需要在SQL语句中使用一对``(着重号)引起来。
如果不加处理:
#错误的: SELECT * FROM ORDER;
- 错误信息:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER' at line 1
解决方法:
SELECT * FROM `ORDER`;
二、排序(ORDER BY子句)
用户可用ORDER BY子句对查询结果按照一个或多个属性列的升序或降序排列,缺省(默认)为升序
排序规则:
- ASC为升序
- DESC为降序
- ORDER BY子句在SELECT语句的结尾
简单的例子:
#查询所有学生的学号及成绩,结果按照分数的降序排列 SELECT Sno, Grade FROM SC ORDER BY Grade DESC;
- 结果
注意:
- 也可使用列的别名进行排序
#查询全体学生姓名和所在的院系,结果按照院系号降序排列 SELECT Sname, Sdept dept FROM Student ORDER BY dept DESC;
- WHERE 需要声明在FROM后,ORDER BY之前。
#查询选修了3号课程的学生的学号及其成绩,查询结果按照分数的降序排列 SELECT Sno, Grade FROM sc WHERE Cno='3' ORDER BY Grade DESC; #1-4行执行顺序:2、3、1、4
- 二级排序
#查询全体学生的情况,查询结果按所在系的系号升序排序,同一系的学生按年龄降序排序 SELECT * FROM Student ORDER BY Sdept, Sage DESC;
- 对于空值,排序时显示的次序由具体系统来决定。