学习sql的必经问题。
学生表student (id学号 Sname姓名 Sdept所在系)
课程表Course (crscode课程号 name课程名)
学生选课表transcript (studid学号 crscode课程号
Grade成绩)
对以上表进行查寻选修了全部课程的学生姓名
--查询选修了所有课程的学生
--不存在这样的课程该学生没有选修
select *
from student s
where not exists
(
select *
from course c
where not exists
(
select *
from transcript t
where s.id = t.studid and c.crscode = t.crscode
)
)
--拿出一个学生,对任何一个课程,查看该学生是否选修了。如果未选修,返回该课程。
--如果选修了,则查看下一个课程。。。。
--最终,如果返回的所有课程为空的话说明该学生选修了所有的课程。此时输出该学生的信息
终于对这个问题有了深刻一点的认识。 ......
“全部的问题”在上一篇中已经写过一点了。
“仅仅”
:这个问题可以使用多表连接来处理。例如:查询仅仅选修了课程A和课程B的学生的信息,sql如下:
其中表student定义了学生的信息。transcript定义了学生的选课情况。crscode字段表示课程代码。
select s.id
from student s,transcript t1,transcript t2
where s.id = t1.studid and t1.studid = t2.studid
and t1.crscode = 'cs305' and t2.crscode = 'mgt123'
这里是三个表的连接。
“至少”:至少的问题,如果
至少的内容是预先知道的,如:查询至少选修了课程A和B的学生,这样也是可以使用多表连接的。
sql如下:
select t1.studid
from transcript t1,transcript t2,student s
where t1.crscode = 'cs305' and t2.crscode = 'cs315' and s.id = t1.studid and t1.studid = t2.studid
但是如果
至少的内容事先是不知道的,就不能用多表连接了。如:查询至少选修了学生S选修的课程的学生。就是说学生S选修了一些课程,
查查看哪些学生的选课中包含
这些课程的。很显然sql中没有”包含“这样的谓词。但是可以将这个需求转换为其他的描述方式:
不存在这样的课 ......
在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) from bbc
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。
通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。
HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后对组记录进行筛选。
让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。
SQL实例:
一、显示每个地区的总人口数和总面积:
SELECT region, SUM(population), SUM(area)
from bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。 ......
闲来写下with cube的用法
cube运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。
先看下表:
我们以id聚合查询出平均分
这一条SQL语句与上面唯一不同之处即为多了后面的 with cube,而结果却是比前面更多了一条结果,它同样是按类ID的平均分,不同是又多了最后一个结果null 4,这个是什么呢,我们来看第一段,with cube 是 包含所有可能的组合,我们根据ID分,它帮我们按ID查出平均总,同时再帮我们计算出所有的平均分,即该表ID为1与2 的平均分。这个我们可以在很多地方应用,如按性别统计工资,按部门统计业绩……
其实实际中,我们往往就得到更准确的数据,即~上面结果应该以小数形式为好~其实上面结果也是不准确的,SQL将其四舍五入了~
我们式式办法~
我们发现有了,有了小数,但再细心一看,结果是不对的,这样SQL相当于就将前一步的操作结果转换成小数,直接在4后面加了二个0,这显示不对,那么SQL为什么会这样,我们又如何解决,其实在表voteDetails中,我们的v ......
启用c2审核命令如下:
EXEC sp_configure 'c2 audit mode', '1' RECONFIGURE
SQL Server以128KB大小的块为单位把数据写入跟踪文件。因此,当SQL Server非正常停止时,最多可能丢失128
KB的日志数据。可以想象,包含审核信息的日志文件将以很快的速度增大。例如,某次试验只访问了三个表,跟踪文件已经超过了1MB。当跟踪文件超过
200MB时,C2审核将关闭旧文件并创建新文件。每次SQL Server启动的时候,它会创建一个新的跟踪文件。如果磁盘空间不足,SQL
Server将停止运行,直至我们为审核日志释放出足够的磁盘空间并重新启动SQL Server实例。在SQL
Server启动的时候,可以使用-f参数禁用审核。
......
首先打开SQL Server Management Studio,建立一个数据库,建立好数据库后选择你的数据库名,右键--任务--导入数据库
打开SQL导入和导出向导--下一步--数据源选择(Microsoft Access)--选择你的ACCESS数据库然后下一步
关键的一步在“选择源表和源视图”这里,选择表--编辑映射--选择“启用标识插入”。
在这里每一个表都要单独编辑映射,所有表都启用标识插入然后下一步。
导入完成OK! ......
首先打开SQL Server Management Studio,建立一个数据库,建立好数据库后选择你的数据库名,右键--任务--导入数据库
打开SQL导入和导出向导--下一步--数据源选择(Microsoft Access)--选择你的ACCESS数据库然后下一步
关键的一步在“选择源表和源视图”这里,选择表--编辑映射--选择“启用标识插入”。
在这里每一个表都要单独编辑映射,所有表都启用标识插入然后下一步。
导入完成OK! ......