数据库-语言基础

数据库的一些概念

行为:代表的是对象能做什么

对象 - 对象 之间有没有什么关系?is--a(继承) has(拥有) use(使用)

用户对象:用户名,登录名,密码,性别,家庭地址,联系电话,出生日期,个人照片

数据库中,实际上存放的是对象的属性的值。

老师 - 学生(has)  父母 - 子女(has)
职员 - 项目经理,程序员(继承)

所以数据库中,实际上更多就是研究:关联关系(has) ,继承关系(is--a)

非关系型数据库(NoSQL:redis,hbase,memcache……),存储的时候:就可以直接以对象的方式进行存储

NoSQL != no sql  === NOT Only SQL
NoSQL 看重存储效率(存储是否快捷)
关系型数据 看重的数据之间的关系
稍微复杂点的系统:关系型数据(关系) + NoSQL(快速的存取数据)

主键:专门用来区分表中的数据的唯一标识符 :id ,一旦确定,就不能修改了

主键字段的特点:不能具有任何的业务含义 :身份证,电话号码…… 答案是:都不能

1代身份证:15位    2代身份证:18位

外键:专门用来确定表和表中数据关系的一个字段

关系型数据库中:继承关系(少,特殊场景:职员的类型,角色的分类),关联关系

关联关系:
1对1 例如:中国的夫妻关系    
1对n 例如:某一个老师跟学生      血缘关系下的父母与子女
n对n 例如:系统中的角色和权限
这些关系中,最常见的:1对n   比较少的:1对1  n对n

关联关系往往都是被限制在某些特殊的场景下,才有效

SQL: Structured Query Language 结构化查询语言

作用:一种专门用于数据库客户端 和 服务端进行通讯的一种标准语言,例如:中文,英文。可以帮我们:通过DBMS 向数据库中存储,查询,分析数据,帮我们管理数据库。Java,PHP,.net,python……编写的程序,也可以作为我们的客户端,同样认识SQL。SQL的标准,不断地在进行变化,带来的影响:延伸出很多不同SQL语法的DBMS出来了。MYSQL 的某些SQL语法,跟SQLServer,Oracle是有区别的

SQL不区分大小写,CREATE == create

SQL分类为4种类型的语言

DDL(Data Define Language): 创建,删除,修改(数据库,表,列,索引,存储过程,视图,函数,触发器……) 用到的关键字:create,alter,drop……

DML(数据操作语言): 新增,修改,删除(表中的数据) 用到的关键字:insert,update,delete,trancate……

DQL(数据查询语言): 查询(表中的数据) 用到的关键字:select

DCL(数据控制语言): 给用户授予操作数据库,表的权限 用到的关键字:grant,revoke……

模式创建的实例

定义模式实际上是定义一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,列如基本表,视图,索引
用sa账户登录,创建一个名为studentdb的数据库,然后创建名为sch1的模式
准备工作
create database studentdb
use studentdb
go
create login zhou1 with password=‘mypassword123’
go
create user zhou1 for login zhou1
创建与删除
create schema sch1 authorization zhou1
drop schema sch1

表的基本语法

创建表的语法
Create Table Users
{
vUserName varchar(18) Not NULL,
vPassword varchar(20) Not NULL
}
创建学生表(带约束和主关键字的)
Create Table Student
{
Sno char(10) NOT NULL Constraint PK_stu_NO Primary Key,
Sname char(20) NOT NULL,
Ssex cahr(2) NOT NULL Constraint CK_Stu_Sex Check(Ssex in(‘男‘,‘女‘)),
Sage tinyint Constraint CK_Stu_Age Check(Sage between 1 and 80),
Tel char(15) NOT NULL
}
修改学生表
Alter Table Student Drop Constraint CK_Stu_Age
删除Sage字段上的约束
Alter Table Student Drop Column Sage
删除Sage列
Alter Table Student Add dBirth datetime
添加列
Alter Table Student Alter Column Smajor varchar(20)
修改列字段大小
drop table student
删除先前的学生表

单表查询

