这里简单介绍以下在QT中常用的SQL命令,在之后将会新增一个分类专栏专门讲数据库。
完备的SELECT语句很复杂,其主要的子句如下:
SELECT [DISTINCT] [别名.]字段名或表达式 [AS 列标题] /* 指定要选择的列或行及其限定 */
//SELECT子句指出查询结果中显示的字段名,以及字段名和函数组成的表达式等。可用DISTINCT去除重复的记录行;AS列标题指定查询结果显示的列标题。当要显示表中所有字段时,可用通配符“*”代替字段名列表。
FROM table_source /* FROM子句,指定表或视图 */
[ WHERE search_condition ] /* WHERE子句,指定查询条件 */
[ GROUP BY group_by_expression ] /* GROUP BY子句,指定分组表达式 */
[ ORDER BY order_expression [ ASC | DESC ]] /* ORDER BY子句,指定排序表达式和顺序 */
// GROUP BY子句和ORDER BY子句分别对查询结果进行分组和排序。
其中,SELECT和FROM子句是不可缺少的。
下面用示例说明使用SQL语句对Student数据库进行的各种查询。
(1)查询Student数据库。查询students表中每个同学的姓名和总学分。
USE Student SELECT name,score FROM students
(2)查询表中所有记录。查询students表中每个同学的所有信息。
SELECT * FROM students
(3)条件查询。查询students表中总学分大于或等于90的同学的情况。
SELECT * FROM students WHERE score >= 90
(4)多重条件查询。查询students表中所在系为“计算机”且总学分大于或等于90的同学的情况。
SELECT * FROM students WHERE department='计算机' AND score >= 90
(5)使用LIKE谓词进行模式匹配。查询students表中姓“李”且单名的学生情况。
SELECT * FROM students WHERE name LIKE '李_'
(6)用BETWEEN…AND指定查询范围。查询students表中不在1998年出生的学生情况。
SELECT * FROM students WHERE birthday NOT BETWEEN '1998-1-1' and '1998-12-31'
(7)空值比较。查询学分尚不确定的学生情况。
SELECT * FROM students WHERE score IS NULL
(8)自然连接查询。查找计算机系学生姓名及其“C++程序设计”课程的考试分数情况。
SLELCT name,grade FROM students, courses,grades,
WHERE department = '计算机' AND coursename= ' C++程序设计' AND students.studentid = grades.studentid AND courses.courseid = grades.coursesid
(9)IN子查询。查找选修了课程号为110的学生情况。
SELECT * FROM students WHERE studentid IN
( SELECT studentid FROM courses WHERE courseid = '110' )
在执行包含子查询的SELECT语句时,系统首先执行子查询,产生一个结果表,再执行外查询。
(10)比较子查询。这种子查询可以认为是IN子查询的扩展,它是表达式的值与子查询的结果进行比较运算。查找课程号102的成绩不低于课程号110的最低成绩的学生学号。
SELECT studentid FROM grades WHERE courseid = '102' AND grade !< ANY ( SELECT grade FROM grades WHERE courseid = '110'
)
(11)EXISTS子查询。EXISTS谓词用于测试子查询的结果集是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXISTS刚好相反。
查找选修110号课程的学生姓名。
SELECT name FROM students WHERE EXISTS ( SELECT * FROM grades WHERE studentid = students.studentid AND courseid = '206'
)
(12)查找选修了全部课程的同学姓名(查找没有一门功课不选修的学生)。
SELECT name FROM students WHERE NOT EXISTS ( SELECT * FROM courses WHERE NOT EXISTS ( SELECT * FROM grades WHERE studentid= students.studentid AND courseid=courses.courseid
) )
(13)查询结果分组。将各课程成绩按学号分组。
SELECT studentid,grade FROM grades GROUP BY studentid
(14)查询结果排序。将计算机系的学生按出生时间先后排序。
SELECT * FROM students WHERE department = '计算机' ORDER BY birthday
在对表数据进行检索时,经常需要对结果进行汇总或计算,如在学生成绩数据库中求某门功课的总成绩、统计各分数段的人数等。聚合函数用于计算表中的数据,返回单个计算结果。常用的聚合函数见下图:
(1)求选修课程110的学生的平均成绩。
SELECT AVG(grade) AS ' 课程110平均成绩' FROM grades WHERE courseid = '110'
(2)求选修课程110的学生的最高分和最低分。
SELECT MAX(grade) AS '课程110最高分' , MIN(grade) AS '课程110最低分' FROM grades WHERE courseid = '110'
(3)求学生的总人数。
SELECT COUNT(*) AS '学生总数' FROM students