一、数据库查询

由于这个点的东西实在是多的,我就和题目,知识点一起演示。

首先是创建数据库:

  1. create database ExampleInfo --创建数据库
  2.  
  3. use ExampleInfo --使用数据库

其次是创建数据库表:

  1. --创建学生表
  2. create table StudentTable(
  3. Sid int not null primary key identity,
  4. Sname varchar(50),
  5. Sage datetime,
  6. Ssex nvarchar(10)
  7. )
    --插入学生数据
  8. insert into StudentTable(Sname,Sage,Ssex)
  9. values ('王昭君',18,'女'),
  10. ('貂蝉',18,'女'),('韩信',18,'男'),
  11. ('李白',20,'男'),('蔡文姬',19,'女'),
  12. ('后裔',19,'男'),('伽罗',19,'女')
  13.  
  14. --创建课程表
  15. create table CourseTable(
  16. Cid int not null primary key identity,
  17. Cname varchar(50),
  18. Tid int
  19. )
    --插入课程数据
  20. insert into CourseTable(Cname,Tid)
  21. values ('语文',1),('数学',3),('英语',5),
  22. ('物理',4),('化学',6),('生物',5),('地理',2)
  23.  
  24. --创建教师表
  25. create table TeacherTable(
  26. Tid int not null primary key identity,
  27. Tname varchar(50)
  28. )
  29. --插入教师数据
  30. insert into TeacherTable(Tname)
  31. values ('诸葛亮'),('黄总'),('老夫子'),
  32. ('墨子'),('女娲'),('伏羲')
  33.  
  34. --创建一张学生课程表
  35. create table SCTable(
  36. Sid int,
  37. Cid int,
  38. Score int,
  39. foreign Key (Sid) REFERENCES StudentTable(Sid),
  40. foreign Key (Cid) REFERENCES CourseTable(Cid)
  41. )
  42. --插入学生课程数据
  43. insert into SCTable (Sid,Cid,Score)
  44. values (1,1,80),(1,2,89),(1,3,88),
  45. (1,4,87),(1,5,78),(1,6,48),(1,7,87),
  46. (2,1,55),(2,2,77),(2,4,99),(2,5,89),
  47. (2,6,15),(3,1,88),(3,2,77),(3,3,78),
  48. (3,4,75),(3,5,67),(3,6,89),(3,7,88),
  49. (4,1,78),(4,4,98),(4,5,89),(4,6,78),
  50. (4,7,79),(5,1,77),(5,2,85),(5,3,82),
  51. (5,5,76),(5,6,95),(6,1,94),(6,4,48),
  52. (7,1,58),(7,2,88),(7,4,75),(7,6,84),
  53. (7,7,99)

1. 查询至少选修两门课程的学生学号;

  1. select Sid from scTable
  2. group by sid
  3. having count(sid) > 2

1) 在数据库中的表名,字段名,数据库名是没有大小写区分的,所以,我在这里可以随便大小写(为了美观还是写的规整一点)

2)  group by  这是一种分组方式,就是将数据分成一个个“小区域”,在这段语句中,从表SCTable中查出了Sid,然后根据Sid相同的进行分类,它会自动过滤相同的sid。

3) 这里还用到了having,它和where 有些类似,都是会根据后面的条件过滤数据。它通常是与group by还有聚合函数一起使用。

聚合函数:(要记住,后面题目有用)

avg():求平均数

count():计数(求个数)

MIN():求最小值

Max():求最大值

sum : 总和 (求总和)

2、查询1号同学的科目id为1课程的成绩;

  1. select Score from scTable
  2. where Sid = 1 and cid = 1

3、 查询平均成绩大于60分的同学的学号和平均成绩;

首先分析用到了几个表:这里只需要知道学号和平均成绩,所以只用到SCTable就可以了

  1. select Sid,AVG(Score) as avgScore from ScTable
  2. group by Sid
  3. having avg(score)>60

as:英文意思中就有作为的意思,这里差不多,就是将平均成绩avg(score) 的列名作为avgScore

4、查询所有同学的学号、姓名、选课数、总成绩;