概念
SELECT  表上哪些列显示
*表示所有列 
//投影运算 指的是选择部分列数据
//友好列标题 SELECT Sno as 学号
//top关键字 SELECT Top 3 * from Student 只显示前3条数据
FROM 这个表来源
WHERE 这个表的情况,进行筛选
检索年龄为20岁的学生信息
select * from student where Sage=20
and 连接多个条件
select * from student where ssex=‘女‘and sage>21
or 表示达到一个条件即可 ,between and 在什么条件之间, not between and 取反条件
select sno,sname,ssex from student whrer sno between ‘2‘ and ‘4‘
in 检索一系列的取值列表
select * from teacher where tropt in(‘教授‘,‘副教授‘)
distinct 表示不检索出相同信息
select distinct tropt from teacher
like 模糊检索
select sname,sdept from student where sdept like‘%学%‘
@ 一个字符串与一个下划线进行匹配
select sname,sdept from student where emall like ‘%‘
is null 字段为空
select *from student where low is null
is not null 字段不为空
select *from student where high is not null
GROUP BY ,进行分组 按照by之后的选择进行分组统计
对course表,按照必修和选修进行分类,统计每种类别的课程数量
select xklb as 类别,count(cname) as 数量 from course group by xklb 
HAVING
ORDER BY ASC||DESC
ASC表示升序,DESC表示降序
select *from student order by sage desc
select *from student order by sage desc,sno asc在sage相同情况下按snow升序对比排列
COUNT 
count函数返回匹配行数
select count(*) from teacher where tropt=‘教授’
集合函数MAX,MIN,AVG
显示教师的最大最小平均年龄
select max(tage),min(tage),avg(tage) from teacher 
指定条件求和 
select sum(credit) from course where xklb=‘必修‘ 对course表中的必修课的学分进行求和
混合应用
select smajor,ssex,count(sno) from student group by Smajor ,sex order by count(sno) desc
对student表,按照专业和性别进行分组,显示每个专业,每种性别的学生数量,按照学生数量的降序显示结果
select tropt,count(tropt) from teacher group by tropt having count(tropt)>=5
对teacher表,显示职称和对应的认识,要求只有统计人数大于等于5人才显示

多表查询

内连接:内连接根据两个表的共同列进行匹配,两表一般存在主外键关系。通常使用“=”比较运算符来判断两列数据是否相等,通过使用inner join关键字进行表之间的关联
对sc和student表进行内连接,显示学生的学号,姓名,课程号,分数。
语法1:
select student.sno,student.sname,sc.sno,sc.grage   from sc join student    on sc.sno=student.sno
语法2:
select student.sno,student.sname,sc.sno,sc.grage   from sc,student    where sc.sno=student.sno
三张表连接
显示学生的学号,姓名,课程名,考试分数
语法1:
select student.sno,student.sname,course.cname,sc.grage   from sc join student   on sc.sno=student.sno   join course  on  sc.sno=course.sno
语法2:
select student.sno,student.sname,course.cname,sc.grage   from sc,student,course  where   sc.sno=student.sno  and  sc.sno=course.sno
外连接:左连接(left join),右连接(right join),完全外连接(full join)
左外连接
让student表和sc表进行左外连接,即不管是学生是否有选修课程,该学生的信息的都会显示出来
select student.sno,student.sname,sc.sno,sc.grade   from student left outer join sc  on student.sno=sc.sno
右外连接
让sc表和teacher表进行右外连接,显示教师编号,教师姓名,讲师教授的课程号
select teacher.tno,teacher.tname,sc.cno   from sc right outer join teacher  on sc.tno=teachaer.tno
全外连接
让sc表和teacher表进行全外连接,显示教师编号,教师姓名,讲师教授的课程号。
teacher.tno,teacher.tname,sc.cno   from sc full outer join teacher   on sc.tno=teacher.tno
交叉连接:表之间没有任何关联
让学生和课程两张表进行交叉连接
select *from student cross join course

嵌套连接

使用in的子查询
过in引入的子查询结果是包含零个值或多个值得列表,子查询返回结果之后,外部查询将利用这些结果
用any,all修改的比较运算符
可以用all或者any修改引入子查询的比较运算符。some是与any等效的ISO标准,
以>比较运算符为例,>all表示大于每一个值,表示大于最大值。例如,>all(1,2,3)表示大于3
>any表示至少大于一个值,即大于最小值,因此>any(1,2,3)表示大于1
使用exists的子查询
使用exists关键字引入子查询后,子查询的作用就相当于进行存在测试
外部查询的where子句测试子查询返回的行是否存在
子查询实际上不产生任何数据,它只返回TRUE或flase值

