数据库查询是数据库的核心操作。
对网站的开发基本上大多数时间都是用在对数据的增删查改上。
一.数据库查询知识框图
虽然查询方法大体上可以做出如上图分类,但通过学习你会发现其实许多种查询方法是相互交叉的运用的。
二.单表查询
单表查询指的是仅涉及一个表的查询,相对来说比较简单,但是用到的各种SQL语法却是复杂查询的基础。
1.选择表中若干列
选择表中若干列或全部,其实就是关系代数中的投影运算
SELECT SNO,SNAME FROM Student;
2.选择表中若干元组
选择表中若干行,其实就是通过where子句添加查询条件实现的
SELECT SNO,SNAME FROM Student WHERE SDEPT='CS';
//查询选了计算机专业学生的学号和姓名
SELECT SNO,SNAME FROM Student WHERE SNAME like '吴%';
//查询姓的学生的学号和姓名
常用到的查询条件有:
查询条件 | 谓词 |
比较 | =, > , < , >= , <= , != , <> , !> ,!<;NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多重条件(逻辑算) | AND ,OR ,NOT |
DISTINCT去掉重复行
3.ORDER BY子句
ORDER BY子句可以对查询结果按照一个或者多个属性的升序(ASC)或者降序(DESC)排列,默认为升序
SELECT SNAME,SNO FROM Student where SDEPT='通信工程' order by SAGE DESC;
4. 聚集函数
为了方便对查询结果做一些处理,SQL提供了许多聚集函数。主要有:
COUNT(*) | 统计元祖个数 |
COUNT ([DISTINCT|ALL] 列名) | 统计一列中值的个数 |
SUM ([DISTINCT|ALL] 列名) | 计算一列值的总和(此列必须是整形数) |
AVG ([DISTINCT|ALL] 列名) | 计算一列值的平均值(此列必须是整形数) |
MAX ([DISTINCT|ALL] 列名) | 求一列值中的最大值 |
MIN ([DISTINCT|ALL] 列名) | 求一列值中的最小值 |
(DISTINCT关键词由于去掉重复值)
SELECT COUNT(*) FROM Student;
//求行数,即求学生总人数
5.GROUP BY子句
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。
select CNO,COUNT(SNO) from SC GROUP BY CNO;
//求各个课程号及相应的选课人数
select SNO from SC group by SNO HAVING COUNT(*)>3;
//查询选修了三门以上课程号的学生号
注意:
- WHERE子句中式不能使用聚集函数作为条件表达式的。
- 聚集函数只能用于SELECT子句和GROUP BY 中的HAVING子句,即使用having语句应该结合GroupBy语句。
-
where过滤行,having过滤分组。
-
having支持所有where操作符。
例:查询平均成绩大于等于80分的学生学号和平均成绩。
下面的语句是不对的:
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)>=80;
三.连接查询