首页 > 代码库 > 2.sql基础(知识点)

2.sql基础(知识点)

数据库:数据库软件:mssqlserver,oracle,db2, ACCESS,SQLITE

数据库文件:分数据文件(MDF)和日志文件(log)

?

班级名称:(四期班训练营)长度可变,有中文----n var char

性别字段:如果考虑"男,女"那么就用bit类型,smallin类型

手机:长度 手机号11位 ,座机咋办,010-88888888 ,0871-6666666????????

身份证号码:长度:不变18位,有木有中文,没有,

Char

会重复,

?

分类

备注和说明

类型

说明

二进制数据类型

存储非子符和文本的数据

Image

可用来存储图像

文本数据类型

字符数据包括任意字母、符号或数字字符的组合

Char,8000

固定长度的非 Unicode 字符数据。固定长度的字符串相对于可变长度的字符串来说效率要高一些,在数据长度固定的情况下优先选用固定长度,省去了计算长度的过程,提高效率

?

Unicode字符会吧所有字符都当两位来-存储

Varchar,8000

可变长度非 Unicode 数据

Nchar,4000

固定长度的 Unicode 数据

Nvarchar,4000

可变长度 Unicode 数据

Text

varchar(max)

存储长文本信息(指针,2G)

varchar(max),大字符串类型可以保存非常多的字符,但是对于这种类型的数据DBMS经常将它们保存到单独的空间中,这就导致了数据的保存和加载速度比较慢,因此除非必要,否则不要使用。

Ntext

nvarchar(max)

Nvarchar(max)代替

日期和时间

日期和时间在单引号内输入

Datetime

日期和时间

数字数据

该数据仅包含数字,包括正数、负数以及分数

int

smallint

整数

float

real

数字

货币数据类型

用于十进制货币值,money 和 smallmoney 数据类型精确到它们所代表的货币单位的万分之一。

