SQL初级第三课(上)
先建立一个表
create table Student --学生
(
Sno char(3) primary key , --学生学号
Sname char(8) not null, --学生姓名
Ssex char(2) not null, --学生性别
Sbirthday datetime, --学生生日
class char(5) --班级
)
create table Course --课程
(
Cno char(5) primary key, --课程编号
Cname varchar(10) not null, --课程名称
Tno char(3) references Teacher(Tno) not null --教师编号
)
create table Score --得分
(
Sno char(3) references Student (Sno) not null, --学生学号
Cno char(5) references Course (Cno) not null, --课程编号
Degree Decimal(4,1) --分数
)
create table Teacher --教师
(
Tno char(3) primary key, --教师编号
Tname char(4)not null, --教师姓名
Tsex char(2) not null, --教师性别
Tbirthday datetime, --教师生日
Prof char(6), --教师职位
Depart varchar(10) not null --教师隶属部门
)
insert into Student values (108,'曾华','男',1977-09-01,95033);
insert into Student values (105,'匡明','男',1975-10-02,95031);
insert into Student values (107,'王丽','女',1976-01-23,95033);
insert into Student values (101,'李军','男',1976-02-20,95033);
insert into Student values (109,'王芳','女',1975-02-10,95031);
insert into Student values (103,'陆君','男',1974-06-03,95031);
insert into Course values (3-105,'计算机导论',825);
insert into Course values (3-245,'操作系统',804);
insert into Course values (6-166,'数字电路',856);
insert into Course values (9-888,'高等数学',831);
insert into Score values (103,3-245,86);
insert into Score values (105,3-245,75);
insert into Score values (109,3-245,68);
insert into Score values (103,3-105,92);
insert into Score values (105,3-105,88);
insert into Score values (109,3-105,76);
insert into Score values (101,3-105,64);
insert into Score values (107,3-105,91);
insert into Score values (108,3-105,78);
insert into Score values (101,6-166,85);
insert into Score values (107,6-166,79);
insert into Score values (108,6-166,81);
insert into Teacher values (804,'李诚','男',1958-12-02,'副教授','计算机系');
insert into Teacher values (856,'张旭','男',1969-03-12,'讲师','电子工程系');
insert into Teacher values (825,'王萍','女',1972-05-05,'助教','计算机系');
insert into Teacher values (831,'刘冰','女',1977-08-14,'助教','电子工程系');
Drop table Student;
Drop table Teacher;
Drop table Course;
Drop table Score;
------------------------------------------------------------我是华丽的分割线------------------------------------------------------------------
--外键
外键是相对于主键来设置的,他的设法参照上表,在create table中设置 references 相对的表(表中的列)
例:上表的Course (Tno char(3) references Teacher(Tno)) 这个Tno我们就是为了外键,他是相对于teacher表的Tno的外键,相对来说teacher的Tno
就是Course中Tno列的主键。要加外键表首先得有主键表,所以我们嵌入表的时候要先嵌入主键再嵌入外键,不可把表全部圈起来一起执行,次序是student--
teacher--course --score。同样的要想先删除主键表数据必须先删除外键表数据,作为外键的数据源的列,必须要是一个唯一的键(这里列必须是主键或者是unique)。
外键是受其主键约束的,不可以选取主键没有的选项。
------------------------------------------------------------ 我是华丽的分割线 ------------------------------------------------------------------
--聚合函数
聚合函数是针对数据列计算求和或计数等一系列的算术性操作。
{
count(), --计数
sum(), --求和
avg(), --求平均数
max(), --找最大值
min() --找最小值
}
聚合函数()括号里放的是列,只有count可以 count(*),返回值是一个数值类型。
聚合函数只能单独显示。如果要命名此列用as + 命名,此外group by可以结合聚合函数使用。
例:查询“95031”班的学生人数。
想法很简单让程序筛选 student表中的class列是95031的学生信息,
--select * from student where class='95031'; --这样我们获得了*,*代表95031的所有学生信息,
然后接收*,用count函数
加工* 数出有多少个*,既count(*);
-- select COUNT(*) from student where class="95031"; --返回3,显示3
例:查询每门课的平均成绩。
查询平均成绩不难,成绩都在score表的degree列中,那么
select avg(degree) from score; --显示出无论课程所有分数的平均分,
但是这是所有课的平均分,得到意义不大,那么怎么样得到每一门课的平均成绩,要使每一节课分组也简单
select cno from score group by cno;
(思考:我们上节介绍了group by分组,前面我们讲过group by分组
的要与显示的一致,否则无意义,那么现在配合聚合函数可以吗)我们可以观察到他在列中以课程编码Cno来分组那么
select avg(degree),Cno from score group by Cno;
在这里程序会先按照Cno分组,然后根据分组来得到相应组的degree再求平均分并显示,
------------------------------------------------------------ 我是华丽的分割线 ------------------------------------------------------------------
连接查询
{
--inner 是默认的
--left 把左表显示全
--right 右表有关系的显示关系,有关系的显示空
+
Join 表on表
}
例:查询所有学生的Sname、Cno和Degree列
这里我们会发现Sname,Cno和Degree存在于不同的表里面,要用Sname要调用Student表,要用Cno和Degree要调用Score表。这里我建议初学者可以在纸上画出
这些表里包括了哪些列,这样可以更直观的来给我们信息,如图:
Student Course Score Teacher
Sno Cno Sno Tno
Sname Cname Cno Tname
Ssex Tno Degree Tsex
Sbirthday Tbirthday
class Prof
Depart
通过上表我们可以看出通过上表我们可以很清晰的看出Score表与Student表里面都存在Sno列,那么我们让这两列的Sno相等,让Score的Sno对应显示Student的
Sname列
select Sname,Cno,degree from student,score where student.sno=score.sno;
这样也是行的通的,但是这里产生了一个笛卡尔积,这样加大了计算机的工作量,虽然对少量数据的分析我们没有任何感觉,但是对大量数据分析的时候是有很大影响的,考虑到运行效率问题我们要应用连接查询;
同样的问题思路可以按照我们上述来想,但是写法如下
select Sname,Cno,degree from score
inner join
student on score.sno=student.sno; --(这里你可以认为计算机把score表和student表连接在一起并生成了一个新表,里面有两个表的所有内容)
例:查询所有学生的Sname、Cname和Degree列。
select sname,cname,degree from student,course,score where score.cno=course.cno and score.sno=student.sno;
select sname,cname,degree from score
join course on score.cno=course.cno
join student on score.sno=student.sno
------------------------------------------------------------ We will return in a moment------------------------------------------------------------
SQL初级第三课(上)的更多相关文章
- SQL初级第三课(下)
我们续用第三课(上)的表 辅助表 Student Course Score Teacher Sno ...
- shellKali Linux Web 渗透测试— 初级教程(第三课)
shellKali Linux Web 渗透测试— 初级教程(第三课) 文/玄魂 目录 shellKali Linux Web 渗透测试—初级教程(第三课) 课程目录 通过google hack寻找测 ...
- 【第三课】ANR和OOM——贪快和贪多的后果(上)
恼人的ANR 早先年用Android的时候,就连很多知名的app也总是莫名其妙崩溃,好像手机快的时候会崩溃,手机卡的时候app会卡死.卡死的时候会弹出来一个框,询问是要结束app还是继续等待.这就是A ...
- 【Web探索之旅】第二部分第三课:框架和内容管理系统
内容简介 1.第二部分第三课:框架和内容管理系统 2.第二部分第四课预告:数据库 第二部分第三课:框架和内容管理系统 上一课我们介绍了服务器端的编程语言,有PHP,Java,Python,Ruby ...
- 你真的会玩SQL吗?三范式、数据完整性
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- CodeIgniter框架入门教程——第三课 URL及ajax
本文转载自:http://www.softeng.cn/?p=74 这节课讲一下CI框架的路由规则,以及如何在CI框架下实现ajax功能. 首先,先介绍CI框架的路由规则,因为CI框架是在PHP的基础 ...
- 【第三课】ANR和OOM——贪快和贪多的后果(下)
Out of Mana,法力耗尽. 内存就像法力,耗尽了就什么都不能做了.有时候一个应用程序占用了太大的内存,超过了Android系统为你规定的限制,那么系统就会干掉你,以保证其他app有足够的内存. ...
- NeHe OpenGL教程 第三课:颜色渲染
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板
BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...
随机推荐
- Yahoo!网站性能最佳体验的34条黄金守则(转载)
1. 尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数 ...
- 25个增强iOS应用程序性能的提示和技巧(中级篇)(3)
25个增强iOS应用程序性能的提示和技巧(中级篇)(3) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...
- Android-----overridePendingTransition的使用
1 Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画. 它包括两个部分:一部分是第一个activity退出时的动画:另外一部分时第二个activity进入时 ...
- Delphi中DLL的创建和使用
参考:http://blog.csdn.net/ninetowns2008/article/details/6311663 结合这篇博客:http://www.cnblogs.com/xumenger ...
- 【openGL】关于画点
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- Oracle性能优化之SQL语句
1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...
- markdown使用总结
# markdown简介> Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面. —— [维基百科]( https://zh.w ...
- UI背景构建
个中原因不是很明白 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=& ...
- Linux下autoconf和automake使用
转载:www.cnblogs.com/itech/archive/2010/11/28/1890220.html
- Linux学习笔记(11)软件包管理
Linux中的软件包分为源码包(脚本安装包)及二进制包(RPM包.系统默认包).其中源码包的优点是: 1)源码包是开源的,如果有足够的能力,可以修改源代码: 2)可自由选择所需的功能: 3)源码包需编 ...