上次教程我们讲述了数据库中的增,删,改语句,今天我们来学习最后一个–‘改’的语句。
1.select语法
数据库查询只有select一个句子,但select语法相对复杂,其功能丰富,使用方式也很灵活
SELECT [ALL|Distinct] <目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名1> [ASC|DESC]]
2.单表查询
查询全体学生的学号和姓名
select sno,sname
from student;
3.查询全体学生的所有属性
select *
from student;
4.查询全体学生的姓名、出生年份和所学专业,要求用小写字母表示所学专业名
select sname,'year of birth:',2002-sage,LOWER(smajor)
from student;
5.比较大小
查询入学年龄在20岁以下爱的学生的姓名及其入学年龄。
select sname,sage
from student
where sage<20;
6.选择范围
查询入学年龄不在20-23岁之间的学生的姓名及其入学年龄
select sname,sage
from student
where sage not between 20 and 23;
7.确定集合
查询不是信息、数学、计算机科学专业的所有学生的姓名和性别
select sname,sgen
from student
where smajor not in('is','ma','cs');
8.字符匹配
查询所有姓刘学生的姓名和性别
select sname,sgen
from student
where sname like '刘%';
9.使用换码字符
查询以“DB_"开头,且倒数第三个字符为i的课程的详细形况。
select *
from course
where cname like 'DB\-%i--' ESCAPE'\';
10.空值查询
select sno,cno
from sc
where grade is null;
11.多重条件查询
select sname
from student
where smajor='CS' and sage<20;
12.DISTINCT:查询所有学生的专业名列表
select distinct(smajor)
from student;
其中,DISTINCT用于去掉查询结果集中重复的行;若SELECT中没有特别指定,则缺省为ALL.
13.ORDER BY:查询全体学生所有字段,查询结果按专业名升序、入学年龄降序的方式排序输出。
select *
from student
order by smajor ASC,sage desc;
14.聚集函数语法
COUNT([DISTINCT|ALL]*)
COUNT([DISTINCT|ALL]<列名>)
SUM([DISTINCT|ALL]<列名>)
AVG([DISTINCT|ALL]<列名>)
MAX([DISTINCT|ALL]<列名>)
MIN([DISTINCT|ALL]<列名>)
1.查询student表中学生的总人数
select count(*)
from student;
2.查询选修了课程的学生人数
select count(distinct sno)
from sc;
3.查询选修了2号课程的学生的平均分
select avg(grade)
from sc
where cno='2';
4.GROUP BY:求各个课程号及相应的选课人数,并按照课程号分组输出
select cno,count(sno)
from sc
group by cno;
5.GROUP BY:查询选修了1,2号课程的学生的学号
select sno
from sc
where cno='1' or cno='2'
group by sno
having count(*)=2;
15.连接查询
语法:
SELECT *
FROM 表A
INNER JOIN 表B ON 表A.键 = 表B.键
LEFT JOIN(左连接)
SELECT *
FROM 表A
LEFT JOIN 表B ON 表A.键 = 表B.键
RIGHT JOIN(右连接)
SELECT *
FROM 表A
RIGHT JOIN 表B ON 表A.键 = 表B.键
FULL JOIN(全连接)
SELECT *
FROM 表A
FULL JOIN 表B ON 表A.键 = 表B.键
示例1:简单的内连接
-- 查询学生及其选课信息(只显示有选课的学生)
SELECT s.student_id, s.student_name, sc.course_id
FROM student s
INNER JOIN sc ON s.student_id = sc.student_id
示例2:多表连接
-- 查询学生姓名、课程名称和成绩
SELECT s.student_name, c.course_name, sc.grade
FROM student s
JOIN sc ON s.student_id = sc.student_id
JOIN course c ON sc.course_id = c.course_id
示例3:左连接保留所有学生
-- 查询所有学生及其选课信息(包括没选课的学生)
SELECT s.student_name, sc.course_id
FROM student s
LEFT JOIN sc ON s.student_id = sc.student_id
等值连接
select student.*,sc.*
from student,sc
where student.sno=sc.sno;
自身连接
select first.cno,second.cpno
from course first,course second
where first.cpno=second.cno;
外连接
select student.*,sc.*
from student,sc;
复合条件连接
select student.sno,sname
from student,sc
where student.sno=sc.sno and sc.cno='2' and sc.grade>90;
select student.sno,sname
from student,sc,course
where student.sno=sc.sno and sc.cno=course.cno;