分析:有几个表,从题目中可以得知,一定有StudentTable表因为有姓名,还要用成绩所以也有SCTable。

总成绩:sum()函数,选课数:count()函数。

  1. select s.Sid,s.Sname,count(cid) as CountCourse,sum(Score) as SumScore
  2. from StudentTable s,ScTable sc
  3. where sc.Sid = s.Sid
  4. group by s.Sid,s.Sname

4、查询有课程成绩小于60分的同学的学号、姓名;

  1. 解法一:
  2. select s.Sid,s.Sname from StudentTable s,ScTable sc
  3. where sc.Sid = s.Sid
  4. group by s.Sid,s.Sname,Score
  5. having Score<60
  6.  
  7. 解法二:
  8. select s.Sid,s.Sname
  9. from StudentTable s
  10. where s.Sid in
  11. (
  12. select distinct(sc.Sid) from ScTable sc
  13. where s.Sid=sc.Sid and sc.Score<60
  14. )

5、查询“1”课程比“2”课程成绩高的所有学生的学号;

分析:涉及一个表,但是却存在同一个列的比较,和根据条件查询出这两个列,然后直接比较

  1. select a.Sid from
  2. (select Sid,Score from Sctable where Cid=1) a,
  3. (select Sid,Score from Sctable where Cid=2) b
  4. where a.Sid=b.Sid and a.Score>b.Score

6、查询姓“诸葛”的老师的个数;

  1. select count(*) as TCount from TeacherTable where Tname like '诸葛%'
  1. 值得注意的是:like 模糊查询,通常和'%'连用。通常有三种情况
  2.  
  3. 1XX% 表示的是左边确定,右边不确定
    select count(*) as TCount from TeacherTable where Tname like '诸葛%'

2)%XX 表示的是左边不确定,右边确定

  1. select count(*) as TCount from TeacherTable where Tname like '%亮'

 
3)%XX% 表示只是知道中间的某一部分

  1. select count(*) as TCount from TeacherTable where Tname like '%葛%'


4)X%X 表示只是知道左右两边不知道中间部分。

  1. select count(*) as TCount from TeacherTable where Tname like '诸%亮'

  1.  

7、查询学过“1”并且也学过编号“2”课程的同学的学号、姓名;

  1. select s.Sid,s.Sname
  2. from StudentTable s,ScTable sc
  3. where s.Sid=sc.Sid and sc.Cid=''
  4. intersect
  5. select s.Sid,s.Sname
  6. from StudentTable s,ScTable sc
  7. where s.Sid=sc.Sid and sc.Cid=''

  1. 联合查询
  2. 1) Union 对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。
  3. 2) Union all 对两个结果集进行并集操作,包括重复行,不进行排序。
  4. 3) except 返回两个结果集的差
  5. 4) intersect 返回两个结果集的并集
  6. 比如说:a = {1,2,3,4} b={2,3,4,5}

  7. 使用Union 结果: {12345}
  8. 使用Union all 结果:{12342345}
  9. 使用except
  10. 1.a execpt b 结果:{12}
  11. 2.b execpt a 结果:{5}
  12. 使用intersect 结果:{2,3,4}
    一、查询学过“1”或者学过“2”课程的同学的学号、姓名;
  1. select s.Sid,s.Sname
  2. from StudentTable s,ScTable sc
  3. where s.Sid=sc.Sid and sc.Cid=''
  4. Union
  5. select s.Sid,s.Sname
  6. from StudentTable s,ScTable sc
  7. where s.Sid=sc.Sid and sc.Cid=''

二、 用UNION all 结合上面结果

  1. select s.Sid,s.Sname
  2. from StudentTable s,ScTable sc
  3. where s.Sid=sc.Sid and sc.Cid=''
  4. Union ALL
  5. select s.Sid,s.Sname
  6. from StudentTable s,ScTable sc
  7. where s.Sid=sc.Sid and sc.Cid=''

三、学过“1”但是没有学过“2”课程的同学的学号、姓名;

  1. select s.Sid,s.Sname
  2. from StudentTable s,ScTable sc
  3. where s.Sid=sc.Sid and sc.Cid=''
  4. except
  5. select s.Sid,s.Sname
  6. from StudentTable s,ScTable sc
  7. where s.Sid=sc.Sid and sc.Cid=''

