数据库基础


我是菜鸟,数据库很重要。从头来复习一下吧。不足的地方给我留言我改。
都是基础的东西。只要把基本的东西记住,然后一步一步的去分析。
1.E-R模型。实体关系型数据库。不过云计算来了以后又出现了一种新的数据库叫非关系型数据库。
2.解决问题:持久化储存,优化读写,保证数据的有效性(设置的有效性检查)。
3.所有的移动智能终端用的数据库都是(文档型数据库)sqlite,电话本什么的都存在
4.我们不能直接去操作那个物理文件,只能和那个服务打交道,服务内部再和物理文件打交道这叫服务型数据库,就是我们的sql server。。服务型比文档型的效率,要高。
5.数据库设计::三范式:列不可拆分,唯一标示,引用主键(两个表建立关系)。
6.关系及储存:一对一,一对多,多对多(创建一个中间表)。
7.两种连接方式,如果是sql server身份验证,远程连接的时候要把这个配置工具中的tcp/ip协议的状态设置为启动。
8.数据库要移动的时候,先做一个任务的分离。
9.任务,生成脚本,可以快速实现内容的导出。到时候直接把这些脚本一运行就行。
10.把一个列设为标识,在列的属性上,标识规范是标识,标识增量。一般会将标识列设置为主键。标识的种子就是标识的第一个值。
11.数据类型::char/varchar/nvarchar 有n表示Unicode编码,每个字符占一个字节;没有n表示非Unicode编码,英文或者数字占一个字节,中文占两个字节。字符串用单引号,所以出现中文的时候就要n。char如果你的字节长度不够他会给你补空格。超过会报错。varchar(5)存多少就是多少不会变。
11.decimal(5,2)这是用的比较多的一种数据类型。表示一共五个数字,两个小位。100 =》 100.00 只保证有两位小数987654.923=》654.92。小数位的位数绝对不能该。

约束::
唯一值约束:12.在数据库的列上面右键,索引/键,唯一键。然后选择一个列,你让那一列不能重复。这样一一来,它的值就不能重复了,这个数据如果是重复的,往里放的的时候就会报错。他只是表示做一个检查。
默认值约束:13: 不填的时候默认给我一个值过来。在属性的位置上有。
检查约束:check
外键约束:列右键,找到关系,然后添加表和列规范。外键被决定的那一端是外键表,起决定的那一端是主键表。

插入:::
insert into 表名 (UserId,Name,LoginName,Pwd)values(‘5’,123,31321,1);
如果不写列名也可以。为某些列赋值,就必须写明列名 。
一次性插入多个值, insert into classInfo values('青龙'),(白虎),(朱雀),(玄武)
修改::::
update 表名 set 列名1=值1,列名2=值2 where。。。


删除:
delete from 表名 where
如果有一个列设置了标识列,自增量为1,当你删除了以后,id不会接着,而是跳过。不连续,因为已经删了。
truncate table userinfo 清空表的数据。既删除了,还重置了,所以排序还是从1开始。如果这个表中的列已经作为其他表的外键,再删就会报错。

查询:::
为列起别名用AS,起了别名后,就不能用原来的名字了。
查询前n部分的数据;
select top n 列名:表示查看前n行
select top n percent 列名;表示查看前百分之几的数据。
已经开始对行的筛选了。
排序:::::desc表示由大到小 asc表示有小到大。
.....from 表 order by 列名1 desc,列名2 asc
先按照前者排,前者出现相等了,再按照后者排。


消除重复行:select distinct cid from StudentInfo 消除Cid这个列中所有重复的行。

where条件,也是对行进行的筛选。where后面写的表达式必须返回一个bool类型的值。

where id between .. and ..表示在一个连续的范围内。 in表示在一个非连续的范围内。
where id in (1,3) 就是id等于1或者等于3的列。如果等于2,则不行。
where id=1 or id=3 or name="heihei"
where id between 3 and 8 and id=1

where not (id between 3 and 8) and (id=1) 要求id不在3到8之间的,并且id=1的东西。

---聚合函数--null 不参加计算
select COUNT(*) as count1 from StudentInfo where cid=1
计算所有 cid=1的数量。
COUNT(列名) 如果这个列中的一个值为null则这个值就不会被统计。
所以用* 是这一行都加入计数,有一行就记一个数,有一行就记一个数。
也就只有count()里面可以用*,其他的函数就不能用*了

MAX最大值min最低值。AVG()