例题

等于单个值 查询有某科目考试分数为48分的学生信息
select *from student   where sno=(select sno from sc where grade=48)
in列表 查询在sc表中选修了课程的学生的信息
select *from student   where sno in (select distinct sno from sc) 
子查询得到学生的学号,外部查询根据学号找到学生
not in 查询没有选修过任何课程的学生的信息
select * from student   where  sno not in (select distinct sno from sc)not in表示字段的值不在后面的子查询返回到结果中
在教师列表中,检索比任何一个女教师年龄都大的男教师的信息
select *from teacher where tsex=‘男‘ and tage>all(select tage from teacher where tsex=‘女‘)子查询得到每一位女教师的年龄,外层查询使用“>all”的语法,即比集合中最大值还大
查询选修了B004课程的学生的基本信息
select *from student where exists (select *from sc where   sno=student.sno  and cno=‘B004‘)
查询没有选修X001课程的学生的基本信息
select *from student where not exists (select *from sc where   sno=student.sno  and cno=‘X001‘)
查询与王国在同一个专业学习的所有学生的基本信息
select sno,sname,smajor from student s1 where exists (select *from student s2 where s1.smajor=s2.smajor and s2.name=‘王国‘)

集合查询

并 交 差

前提:select语句必须拥有相同数量的列

并运算
将学生的学号,姓名,与教师的教工号,姓名,在一个检索结果中显示出来
select Sno,Sname from Student
union
select Tno,Tname from Teacher
//union       将多个查询结果合并起来时系统自动去掉重复元组
//union all   将多个查询结果合并起来时,保留重复元组
交运算
对专业名以计算机开头的学生,及年龄为21的学生,用交运算求二者的交集
select Sno,Sname,Sage,Smajor from Student
where Smajor like‘计算机%‘
intersect
select Sno,Sname,Smajor from Student
where Sage=21
差运算
查询专业名以计算机开头的学生,但不包括年龄是21的学生
select Sno,Sname,Sage,Smajor from Student
where Smajor like ‘计算机%‘
except
select Sno,Sname,Sage,Smajor from Student
where Sage=21

数据更新

插入数据

插入单行数据
在course中插入一行数据,四项数据为(‘X004‘,‘计算机前沿‘,2,‘选修‘)
insert into Course(Cno,Cname,Ccredit,XKLB)
values(‘X004‘,‘计算机前沿‘,2,‘选修‘)
插入子查询结果
将学生表中的学号,姓名,性别抽取出来,插入到Teacher表中,所有新插入的数据,职称为讲师
insert into Teacher(Tno,Tname,Tsex)
select Sno,Sname,Ssex,‘讲师‘ from Studnet

查询创建新表

将teacher中职称为教授的信息,存入到一张目前还不存在的experts表
select * into experts from teacher
where Tprot=‘教授‘

更新数据,修改特定行

将course表中编号是B002的课程,学分修改为3分
update course set ccredit=3
where cno=‘B002‘
带子查询的修改
对学生表,将现有的专业字段,用来存放学生选修的第一门课程的编号
update student
set smajor
(select top 1 cno from sc where sc.sno=student.sno)

删除数据

删除满足条件的行
删除course表中编号为B009的记录
delete from course
where cno=‘B009‘
带子查询的删除
对course表中,没有任何学生选修过的课程,执行删除操作
delete from course where cno not in
(select cno from sc)

视图

创建视图

创建一个名为vwscs的视图,是将学生表中院系是计算机科学学院的学生的学号,姓名,性别,专业四个字段显示出来
create view vwscs
as
select sno,sname,ssex,tel,emall from student 
where sdept=‘计算机科学学院‘

更新视图

通过vwscs视图进行数据更新,将杨华的电话修改为13966667777
update vwscs
set tel=‘13966667777‘
where sname=‘杨华‘

查询视图

select *from vwscore where score grade<85

索引

主键索引

唯一索引unique

聚集索引clustered

非聚集索引nonclustered

建立与删除索引

create index
drop index

聚集索引

alter table course2
add constraint pk_course2_cno primary key clustered(cno)

唯一索引

create unique index idxcoursename
on course2(name)

删除索引

drop index idxcoursename on course2
drop index course2.idxcoursename

相关推荐