8、查询学过“诸葛亮”老师所教的所有课的同学的学号、姓名;

  1. select s.Sid,s.Sname from StudentTable s,SCTable sc
  2. where sc.sid = S.Sid and Cid = (
  3. select Cid from CourseTable C where c.Cid =(
  4. select Tid from TeacherTable where Tname = '诸葛亮'
  5. )
  6. )

9、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;

  1. select s.Sid,s.Sname from StudentTable s,
  2. (select sc1.Sid,sc1.Score from ScTable sc1 where sc1.Cid = 2) a,
  3. (select sc2.Sid,sc2.Score from ScTable sc2 where sc2.Cid = 1) b
  4. where a.Sid = b.Sid and s.Sid = a.Sid and s.sid = b.sid and a.Score <b.Score

10、查询没有学全所有课的同学的学号、姓名;

  1. 方案一
  2. select s.Sid,Sname from StudentTable s,scTable sc
  3. where S.Sid = sc.Sid
  4. group by s.Sid,Sname
  5. having count(sc.cid) <( select count(cid) as Ccount from CourseTable)
  6.  
  7. 方案二
  8. select s.Sid,s.Sname
  9. from StudentTable s
  10. where s.Sid not in
  11. (
  12. select sc.Sid from SCTable sc
  13. group by sc.Sid
  14. having COUNT(distinct sc.Cid)=
  15. (
  16. select COUNT(distinct c.Cid) from CourseTable c
  17. )
  18. )

11、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,,物理,化学,生物,地理,有效课程数,有效平均分;

  1. select sc.Sid as '学生ID',
  2. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='语文')
  3. ) as 语文,
  4. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='数学')
  5. ) as 数学,
  6. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='英语')
  7. ) as 英语,
  8. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='物理')
  9. ) as 物理,
  10. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='化学')
  11. ) as 化学,
  12. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='生物')
  13. ) as 生物,
  14. (select Score from Sctable where Sid = sc.Sid and Cid = (select Cid from CourseTable where Cname ='地理')
  15. ) as 地理,
  16. count(sc.Cid) as '有效课程数',
  17. avg(Score) as '有效平均分'
  18. from scTable sc
  19. group by sc.Sid

12、按各科平均成绩从低到高和及格率的百分数从高到低顺序;

  1. select c.Cid,c.Cname,avg(Sc.Score) as avgScore,
  2. 100*SUM(case when isnull(sc.Score,0)>=60 then 1 else 0 end )/count(*) as 'Percent(%)'
  3. from sctable sc,CourseTable c
  4. where c.cid = sc.cid
  5. group by c.Cid,c.Cname
  6. order by 'Percent(%)' desc

专题小训练:case when then else end:

Case具有两种格式。简单Case函数和Case搜索函数。

1.查询学生表中性别为男和性别为女的个数

  1. --分析:首先性别为一列,然后是计算的性别的数量为一列,而计算数量可以用Count来计算
  2. select Ssex, count(
  3. case ssex
  4. when '女' then 1
  5. when '男' then 0
  6. else '无性别' end
  7.  
  8. ) as sexCount from studentTable
  9. group by Ssex

2.根据学生成绩判断学生的等级,90分以上为特别优秀,80分以上为优秀,70分以上为良好,60分以上为及格,60分一下为差。显示出学生的姓名,课程名,分数,等级。

  1. select Sc.sid,s.Sname,sc.Score,c.Cname,(case
  2. when score between 90 and 100 then '特别优秀'
  3. when score between 80 and 90 then '优秀'
  4. when score between 70 and 80 then '良好'
  5. when score between 60 and 70 then '及格'
  6. else '差' end) as '等级'
  7. from sctable sc,studenttable s,coursetable c
  8. where sc.Sid = s.sid and c.Cid = sc.cid
  9. group by Sc.sid,s.Sname,sc.Score,c.Cname

