SQL单表查询部分记录(一)
建立表:
create table Student
(Sno char(9) primary key,
Sname char(20) UNIQUE,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
create table Course
(Cno char(4) primary key,
Cname char(40),
Cpno char(4),
Ccredit smallint,
-- FOREIGN KEY (Cpno) REFERENCES Course (Cno)
)
create table SC
(Sno char(9),
Cno char(4),
Grade smallint,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student (Sno),
FOREIGN KEY (Cno) REFERENCES Course (Cno)
);
1.选择表中的若干列
--例:查寻Student表中的学生的学号和姓名
SELECT Sno,Sname FROM Student;
--各个列的顺序可以和表中的顺序不一致,代码中的顺序即为查询结果的显示顺序
2.查询表中的全部记录
SELECT * FROM Student;
3.查询经过计算的值
SELECT 子句的目标列表达式不仅仅可以是属性列,也可以是表达式
例如:查询学生的姓名和出生年份
SELECT Sname,2014-Sage From Student;
不仅仅可以是算术表达式还可以是字符串常量,函数等
SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept) FROM Student;
可以指定别名来改变查询结果的列标题
SELECT Sname,'Year of Birth' BIRTH:,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;
选择表中的若干元组
1.剔除重复的行(投影到指定的列上后)
SELECT DISTINCT Sno FROM Student;
--如果没有DISTINCT ,默认为ALL
--即为
SELECT ALL Sno FROM Student;
2.查询满足条件的元组(WHERE)
1.比较大小
(1)例:查询专业为CS的学生
SELECT Sname FROM Student
WHERE Sdept='CS';
(2)查询年龄小于20的学生
SELECT Sname FROM Student
WHERE Sage<20;
查询的过程:
扫描全表,取出每个元组看该元组的某列的值是不是满足WHERE中的条件,如果满足则取出相应的SELECT 中的列输出
2.确定范围(查询一个范围内的)
--使用BETWEEN...AND... 或 NOT BETWEEN...AND...查询属性值在或不在某一范围内的元组
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;--(包括20,23)
3.查询属性值在某一集合中的元组
例如:查询在CS,MA,IS专业中的学生的姓名和性别
IN/NOT IN
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
4.字符匹配
[NOT] LIKE '<串>' [ESCAPE '换码字符(\)']
例:查询所有姓刘的学生
SELECT Sname,Ssex,Sno
FROM Student
WHERE Sname LIKE '刘%';
%号代表任意长度,比如:满足a%b的字符串:aaab,asdasdab等
_代表任意单个字符,例如a_b为以a开头,b结尾的长度为3 的字符串
LIKE后的串中不含%或_,即可使用=取代LIKE,用!=或<>取代NOT LIKE
使用换码字符:
查询DB_Dd:
SELECT Cno
FROM
WHERE Cname LIKE 'DB\_Dd' ESCAPE'\'
5.空值查询
这里的IS不能用=取代
SELECT Sno,Cno
FROM Student
WHERE Grade IS NULL;
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
6.多重条件查询
使用AND 和 OR
AND 优先级大于 OR
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;