Money(C#:double)

?

Bit数据类型

表示是/否的数据

Bit

存储布尔数据类型(1-true 0-false)

?

分离数据库:将当前数据库文件和数据库引擎的关系断开,没有任何关系了,这样我就可以随意的拷贝,剪切

在数据库文件上右键à任务à分离,à勾选"删除连接",à确定

?

脱机:告诉数据库引擎,暂停操作当前数据库,知道你重新"联机",,也可以随意拷贝,剪切

?

附加:把已经分离的数据库文件,重新让数据库引擎管理,重新把管理关系建立上

?

?

主键:

标识一张表里面数据行,到底哪一行是哪一行,

?

没有主键的时候,如果有重名的,重号的

比如,一家公司,给所有员工编号,a0003 b0002,但是某天人事喝酒了,就弄错了,

员工编号就重复了

身份证:有重复的,

银行卡号:升位 19 20

?

主键分为:逻辑主键和业务主键

?

业务主键就是具有真实意义的,就比如身份证,银行卡,员工编号,一但变化,难以维护

?

逻辑主键:没有任何实际含义,只为了标识当前列在当前数据表里的唯一标识,由系统自身维护

不可以手动编辑(特殊情况下除外)

?

主键列:就是不能插入重复数据(默认带索引)

?

如果数据行数量大于int的最大取值范围,那么说明,这张表的数据已经超过几十亿行了

每一张表都推荐有主键列,主键列,设置标识

最终这个列就会是不会有重复的数据,自动编号的

?

主键标识列:就算数据行被删除了,增长的数字也是按照原来的增长,

?

主外键:

作用:就是减少重复数据,

????把一个表中重复是重复的数据提取出来,单独放在另外一个表中,这样,在原来的表中只要存储一个指向提起出的数据的表的行,

?

在数据库里面,在外键上右键,可以添加 主外键约束(约束外键值,只能是主键值有的值),但是,这已经不推荐使用了

?

例子:

书:书名,价格,分类ID

分类表:id,分类名字,所在区域

SQL语句

基础语句

selEct * FROM dbo.Student WHERE Name=‘张a‘----大小写问题

字符串用单引号表示

关键字大小写不区分

注释用/* */,--

单等号判断

?

创建数据库,表

create database MySchool

on

(

--括号一定是圆括号

name=‘MySchool_data‘,--数据库名称

filename=‘d:\MySchool_data.mdf‘,--物理文件名

size=5mb,--初始大小,

maxsize=10mb,--最大大小

filegrowth=15% --主文件增长率

)

log on

(

name=‘MySchool_log‘,--日志文件名

filename=‘d:\MySchool_log.ldf‘,--日志物理文件名

maxsize=4mb,--最大大小

size=2mb,

filegrowth=1mb

)

go

创建数据表

CREATE TABLE Student

(

id int identity(1,1) primary key,

NAME NVARCHAR(16) NOT NULL,

age INT NOT NULL

)

?

DELETE FROM Student

删除所有数据

TRUNCATE TABLE Student

清空表,重置表(把表重置会刚刚创建时候的状态,自增列,重新从1开始了)

以上两者效率有很大差别,如果用delete会产生很多的日志,truncate 就只会产生一行日志

DROP TABLE Student

直接删除表,不仅仅是数据,连表都不见了

?

?

增删查改

数据库运行流程:

增加语句

INSERT INTO dbo.Student

(name,gender,Address,Phone,Age,Birthday,CardId,CId)

VALUES

(‘王五‘,1,‘北京海淀,中关村‘,‘13888888888‘,20,‘2012-01/01‘,‘111111‘,2)

?

  1. 增加的时候。Bit字段要用 "0,1"表示true和false
  2. 时间字段用单引号包括,但是里面还是要遵循基本的时间格式‘2012-01-01‘
  3. INSERT 语句中列的数目要和 VALUES 后面的值的数目一样
  4. 不能为标识列插入数据(特殊情况下可以,SET IDENTITY_INSERT)

直接拖拽"列"就可以快速的插入列名

?

INSERT INTO dbo.Student

VALUES

(‘王五‘,1,‘北京海淀,中关村‘,‘13888888888‘,20,‘2012/01/01‘,‘111111‘,2)

除了表示列,其他所有字段的值,都要写出来,而且还要按照顺序写出来

?

INSERT INTO dbo.Student

(Name,Gender,Age,Birthday,CardId)VALUES(‘王五5‘,1,20,‘2012/01/01‘,‘111111‘)

可以只给指定的列插入数据,不能为null 的字段必须填,除非有默认值,默认值用default,不用打单引号

?

INSERT INTO dbo.Student (Name,Gender)VALUES(‘钱七‘,0)

不能为phone插入null值

INSERT INTO dbo.Student (Name,Gender,Phone)

VALUES

(N‘钱七①②βδΟου????íスヌフ叁叁‘,0,10000)

在插入特殊字符的时候,字符串前面需要加上大写的N

?

INSERT INTO dbo.Student

VALUES

(‘小明‘,default,N‘地址‘,default,20,‘2010-10-10‘,‘100000‘,2)

在插入数据的时候,可以显示的告诉数据库使用该字段的默认值

?

INSERT INTO dbo.Student

VALUES

(‘张‘‘四‘,DEFAULT,N‘地址‘,default,20,‘2010-10-10‘,‘100000‘,2)

插入的数据中有单引号的时候,需要输入两个单引号 "‘‘"

?

修改语句

UPDATE dbo.Student SET Age=25

修改了student表中所有行的age值

UPDATE dbo.Student SET Age=18 WHERE Name=‘陈珊‘

修改了student表中name是陈珊的age值

UPDATE dbo.Student SET Age=19,gender=0 WHERE id=1

修改了student表中name是陈珊的age值和gender值

?

UPDATE dbo.Student SET Phone=‘10010‘ WHERE Name=‘钱七‘ AND Gender=0

Where后面可以有多个条件判断,多个条件中间用"空格and空格"隔开

?

UPDATE dbo.Student SET Address=‘a‘ WHERE Name=‘王五‘ AND Gender=1 OR Name=‘王五6‘

--3

UPDATE dbo.Student SET Address=‘c‘ WHERE (Name=‘王五‘ OR Gender=1) AND Name=‘王五6‘

--4

在数据库执行的时候,and条件是优先于or条件执行的

UPDATE dbo.Student SET age=age+1

UPDATE dbo.Student SET age+=1 --2005 不支持

Set值的时候,可以取出原来的值

?

= < > != <>

UPDATE dbo.Student SET Address = ‘未知‘ WHERE Address = NULL--这个是不行滴

UPDATE dbo.Student SET Address = ‘未知‘ WHERE Address IS NULL

UPDATE dbo.Student SET Address=‘北京‘ WHERE Address IS NOT NULL

NULL 值的特殊判断

UPDATE dbo.Student SET address = ‘男儿国‘ WHERE Gender!=0

不等于"!="

?

写法:update 表名 set 列名=值 , 列名=值 where 条件 条件中间用and和or连接 and优先于or执行

?

关于密码的大小写问题

?

约束

非空约束---就是不能为 null

主键约束(PK) primary key constraint---唯一(不重复的) 且 不为空

????唯一约束+非空位数

?

唯一约束 (UQ)unique constraint 唯一,允许为空(null),但只能出现一次

?

默认约束 (DF)default constraint 如果不给值,默认值

检查约束 (CK)check constraint 范围以及格式限制

在设计界面,字段上右键,有"check约束",点击之后

?

外键约束 (FK)foreign key constraint 表关系—主外键关系

????添加主外键关系,外键的值必须来自主键表

查询语句

SELECT TOP 10 * FROM dbo.Student--取出前10条的所有数据

SELECT TOP 10 Name,Gender,Age FROM dbo.Student--取出前10条的部分数据

?

SELECT TOP 10 PERCENT * FROM dbo.Student---取出前面10%的数据,所有小数,是进位的,21/10=2.1 3

--19/10 1.9 2

?

Distinct

去除重复行,但是是针对于查询之后的结果,来去除重复行,

它是判断结果数据中,整行数据,只要有一个列不相同,那么就不认为是相同数据

?

Top和distinct结合使用的话,distinct是先执行的,先去除重复项,然后在去除想要的条数

聚合函数

Count,取得满足条件的数据行的 行数

?

Where between and

BETWEEN and 在数据库内部是做过特殊优化的,执行效率比> and < 等这种方式快

SELECT * FROM dbo.Student WHERE Age BETWEEN 25 AND 30 ---25的有,30也有

相当于Age>=25 AND Age<=30

?

小分页:

SELECT * FROM dbo.Student WHERE id BETWEEN num-1*5+1 AND num*5

1:1-5

2:6-10

?

IN关键字

判断一个列的值是否在后面括号内,

?

SELECT * FROM dbo.Student WHERE Gender IN (‘男‘,‘女‘)--正确

SELECT * FROM dbo.Student WHERE Gender IN (0,1,2)--错误,两者数据的类型不同

?

模糊查询

使用系统已经定义好的匹配符,按照定义的规则匹配数据,如果能匹配就查出来

?

通配符,匹配符:_ % [] ^

_ 代表一个任意字符

% 代表零个或多个任意字符

[] 代表一个字符 的 取值区间

^ 配合[]使用,表示不是这个区间,

数据库不兼容的,sqlserver可以用,其他数据库要用not like

?

里面不区分大小写

效率很低

如果在匹配时,就要匹配这几个符号,那么需要把符号放在[]中,^不用,因为,它不放在[]中就默认是普通字符了

?

空值判断

SELECT * FROM dbo.Student WHERE Address <> NULL错误

?

SELECT * FROM dbo.Student WHERE Address IS NULL判断是为null 的

?

SELECT * FROM dbo.Student WHERE Address IS NOT NULL判断不是为null 的

?

SELECT Name,ISNULL([Address],‘地球‘) FROM dbo.Student

Isnull可以判断后面是否为null,为null就用第二个参数代替

SELECT Name,ISNULL(Age,20) FROM dbo.Student

?

数据排序

?

ORDER

将当前查询出来的数据结果,进行排序,排序按照后面指定的列排序

SELECT * FROM dbo.Student ORDER BY Gender DESC

DESC倒序排序(降序),ASC正序排序(升序)

9876543210 0123456789

汉字,用拼音的首字母排序,升序是从a-z,降序是从z-a

Order by 是放在where后面的

系统默认的是升序排序,关键字:ASC,如果想倒过来,关键字:DESC

如果是根据多个列排序,那么两个之间用逗号隔开

排序会先按照前面一个排序之后,再按照后面一个排序

?

Group by

最数据进行分组,分组之后的数据就是"分组信息",和原来的表里的信息就没有联系了

分组之后,可以取到分组根据,就是根据什么字段分组,就能取得字段的名字,

能使用聚合函数

Having

对分组信息进行过滤,因为分组之后的信息和原来的表信息没有关系了

Having可以用的之后出现在group子句中的列,还有聚合函数

?

执行顺序

查询某张表,如果表里面有1000W数据,我们只查出100条数据

à再对着100条数据进行分组,可以筛选分组,

如果指定列,结果集就更小了,这里只有100条指定列的数据

取出前面几条,或者取出重复

?

最进行排序,排序就只需要对100条数据排序了

?

类型转换

Cast(待转换的值 as 想要转换成的类型)

CAST(1 AS NVARCHAR(10))

?

联合结果集

连接两个结果集

  1. 两个集合必须具有相同的列数
  2. 列具有相同的数据类型(至少能隐式转换的)
  3. 最终输出的集合的列名由第一个集合的列名来确定

SELECT Name,Age,Gender FROM dbo.Student--19

UNION

SELECT Name 姓名,Age 年龄,Gender 性别 FROM dbo.Student19

Union默认会去除重复行

?

SELECT Name,Age,Gender FROM dbo.Student--19

UNION All

SELECT Name 姓名,Age 年龄,Gender 性别 FROM dbo.Student19

Union all 不会去除重复行

一般都是使用union all

批量插入

INSERT INTO dbo.Student (Name, Pwd, Gender, Address, Phone, Age, Birthday, CardId, CId)

SELECT Name, Pwd, Gender, Address, Phone, Age, Birthday, CardId, CId FROM dbo.Student

将一个结果集当成值插入数据库,结果集的列数量,类型,都要一样

Select * into Score2 from Score where 1<>1

可以复制一张表的结构信息,没有主键

2.sql基础(知识点)