select MAX(scorevalue)frome ScoreInfo 找到scorevalue中的最大值。
----
...from 表1 inner join ScoreInfo on subId=SubjectInfo.sId where sTitle='语文'

两个表连接
...from 表1 inner join 表2 on uid=sub.sid(条件) where sTitle='语文'

---
首先来说聚合函数会把所有的行合并成一行来存放计算后的结果,要想每一行都显示就用开窗。
over开窗:
select ScroeInfo.*, avg(scorevalue) over()
from ScoreInfo
就是在聚合函数后面写一个over()就是将这个信息显示到原来的每一行里面去。
在排名函数中的使用

分组(比over函数更常用):::就是将一个列相同的,分到一个组里面去发,聚合函数就会按一个组去计算。
统计男女生人数
select sGender,COUNT(*) from StudentInfo group by sGender
虽然你不能拿到某一人的信息,但是可以通过聚合函数拿到这一组人的聚合函数后的信息。分组之后也可以拿到依据分组的这个列。如果有where的话,where也在group前。
group by subId,stuId 就是先将stuId进行分组,分组以后再将每个组里面的stuId进行分组。
在结果列中只能出现分组依据列和聚列。

联合查询(记得面试的时候这个问题我没有回答的不好。):
多个结果集按照规则进行合并。
结果集列数要一致,对应列的类型要一致。
union:将多个结果集进行合并,同时消除重复行。按照第一列进行升序排序。并集
union all:会将结果集进行合并。但不会消除重复行。也不会排序 。并集
except:就是从第一个结果集中排除第二个结果集后所剩下的东西。差集
intersect:交集


快速备份:select 列名 into 备份表名 from 源表名
只能向一个不存在的表中插入数据,表的结构会一致,但是不包含约束。如果加个top 0就是一条数据都不要,只把表的结构复制过去。或者加一个绝对不会存在的条件。

向一个存在的表中插入数据: insert into 表名1(列名) select cTitle form 表2 就是把表2中cTitle的数据赋值给表1的()中的列名里面去。

函数::::
SELECT CAST(89.0000000 as decimal(4,1)) cast是将一种类型转换成另一种一类型。转换方式如上。转换成int什么的都可以。结果是89.0
select convert(decimal(4,1),89.0000)和上面的结果一样,用谁都行

select 1+“1”的查询结果是2。如果是1+“q”就会报错。
select cast(1 as CHAR(1))+"1"的结果就会成为11.
》》字符串函数:
ascii(求字符的ascii值),char(根据ascii值转到字符)
left,right,substring:字符串截取。 len返回字符串长度 lower,upper:转小写,大写 ltrim,rtrim 去左右空格 注意,索引是从1开始,不是从零。
getDate(获取当前日期)
dateAdd(日期加) dateDiff(日期减) datePart(取日期的某个部分) year,month,day 这三个是取日期的简写
例如:select datepart("Dayofyear",GETDATE()) 第一个是参数,是你取的那一部分
具体操作请参考帮助文档。
练习:以“2016-1-1”的格式来显示时间,不要补零了。

显示前百分之五十的数据
select top 50 percent * from StudentInfo order BY cid desc

求学生英语的最小值
select MIN(tsenglish)as 最低英语成绩 from TblScore
或者
select top 1 tsenglish from TbScore where TSEnglish is not null order by TSEnglish asc

and TSAge between 20 and 30 其中包括20和30.三十和二十之间
and TSAge between (2,3,4) 。2或者3或者4,也可以是字符串。

模糊查询(都是针对字符串的操作。)
查找姓张的人
select * from student where Name like '张%'
%字符出现一次或者多次
_仅代表一个字符
['','']代表列中的任意一个字符。

[^charlist] [!charlist]不在列表中的任意一个字符
特殊字符在[]里面就是不转移。
如果想用排除法不要like后面的东西,就用 not like。如果说一个列是不是null不用‘=’,而是用 is

select sGender,cid,总和=COUNT(*) from StudentInfo group by sGender , cid
分组的时候注意的事项,select的东西只能是按什么分组的列,聚合函数也是分组后的每个组的聚合。
查询的过程中条件用的是where,分组之后就用 having COOUNT(*)>3. where中不能使用聚合函数。必须使用having


常用的辅助命令:
set statistics time on/off 消息栏显示执行的时间。
Ctrl+e 执行
Ctrl+r 隐藏消息栏
Ctrl+l 计划任务,对sql语句进行分析。(选中代码后)
数据库的null表示的是不知道的意思。


分页查询GetListByPage

原文地址:https://www.cnblogs.com/liuwenxu/p/5502689.html