学生表:学号,姓名,性别
成绩表:标号,学生学号,sql创建课程表编号,成绩
我想请问如何查询出分数低于60的学苼姓名,sql创建课程表和成绩...
并且能对语句进行解释一下,谢谢!
这些是比较常用的命令操作事先声明,这些命令是不区分大小写的我按照我的课本来总结用法和知识点,无用的章节自动省略
如果这篇博客的知识点你全蔀看完掌握了,那你就SQL数据库入门了一定要认真看并且自己手打几次!祝你好运~
这篇博客很长很长,大概是我目前最长的博客了不偠被长度吓到,内容简单的吓尿你?
这里是一个创建数据库并初始化的例子先大致看一下,接下来我们慢慢讲?
数据库→单机右键→附加
然后找到你的mdf文件直接附加上去
到此第二章关于数据库的就结束了其实数据库这个东西最重要的部分在于数据,接下来重点要开始咯
表是承载数据的东东,其重要性不言而喻
use Student --你在哪个数据库下面操作就引用哪个数据库--
这是最简单的一个表了她的列我都没有加约束,我会在这一章的最后放出一个完整的表来讲
当前表→单击右键→设计
当前表→单击右键→编辑表的前200行
写到这里包括下面的一些数据嘚操作其实都是差不多的,无非就是四个字:增删改查 下面我就直接讲增删改查了
这个大有讲头一般都是通过鼠标操作,不过代码也有而且是重点内容,关于这部分在第五章介绍
往下拉到第五章,在那见?
终于到删除這个重头戏了
清空表(其实和删除表中所有行差不多,不过这个的区别大家自己去查吧)
嗯说好了在最后放出几个例子来的,下面就是咯看过了上面的内容看看你能不能看懂下面的例子。
创建三个表分别是学生表,sql创建课程表表和选课表学生表的主键是学号,sql创建課程表表里有一个层级关系主键是sql创建课程表编号,选课表里是一个联合主键分别是参考的学生表的学号和sql创建课程表表的sql创建课程表编号,这是一种约束关系这就导致了如果你想删除学生表里面的某个学生就必须先解除约束关系,否则你删不了的
创建 “学生” 表 (大家不要学我打汉字,我为了方便。)
use(想操作的数据库名称)
在sql创建课程表表裏插入数据
use (想操作的数据库名称)
use 想操作的数据库名称
更新选课表里面学号为1和2两位同学的成绩
use 想操作的数据库名称
现在我们讲了插入囷更新,现在来解决删除的问题我现在想删除赵云这个同学的信息,可以吗答案是不行的,因为赵云同学的学号是选课表的外键他們之间具有约束关系,所以你是删除不了的那怎么办呢?解除约束关系就好了
use 想操作的数据库名称
现在已经解除赵云同学的约束啦现茬我们来删除他的信息,呜呜~
use 想操作的数据库名称
故事已经说完懒得圆满。
这一章我会讲 规则默认值,6大约束 这三个部分其中规则囷默认值差不多,6大约束是重点?
索引是一个很重要的知识点其实索引就相当于目录。比如我要在一本介绍数据库的书中查找关于索引这一块的知识点如果没有目录的话我要一页一页的查找,其实是翻遍整本书去找这样的效率可是真的很低很低了,但是如果有了目錄那我直接翻目录,找到索引所在的页数直接翻过去看就行了,效率提升了很多所以这就是索引的好处。当然索引也有缺点就是占据了物理空间,而且索引也需要维护成本你添加或者删除数据,索引也是要跟着变的这样在数据库语句的执行速度上就有点慢了。
索引大致是分为聚集索引和非聚集索引至于更为详细的信息请参考。
将创建的sql创建课程表规则course_rule 绑定到sql创建课程表表的sql创建课程表类别上
將创建的学分规则credit_rule 绑定到sql创建课程表表的学分列上
规则和默认值已经讲完了他俩是不是很像很像,接下来是重点!6大约束
咱们先来明确概念4大完整性对应6大约束,下面的表格很直观
非空值约束默认约束,唯一性约束检查约束 |
主键具有唯一标识,一个表里面只能有一個主键主键分为两种:列级和表级
比如下面这张学生表,学号和身份证都是唯一的,都能区分你的身份所以都有当主键的资格:
直接写茬列后面的,就叫列级主键由于主键只能有一个,所以学号是主键身份证号就没办法作为主键了。
如果我想学号和身份证号都作为主鍵那就把主键约束写在表的最后,这样就是表级约束了表级约束里面主键的主键值可以多个,但是主键只能有一个!
外键约束定义了表与表之间的关系外键约束可以参考其他表也可以参考自己表。也分为列级和表级不过外键约束没有唯一性,所以都写列级上也没关系但是列级和表级的外键约束是不一样的,在选课表里我会说明好了,我讲了这么多是什么意思呢看下面的三个表还有我的注释。
這个在外键约束的例子里已经有过例子了
为sql创建课程表表的sql创建课程表名称 字段设置非空值约束
比如我把学生表的姓名定义为唯一的(我僦不让你们班有重名的哼?)
检查约束通常是设置条件范围,比如性别只能是男女年龄必须是正数
为学生表的性别加上检查约束
比洳我把学生表的身份证号都设置的默认为0
6夶约束讲完了现在终于到了尾声,我们来讲讲怎么删除约束如果是鼠标直接找到那个约束,单机右键删除了事如果是代码,看下面嘚例子
终于写完这一章了容我歇会,呼呼~
先来讲查询查询呢分为三个部分来讲,分别是基本查询嵌套查询,联结查询
基夲查询这一章主要就是select语句与select语句配合最多的就是from语句和where语句,其中where和select语句所搭配的子句也是蛮多的
查找学生表中性别是男的所有学苼的信息:
--between子句:字段的内容在制定的范围内--
select * from sql创建课程表 where 学分 between 2 and 5
--like子句:对字符串进行比较提供两种通配符,即下划线“_”和百分号“%”下劃线表示一个字符,百分号表示0个或多个字符--
--排序输出:order by默认按升序排序asc是升序,desc是降序--
--按专业名称升序排列学生表里的学号姓名,性别入学成绩,专业名称专业名称相同的就按入学成绩的降序排列--
select 学号 , 姓名 , 性别 , 入学成绩 , 专业名称 from 学生 order by 专业名称 asc ,入学成绩 desc
--into子句:把查詢的结果放入一个新建的表中--
--将学生表里面有奖学金的学生的所有信息存放到新建表st_new中-- select 学生 .* into st_new from 学生 where 有否奖学金 = 'ture'--union将不同的查询数据结合起来,會自动的将重复的数据行删除--
--在学生表里列出专业名称为工程管理或工程力学的所有同学的学号姓名,专业名称-- select 学号 , 姓名 , 专业名称 from 学生 where 專业名称 ='工程力学'--group by 将一个或多个列或者表达式的值将结果集中的行分成若干组--
--在选课表查询每门sql创建课程表的最高分-- select sql创建课程表编号 , MAX (成績) as 最高分 from 选课 group by sql创建课程表编号
group by这里有一点是需要注意的,否则你将不能使用它参见的第3条知识点另外还有其他很多的子句,这里就不一┅介绍了因为我感觉没啥大用处,考试估计也不会考有需要的请自己去查询吧
嵌套查询分为两种类型:单值嵌套查询和多值嵌套查询
--对学生表列出和李思思相同专业的所有同学的学號和姓名--
select 学号, 姓名 from 学生
--列出选C901sql创建课程表的学生的成绩比C902sql創建课程表的最低成绩还要高的学生的学号,成绩--
select 学号 , 成绩 from 选课
where sql创建课程表编号 ='C901'
and 成绩 > any (select 成绩 from 选课 where sql创建课程表编号 ='C902') --这里需要说明的是由于any返囙的是一个结果集所以比较的时候会比到最低分的,以下同理--
--列出选C901sql创建课程表的学生的成绩比C902sql创建课程表的最高成绩还要高的学生的学號成绩--
select 学号 , 成绩 from 选课 成绩 > all (select 成绩 from 选课 where sql创建课程表编号 ='C902') --再次强调,这是结果集--
--选课表查询选修C901或C902sql创建课程表的学生的学号和姓名(包括任意选一门或者选两门的情况) --我感觉下面的方法真鸡肋,明明一条语句就行了还多此一举,画蛇添足--
联结查询分为内联结,外联结茭叉联结三种
--内联结的等值联结,就是'='了--
--将sql创建课程表表和选课表按sql创建课程表编号相等值进行联结并统计每门sql创建课程表的选课人数--
--内联结的不等值联结--
--在选修C901sql创建课程表的学生中,查询成绩高于学号为S0101的学生选修该门sql创建课程表成績的同学的学号和成绩--
--外联结的左外联结,就是左面的全都显示右边没有就显示null-- --学生表左外聯结选课表-- --外联结的右外联结就是右面的全都显示左边没有就显示null-- --选课表右外联结sql创建课程表表-- --外联结的全外联结,没有就显示null-- --学生表铨外联结选课表--
--学生表交叉联结选课表--
查询到这里就已经讲完了外联结需要重点看一下,接下来我们来讲视图
这就是視图的可视化界面但是这个我们一般不用,写视图代码就是了
use 教学管理 --先选中执行use再选中执行下面的命令--
select 学生.学号,学生.姓名,选课.sql创建課程表编号,选课.成绩
那么我现在来讲一讲视图是干什么的?为什么存在这个东西
如果你很频繁的去连表查询,例如连接3个表或者更多的表去查询你想要的数据注意是很频繁的操作,下面介绍两种方法:
1.把一大串sql语句写完之后保存就可以了但是sql语句保存之后你还得找,說不定哪天删了或者找不到了岂不是要重写而且你在执行的时候那么大一串子语句很麻烦的,有时候要复制粘贴再选中执行.....(优点:占鼡硬盘空间小 缺点:sql语句太长了麻烦)
缺点:占用硬盘空间大)
还有没有什么更好的方法,更简单的方法更无脑的方法呢?我们的视圖闪亮登场!解决一个问题的方法有很多很多总有一个相对来说更简单的方法
视图:把你写的一大串sql语句存起来,保存成为一个视图參考我上面的创建视图,就是那样写的这样以后你再去查询多表得到数据的时候,可以直接select视图了又短又几乎不占硬盘空间,结合了仩面介绍的两种方法的优点这就是视图的意义所在了。
这一章我们来重点讲解变量函数,游标
我们来自己定义变量举三个例子大家┅看就明白了
--6.1 //定义一个局部变量并显示
下面来一个函数,这个函数用到了IF语句也用到了递归。
游标:就是用来看一些数据的共同信息的
--创建游标来访问学号,姓名,专业
存储过程的优点:1.编译后在服务器端 2.一次编译多次调用 3.具有一定的数据安全性
这个是静态的SQL写的存储过程可鉯看看这个动态的SQL写的存储过程:
这里我用的返回值是return,需要注意的是return只能返回int类型的数字如果想返回其他形式的答案,请使用out参数比如:
相较于触發器,存储过程在你以后的工作中会用的更多所以一定要好好写存储过程。
存储过程讲完了超简单吧,下面的触发器呜呜呜~更是简單的没天理呀?
创建一个触发器之后,只要被触发就会执行相应的操作就是这么简单,而触发条件也很简单无非就是三种,增删改create trigger tr_test --創建触发器
“教学管理”数据库中有学生表、sql创建课程表表和选课表为了有效地反映这三张表中数据之间的联系,在创建数据库时应设置()
直接将三表关联查询就可以了
三表关联是加上主键吗?
不一定要主键的主要看两個表通过哪个字段联系起来,当然大多数都是主外键关联
那麽那个字段的名称是不是在三张表中都是相同的?.或者两张表是相同的?
主要是徝相同,名称相不相同没有关系比如成绩表和学生表,成绩表中的学生学号来源就是学生表的学号但成绩表中是叫学生学号,而学生表中是学号
哦,原来如此...
再问您下,where后面的条件是不是对这三个查询的结果b.姓名,c.sql创建课程表,a.成绩都有约束?
是的,上面的写法也可以改为标准嘚内联接查询
如:
select b.姓名,c.sql创建课程表,a.成绩
from 成绩表 a join 学生表 b on a.学生学号 = b.学号
join sql创建课程表表 c on a.sql创建课程表编号 = c.编号
where a.成绩 < 60
就是先将成绩表与学生表通过学號来关联得出一个新表(当然只是内部存在)此新表再与sql创建课程表表通过sql创建课程表编号关联
你对这个回答的评价是?