SQL之单表查询那点事儿
来源:互联网 发布:java项目经理面试 编辑:程序博客网 时间:2024/06/06 19:59
I.导语
数据库查询是数据库操作的核心,SQL提供select语句进行查询,其一般的格式为:
select [all | distinct] <目标列表达式> [,<目标列表达式>] ...from <表名或试图名> [,<表名或试图名>] ...[where <条件表达式>][group by<列名1> [having <条件表达式>]][order by<列名2> [ASC | DESC]];
数据表
Student
Course
CS
– 查询全体学生的学号和姓名
select Sno, Snamefrom Student;
– 查询学生表的全部信息
– 方式一
select *from Student;
– 方式二,这种方式可以改变结果列的顺序,下面这个例子将Sno和Sname交互了位置
select Sname, Sno, Sage, Ssex, Sdeptfrom Student;
– 查询经过计算的值
select Sname, 2017-Sagefrom Student;
– 改变表头为 birthYear
select Sname, 2017-Sage birthYearfrom Student;
– select 等价于 select all
select all Snofrom SC;
上面的结果中Sno有重复行,如何消除重复,使用distinct关键字
– 消除重复行
select distinct Snofrom SC;
II.查询满足条件的元组
查询满足条件的元组可以通过where子句实现。
常用的查询条件
(1)比较大小
– 查询计算机系的全体学生名单
select Sname from Studentwhere Sdept='CS';
上面这个查询操作,RDBMS可能的一种操作是全表扫描,取出一个元组,检查该元组的Sdept列的值是否为CS,如果相等,则取出Sname形成新的元组输出,否则跳过。假设这个表有上万条数据,而Sdept=CS的人数较少,可以在Sdept上建立索引,系统会利用索引的来查找Sdept=CS的元组,避免全表扫描,加快查询效率。
– 查询20岁以下的学生姓名和年龄
select Sname, Sagefrom Studentwhere Sage<20;
– 查询考试成绩有不合格的学生学号
select distinct Snofrom SCwhere Grade < 60;
这里采用distinct消除重复行,因为一个学号可能有几门课不及格,只需要列出一次就行。
(2)确定范围
– 查询年龄在 20到23岁(包含20/23)之间的学生的姓名、系别、年龄
select Sname, Sdept, Sagefrom Studentwhere Sage between 20 and 23;
– 查询年龄不在 20到23岁(包含20/23)之间的学生的姓名、系别、年龄
select Sname, Sdept, Sagefrom Studentwhere Sage not between 20 and 23;
(3)确定集合
– 查询计算机系(CS)、数学系(MA)和信息系(IS)的学生姓名和性别
select Sname, Ssexfrom Studentwhere Sdept in ('CS', 'MA', 'IS');
– 查询不在计算机系(CS)、数学系(MA)和信息系(IS)的学生姓名和性别
select Sname, Ssexfrom Studentwhere Sdept not in ('CS', 'MA', 'IS');
(4)字符匹配
一般格式
[not] like ‘<匹配串>’ [escape ‘<换码字符>’]
其含义是查找指定属性列值与匹配串相匹配的元组,匹配串可以是完整的字符串,也可以是带有通配符%和_。
%:代表任意长度(可以是0)的字符串。例如a%b表示以a开头b结尾的任意长度字符串。如abc, abgggc,ab都满足该匹配。
_:代表任意单个字符。例如a_b,表示以a开头b结尾的长度为3的任意 字符串。如:abc,afc等都满足该匹配。
– 查询序号为 200215121 的学生的详细情况
select *from Studentwhere Sno like '200215121';
这个等价于
select *from Studentwhere Sno = '200215121';
如果like后面的匹配串不含通配符,like可用=(等于)来代替, not like可以用 != 或者<>(不等于)来代替。
– 查询所有姓刘的学生的学号、姓名、性别
select Sno, Sname, Ssexfrom Studentwhere Sname like '刘%';
– 查询姓欧阳且全名长度为3的学生姓名,一个汉字占两个_
select Snamefrom studentwhere Sname like '欧阳__';
– 查询名字中第二字为阳的学生的姓名
select Snamefrom Studentwhere Sname like '__阳%';
– 查询不姓刘的学生的姓名
select Snamefrom Studentwhere Sname not like '刘%';
如果查询的字符串包含通配符 %或者_,这时就要使用escape’<换码字符>’短语,对通配符进行转义。
– 查询DB_design课程的课程号和学分
select Cno, Ccreditfrom Coursewhere Cname like 'DB/_design'escape '/';
escape ‘/’表示 “/”为转义字符,这样紧跟在“/” 后面的下划线不在具有统配符的含义,转义为普通的字符。
– 查询课程名以DB_开头且倒数第三个字符为i的课程详情
select *from Coursewhere Cname like 'DB/_%i__' escape '/';
(5)涉及空值的查询
– 查询成绩为空的学号和课程号
select Sno, Cnofrom scwhere Grade is null;
(6)多条件查询
逻辑运算符and 和 or可以联结多个查询条件。and的优先级高于or,但是可以通过括号来该变优先级。
– 查询计算机系年龄在20岁以下的学生姓名
select Snamefrom Studentwhere Sdept = 'CS' and Sage < 20;
– 查询计算机系(CS)、数学系(MA)和信息系(IS)的学生姓名和性别
select Sname, Ssexfrom Studentwhere Sdept in ('CS', 'MA', 'IS');
– 上面这个可以改造为 or 联结条件
select Sname, Ssexfrom Studentwhere Sdept='CS' or Sdept='MA' or Sdept='IS';
III.order by子句
用户可以通过order by 子句对查询结果按照一个或多个属性列的升序(asc)或降序(desc)排列,缺省为升序排序。
– 查询选修了3号课程的学生的学号及其成绩并按照成绩的降序排列
select Sno, Gradefrom SCwhere Cno=3order by Grade desc;
对于空值的,升序空值排在最后,降序排在最前面。
– 查询所有学生的信息,按系的升序排列,同一个系的按照年龄降序排序
select *from Studentorder by Sdept, Sage desc;
IV.聚集函数(aggregate functions)
SQL提供了许多聚集函数,主要包括:
– 查询学生的总数
select count(*)from Student;
– 查询选修了课程的学生人数 ,消除重复学号
select count(distinct Sno)from SC;
– 计算1号课程的平均成绩
select avg(Grade)from SCwhere Cno=1;
– 查询1号课程的最高分
select max(Grade)from SCwhere Cno='1';
– 查询200215122学生的总学分
select sum(Ccredit)from sc, coursewhere sc.Sno='200215122' and sc.Cno = course.Cno;
V.group by子句
group by 子句将查询结果按照某一列或多列的值进行分组,值相同的为一组。
– 求各个课程号和相应的选课人数
select Cno,count(Sno)from SCgroup by Cno;
– 查询选修了3门课以上的学生学号
select Snofrom scgroup by Snohaving count(*)>3;
where子句和having短语的的区别在于作用对象不同。where做用的是基本表或者视图,从中选择符合条件的元组;而having短语作用的是组,从中选择符合条件的组。
- SQL之单表查询那点事儿
- oracle查询使用别名那点事儿
- 喜鹊那点事儿 之 胜似良药
- ios开发之delegate那点事儿
- ios开发之delegate那点事儿
- linux之ctags的那点事儿
- 面试那点事儿之Web Service
- 程序员那点事儿
- XML那点事儿
- 喝酒那点事儿
- P2P那点事儿
- 招聘那点事儿
- 性能那点事儿
- CMD那点事儿
- 面试那点事儿
- AOP 那点事儿
- 【中差评也就那点事儿】
- 系统维护那点事儿
- 入门AngularJS的小小理解
- 学习资料 初识java
- Android Camera开发分辨率 清晰度 图像变形
- android监听并获取短信
- AspectJ术语
- SQL之单表查询那点事儿
- Nginx + uwsgi + django + websocket环境部署
- 欢迎使用CSDN-markdown编辑器
- 学习资料 变量数据类型和运算符
- Uva 10600
- bigpipe-php+nginx实战篇
- SSL 1757——求连通分量
- node.js学习(十四、Console模块)
- Node.js_HTTP模块