3.统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-90],[80-90],[60-80],[ <60]

  1. select sc.Cid,MAX(c.Cname) as 'CourseName',
  2. SUM(CASE WHEN sc.Score BETWEEN 90 and 100 THEN 1 ELSE 0 END) as '[90-100]',
  3. SUM(CASE WHEN sc.Score BETWEEN 80 and 90 THEN 1 ELSE 0 END) as '[80-90]',
  4. SUM(CASE WHEN sc.Score BETWEEN 60 and 80 THEN 1 ELSE 0 END) as '[60-80]',
  5. SUM(CASE WHEN sc.Score BETWEEN 0 and 60 THEN 1 ELSE 0 END) as '[<60]'
  6. from SCtable sc,Coursetable c
  7. where sc.Cid=c.Cid
  8. group by sc.Cid

训练完成:https://www.cnblogs.com/prefect/p/5746624.html(这位大神的这一段讲的挺好)

备注:这里的题目我是做完了一个大神博客的题目自己模仿写的。做完他的题目后深有感触。若果需要加大训练的请去

https://www.cnblogs.com/edisonchou/p/3878135.html

数据库艰难求生之路(基础:增删改查)part2的更多相关文章

  1. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  2. sqlite数据库操作详细介绍 增删改查,游标

    sqlite数据库操作详细介绍 增删改查,游标     本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code     package com.example ...

  3. MySQL数据库之表的增删改查

    目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...

  4. Delphi - cxGrid连接Oracle数据库 实现数据的增删改查

    cxGrid连接Oracle数据库 实现数据的增删改查 cxGrid连接Oracle数据库 1:通过OraSession连接数据库.OraDataSet实现OraSession和OraDataSour ...

  5. 使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

    一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的 ...

  6. Mysql数据库基础增删改查常用语句命令

    Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...

  7. 数据库中简单的增删改查(CRUD)

    一切都是基于数据,而对数据的管理都离不开数据库.最近学到数据库的简单操作,所以写下这篇文章,总结一下学习到的知识.浅陋之处,多多见谅. 补充一下:一直弄不清SQL Server,Mysql ,以及Or ...

  8. 用JDBC连接 数据库 进行简单的增删改查

    JDBC为java的基础.用jdbc实现对数据库的增删改查的功能是程序员的基本要求.本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包. ...

  9. MongoDB 基础增删改查

    增删改查 基础操作 use show dbs show collections db[当前所在数据库] 插入文档 db.collection.insert() db.collection.insert ...

  10. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

随机推荐

  1. c++ 输出精度

    1  保留小数点后**位 cout.flags(ios::fixed); cout.precision(4); //设置输出精度,

  2. CSDN Android客户端的制作 导航帖

    弄个导航贴,把相关知识来个汇总. CSDN Android的客户端的效果图: 分别通过以下博客进行详细的讲解: 1.Android 使用Fragment,ViewPagerIndicator 制作cs ...

  3. 玩转CSS3(一)----CSS3实现页面布局

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 摘要:     CSS3相对CSS2增加了一些新的布局方式:多栏布局和盒子布局.在这篇文章中,将对CSS2的布局进行简单的回忆,并总结CSS3的 ...

  4. Python logger 没打出行数

    # !/user/bin/python # -*- coding: utf-8 -*- ''' subprocess : 需要在linux平台上测试 shell logging ''' import ...

  5. ps技术--批量给图片加水印

    在日常的办公过程中,对于一些比较重要的文件的扫描件需要特殊处理,这时我们就需要给它们加上水印,保证它们的用途唯一,而这些扫描件很多,不可能一一给他们加水印,所以为提高工作效率,我们就可以使用一些小软件 ...

  6. man.go 阅读笔记

    import (     "flag"     "fmt"     "github.com/Sirupsen/logrus"     &qu ...

  7. I/O-----字符输入流

    今天学习了字符流  ,果不其然又和以前的搞混了 package io.day04; import java.io.FileReader; import java.io.FileWriter; impo ...

  8. fileWriter.go

    package blog4go import ( "fmt" "path" "strings" ) // NewFileWriter ini ...

  9. 【数学建模】【APIO2015】Palembang Bridges

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  10. BZOJ_2561_最小生成树_最小割

    BZOJ_2561_最小生成树_最小割 题意: 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条 ...