SQL语言基础-数据查询
2010-05-30 10:25
555 查看
在SQL语言中,只提供了一个动词SELECT用来进行数据查询操作,但这个动词的参数十分复杂,且能嵌套使用,其通用格式如下:
SELECT [All|Distinct]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...
[WHERE<条件表达式>]
[GROUP BY<列名1>[H***ING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
1、单表查询
数据查询主要通过一些例子来说明SELECT语句的使用。假设有学生表Student(Sno,Sname,Ssex,Sage,Sdept),还有课程表Course(Cno,Cname,Credit,Cpno)和选修表SC(Sno,Cno,Grade)。其中Cno为课程表,Cname为课程名称,Cpno为先修课程号,Credit为学分,Grade为成绩。
查询全体学生的学号与姓名的命令格式为:
SELECT Sno,Sname
FROM Student;
查询全体男同学的详细记录的命令格式为:
SELECT *
FROM Student
WHERE Ssex="男";
查询所有年龄大于21岁的学生的姓名、出生年份和所在系,要求用小写字母表示所在系名。
SELECT Sname,'Year of birth',2004-Sage,lower(Sdept)
FROM Student
WHERE Sage>21;
查询IS系、MA系和CS系学生的姓名和性别的命令格式为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept In('IS','MA','CS');
查询名字中第二个字为'阳'的学生的姓名、学号的命令格式为:
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE'_ _阳%'; //其中的“_”代表一个字符,而“%”代表0到若干个字符。
查询DB_Design课程的课程号和学分的命令格式为:
SELECT Cno,Credit
FROM Course
WHERE Cname LIKE 'DB/_Design'Escape'/';
查询选修了3号课程的学生的学号及成绩,查询结果按分数的降序排列所有有成绩的学生学号和课程号。
SELECT Sno,Credit
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
在SQL语言中,也可以使用集函数:
Count([Distinct|All]*):统计元组个数;
Count([Distinct|All]<列名>):统计一列中值的个数;
Sum([Distinct|All]<列名>):计算一列值的总和;
Avg([Distinct|All]<列名>):计算一列值的平均值;
Max([Distinct|All]<列名>):求一列值中的最大值;
Min([Distinct|All]<列名>):求一列值中的最小值;
求各个课程号及相应的选课人数。
SELECT Cno,Count(Sno)
FROM SC
GROUP BY Cno;
2、连接查询
查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
查询每个学生及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade
FROM Student Left Outer join SC
WHERE Student.Sno=SC.Sno;
查询每一门课程的间接选修课 //区别间接选修课和直接选修课
SELECT F.Cno,S.Cpno
FROM Course F,Course S
WHERE F.Cpno=S.Cno;
其中的F和S称为课程的别名
查询每个学生的学号、姓名、选修的课程名称及成绩
SELECT Sno,Sname,Cno,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno And Course.Cno=SC.Cno;
3、嵌套查询
查询与“刘晨”在同一系学习的学生
SELECT Sno,Sname
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨');
查询选修了课程名为信息系统(MIS)的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN(SELECT Sno
FROM SC
WHERE Cno IN(SELECT Cno
FROM Course
WHERE Cname='MIS'));
查询其它系中比信息系某个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<Any
(SELECT Sage
FROM Student
WHERE Sdept='IS');
或者
SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECT Max(Sage)
FROM Student
WHERE Sdept='IS')
AND Sdept<>'IS';
查询没有选修1号课程的学生姓名
SELECT Sname
FROM Student
WHERE Not Exists
(SELECT *
FROM SC
WHERE Sno=Student.Sno And Cno='1');
查询至少选修了95002选修表的全部课程的学生的学号
SELECT Distinct Sno
FROM SC SCX
WHERE Not Exists(SELECT *
FROM SC SCY
WHERE SCY.Sno='95002'
And Not Exists(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno And SCZ.Cno=SCY.Cno));
4、集合查询
查询计算机系的学生及年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<19;
SELECT [All|Distinct]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...
[WHERE<条件表达式>]
[GROUP BY<列名1>[H***ING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
1、单表查询
数据查询主要通过一些例子来说明SELECT语句的使用。假设有学生表Student(Sno,Sname,Ssex,Sage,Sdept),还有课程表Course(Cno,Cname,Credit,Cpno)和选修表SC(Sno,Cno,Grade)。其中Cno为课程表,Cname为课程名称,Cpno为先修课程号,Credit为学分,Grade为成绩。
查询全体学生的学号与姓名的命令格式为:
SELECT Sno,Sname
FROM Student;
查询全体男同学的详细记录的命令格式为:
SELECT *
FROM Student
WHERE Ssex="男";
查询所有年龄大于21岁的学生的姓名、出生年份和所在系,要求用小写字母表示所在系名。
SELECT Sname,'Year of birth',2004-Sage,lower(Sdept)
FROM Student
WHERE Sage>21;
查询IS系、MA系和CS系学生的姓名和性别的命令格式为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept In('IS','MA','CS');
查询名字中第二个字为'阳'的学生的姓名、学号的命令格式为:
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE'_ _阳%'; //其中的“_”代表一个字符,而“%”代表0到若干个字符。
查询DB_Design课程的课程号和学分的命令格式为:
SELECT Cno,Credit
FROM Course
WHERE Cname LIKE 'DB/_Design'Escape'/';
查询选修了3号课程的学生的学号及成绩,查询结果按分数的降序排列所有有成绩的学生学号和课程号。
SELECT Sno,Credit
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
在SQL语言中,也可以使用集函数:
Count([Distinct|All]*):统计元组个数;
Count([Distinct|All]<列名>):统计一列中值的个数;
Sum([Distinct|All]<列名>):计算一列值的总和;
Avg([Distinct|All]<列名>):计算一列值的平均值;
Max([Distinct|All]<列名>):求一列值中的最大值;
Min([Distinct|All]<列名>):求一列值中的最小值;
求各个课程号及相应的选课人数。
SELECT Cno,Count(Sno)
FROM SC
GROUP BY Cno;
2、连接查询
查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
查询每个学生及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade
FROM Student Left Outer join SC
WHERE Student.Sno=SC.Sno;
查询每一门课程的间接选修课 //区别间接选修课和直接选修课
SELECT F.Cno,S.Cpno
FROM Course F,Course S
WHERE F.Cpno=S.Cno;
其中的F和S称为课程的别名
查询每个学生的学号、姓名、选修的课程名称及成绩
SELECT Sno,Sname,Cno,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno And Course.Cno=SC.Cno;
3、嵌套查询
查询与“刘晨”在同一系学习的学生
SELECT Sno,Sname
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨');
查询选修了课程名为信息系统(MIS)的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN(SELECT Sno
FROM SC
WHERE Cno IN(SELECT Cno
FROM Course
WHERE Cname='MIS'));
查询其它系中比信息系某个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<Any
(SELECT Sage
FROM Student
WHERE Sdept='IS');
或者
SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECT Max(Sage)
FROM Student
WHERE Sdept='IS')
AND Sdept<>'IS';
查询没有选修1号课程的学生姓名
SELECT Sname
FROM Student
WHERE Not Exists
(SELECT *
FROM SC
WHERE Sno=Student.Sno And Cno='1');
查询至少选修了95002选修表的全部课程的学生的学号
SELECT Distinct Sno
FROM SC SCX
WHERE Not Exists(SELECT *
FROM SC SCY
WHERE SCY.Sno='95002'
And Not Exists(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno And SCZ.Cno=SCY.Cno));
4、集合查询
查询计算机系的学生及年龄不大于19岁的学生
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<19;
相关文章推荐
- 第二章 sql语言基础 查询与操作数据
- 第二章 sql语言基础 查询与操作数据
- MySQL (五)上 DQL 数据查询语言(sql 语句)
- SQL查询语言的基础知识
- 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-03 联接查询
- SQL语言基础-数据控制
- SQL 基础之使用子查询检索数据(二十二)
- Java自学之路-Java基础教程-37:Java查询数据表Statement类和增删改查Sql
- SQL 复习二(数据查询语言)
- sql基础--怎样查询单列数据
- [SQL]SQL语言入门级教材_SQL数据操作基础(二)
- SQL扩展之T-SQL中的数据查询语言之选择查询篇
- SQL基础(四)数据查询
- SQL语言基础--数据插入修改删除
- EAS 一些基础数据的查询记录脚本(sql)
- SQL扩展之T-SQL中的数据查询语言之连接查询
- sql基础--怎样查询多列数据
- Oracle Class2. SQL查询和SQL函数(Oracle数据类型,ddl,dml,dcl,事务控制语言tcl,sql操作符,sql函数,select语句,运算符,分析函数,临时表)
- SQL语言——基础语言:查询、增、删、改
- sql基础--怎样查询所有列数据