你还不会SQL Server数据库吗?一篇让你学会SQL数据库基础(从零开始超详解)

目录

SQL Server数据库简介:

1,主要特性

2,SQL安装

3,SQL数据库创建

4,关于数据库的操作

4.1,SQL数据库的修改和删除

4.1.1 修改

4.1.2 删除

4.2,SQL数据类型

4.2.1 数字类型

4.2.2时间类型

4.2.3字符串类型

5,关于表的操作

5.1 创建表

5.2 修改,删除表结构

5.2.1 修改表结构

5.2.2删除表结构

5.3 定义主键外键

5.3.1 增加主键(上面都有)

5.3.2 删除主键

5.3.3 添加外键

5.3.4 删除外键

5.4 新增表数据

5.5 查询表结构

5.5.1 Distinct\Top用法

5.6 修改表数据

5.7 删除表记录

6,语句

6.1 条件限制while

6.2 between语法

6.3 子查询in

6.4 子查询EXISTS

6.5返回记录排序

6.6 关联查询

6.6.1 inner join

6.6.2 left join

6.6.3 right join

7,函数

7.1 聚合函数avg(),sum()

7.1.1 avg()

7.1.2 sum()

7.2 聚合函数min(),max()

7.2.1 min()

7.2.2 max()

7.3 count()和sum()函数

7.3.1 sum() 

7.3.2 count()

7.4 len()函数

7.5 随机数产生

7.6 getdate()和getutcdate()函数

7.7 convert()函数

7.8 datediff()函数

7.9 datepart()函数

7.10 charindex()和patindex()函数

7.10.1 charindex()函数

7.10.2 patindex()函数

7.11 stuff()函数

7.12 substring()函数

7.13 left()和right()函数

7.14 ltrim()和rtrim()函数

7.15 upper()和lower()函数

7.16 replace()函数

7.17 replicate()和space()函数

7.18 reverse()函数

7.19 cast()函数

7.20 case()函数


SQL Server数据库简介:

SQL是一种关系型数据库,是一个可扩展的,高性能的,为分布式客户机/服务器计算所和设计的数据库管理系统

1,主要特性

  • 高性能设计

  • 系统管理先进,支持图形化管理工具,支持本地和远程的系统管理和配置

  • 强壮的事务处理能力

  • 支持对称多处理结构,存储过程,ODBC,并具有自主的SQL语言

2,SQL安装

这个地方不好意思,搞错了,这个地方是linux的centos版本的下载。如果需要下载虚拟机可以看看

镜像文件:http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/

VM虚拟机下载地址:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.4-2249910.exe

推荐安装教程:https://blog.csdn.net/sunshine1_0/article/details/80839430?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

VM虚拟机密钥可以百度直接搜索:VM虚拟机各版本密钥;

上面VM虚拟机链接密钥(下面三个应该都可以):

1Z0G9-67285-FZG78-ZL3Q2-234JG
4C4EK-89KDL-5ZFP9-1LA5P-2A0J0
HY086-4T01N-CZ3U0-CV0QM-13DNU

3,SQL数据库创建

下面都用的是语句创建,没有展示如何界面话创建

create database Tset01          --数据库名称
on Primary
(
name ='Test01_1',       --数据文件名称
filename='E:\SQL数据库\Test01_1.mdf',        --保存地址
size=10mb,           --起初大小
maxsize=100mb,          --最大大小
filegrowth=5mb               --增长速率
)
log on
(
name ='Test01_2',       --日志文件名称
filename='E:\SQL数据库\Test01_2.ldf',
size=5mb,
maxsize=50mb,
filegrowth=5mb
)

4,关于数据库的操作

4.1,SQL数据库的修改和删除

4.1.1 修改

alter database oldname
modify name=newname;

alter database 数据库名称
modify file(
name ='将要修改的文件名称',                 --这个文件名称不能修改     
size=20mb,
maxsize=50mb,
filegrowth=1mb
);

exec SP_HELPDB 数据库名称;            --查看数据库的内部结构

alter database Tset01             --修改名字
modify name=Test02;

alter database Test02       --修改属性
modify file(
name ='Test01_1',
size=20mb,
maxsize=50mb,
filegrowth=1mb
);

exec SP_HELPDB Test02;         --查看数据库结构

4.1.2 删除

drop database 数据库1,数据库2,数据库3;(需要删除几个中间用空格隔开即可)

create database Test;       --创建一个新数据库
drop database Test;      --将新创建的数据库删除

4.2,SQL数据类型

数据类型是一种属性,用于指定对象可保存的数据的类型:整型数据,字符数据,日期和时间,二进制字符串等等。

4.2.1 数字类型

数据类型 描述 存储
tinyint 允许从 0 到 255 的所有数字。 1 字节
smallint 允许从 -32,768 到 32,767 的所有数字。 2 字节
int 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 4 字节
bigint 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 8 字节
decimal(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
numeric(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
smallmoney 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 4 字节
money 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 8 字节
float(n) 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 4 或 8 字节
real 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 4 字节

4.2.2时间类型

数据类型 描述 存储
datetime 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 8 bytes
datetime2 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 6-8 bytes
smalldatetime 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 4 bytes
date 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 3 bytes
time 仅存储时间。精度为 100 纳秒。 3-5 bytes
datetimeoffset 与 datetime2 相同,外加时区偏移。 8-10 bytes
timestamp 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。

4.2.3字符串类型

数据类型 描述 存储
char(n) 固定长度的字符串。最多 8,000 个字符。 n
varchar(n) 可变长度的字符串。最多 8,000 个字符。  
varchar(max) 可变长度的字符串。最多 1,073,741,824 个字符。  
text 可变长度的字符串。最多 2GB 字符数据。

5,关于表的操作

5.1 创建表

主键:大多数表有一个主键,主键由表的一列或者多列组成。主键始终是唯一的,表中的任何主键都不能重复。

create table 表名称(
属性 数据类型 primary key not null,
属性 数据类型(自行添加是否可以为空),
..................
);

如果需要添加多个主键,则在前面不用写primary key,在最后加上primary key(属性1,属性2,.....)
primary key(ID,name)

create table Student(
ID int primary key not null,
name varchar(10) not null,
age int not null,
claseID int
);

5.2 修改,删除表结构

5.2.1 修改表结构

如果使用界面话修改,此处可能出现修改不成功的情况,修改后系统不让保存;

我找到的一个方法链接:https://jingyan.baidu.com/article/a17d5285761845c098c8f282.html

  • 更改字段类型长度

alter table 表
alter column 字段名 类型的长度;

  • 更改字段类型

alter table 表
alter column 字段名 更改后的类型;

  • 添加not null约束

alter table 表
alter column 字段名 数据类型 not null;

  • 设置主键

alter table userint
add constraint 主键名称 primary key(字段名)

  • 更改字段名

EXEC sp_rename '字段.字段名',
'更改后的字段名','column'

  • 添加字段名

alter table 表 add 字段名 字段类型 default null

--更改字段长度
alter table Student
alter column name varchar(100);

--更改字段类型
alter table Student
alter column age float;

--添加not null约束
alter table student
alter column classID int not null;

--设置主键(前提是表结构中没有设置主键)
alter table student
add constraint Kname primary key(name);

--更改字段名
EXEC sp_rename 'student.age',
'ages','column';

--添加字段名
alter table student
add num int default null

5.2.2删除表结构

drop table 表1,表2,表3;(需要删除几个,就添加几个表,中间用逗号隔开)

--删除表结构
drop table student;

5.3 定义主键外键

  1. 主关键字是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。一个表中只有一个关键字。主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。又称主码,并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。
  2. 外键表示了两个关系之间的相互联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字
  3. 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。

5.3.1 增加主键(上面都有)

alter table 表名
add constraint 主键名 primary key(属性);

5.3.2 删除主键

alter table 表名 drop 主键名

5.3.3 添加外键

alter table 将要加入外键表
add constraint 外键名字 foreign key(增加外键字段) references 主键表(主键字段);

alter table student
add constraint F_classid foreign key(classid) references class(classid);

5.3.4 删除外键

alter table 表名 drop constraint 外键名

5.4 新增表数据

  • 插入单行数据

insert into 表名 (栏位1,栏位2,栏位3......)
values(值1,值2,值3);

  • 插入多行数据

insert into 表名 (栏位1,栏位2,栏位3......)
values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3)......;

--插入一行数据
insert into Student1 (ID,name,age,claseID)
values(1,'小明',12,11);

--插入多行数据
insert into Student1 (ID,name,age,claseID)
values(2,'小红',13,3),
(3,'小刚',14,3),
(4,'小陈',15,4),
(5,'小李',16,4);

5.5 查询表结构

select 字段名称(*代表全部)  from 表

select * from Student1;
select name,id from student1;

5.5.1 Distinct\Top用法

  • Distinct(去除重复的值)

select  distinct 字段名称 from 表 

  • Top(前n行数据)

select top 行数 字段名称  from 表

select distinct * from Student1;
select top 3 name,id from student1;

5.6 修改表数据

update 表 
set 字段名 = 新数据

update student1 
set id = 5
where name='小明';   --限制条件,修改哪一条数据

5.7 删除表记录

delete from 表

delete from student1
where name='小明'     --限制条件,删除哪一行

6,语句

6.1 条件限制while

  • 精确限制条件

where 字段=值

  • 模糊限制条件

where 字段like'%值%'        --表示带有值的数据,%放在那一边表示那一边的字可有可无

where name like'%红%';          --带有红字的数据

6.2 between语法

用法限制条件表达式,指定表达式范围值

  • (not) between 值1 and 值2;
select distinct * from Student1
where age not between 13 and 15;

6.3 子查询in

用于限制条件表达式,指定表达式范围值

  • (not) in(值1,值2,值3.......)       --或者扩号里面可以写语句
select distinct * from Student1
where age in(13,14,15);

6.4 子查询EXISTS

  • exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回true或false
  • existe指定一个子查询,检测行的存在
select *from student          --显示两表中共同的数据
where exists(select *from class where Student.classid=Class.classID)

6.5返回记录排序

order by 字段名 (asc/desc)          --asc升序,desc降序,不加的话默认为升序;多个限制字段按从前往后

select *from student
order by classID asc,age desc

6.6 关联查询

6.6.1 inner join

交叉关联,只返回两个表中联结字段相等的值

select *from 表1
inner join 表2
on 表1.字段=表2.字段

6.6.2 left join

左关联,返回包含左表中的所有记录和右表中联结字段相等的值

select *from 表1
left join 表2
on 表1.字段=表2.字段

 

6.6.3 right join

 

右关联,返回包含右表中的所有记录和左表中联结字段相等的值

select *from 表1
right join 表2
on 表1.字段=表2.字段

select *from student        --交叉关联
inner join class
on student.classid=class.classID

select *from student         --左关联
left join class
on student.classid=class.classID

select *from student        --右关联
right join class
on student.classid=class.classID

7,函数

7.1 聚合函数avg(),sum()

7.1.1 avg()

  • 返回组中各值的平均值。其中忽略null值
  • 计算字段类型必须为数字型(整数,小数)
  • select avg(字段) from 表 

7.1.2 sum()

  • 返回表达式中所有值的和。其中忽略null值
  • 只能用于数字列
  • select avg(字段) from 表 

select avg(Student.age) as'年龄平均' from student
select sum(Student.age) as'年龄总和' from student

7.2 聚合函数min(),max()

7.2.1 min()

  • 返回表达式中最小值
  • 忽略任何null值
  • 计算字段类型可以为数字型或字符型
  • select min(字段) from 表 

7.2.2 max()

  • 返回表达式中最大值
  • 忽略任何null值
  • 计算字段类型可以为数字型或字符型
  • select max(字段) from 表

select min(Student.age) as'年龄最小' from student
select max(Student.age) as'年龄最大' from student

7.3 count()和sum()函数

7.3.1 sum() 

同上

7.3.2 count()

  • 返回组中的项数
  • 其中忽略null值
  • 计算字段类型必须为整型
  • select count(字段) from 表 

 select count(Student.age) as'字段数' from student

7.4 len()函数

  • 返回指定字符串表达式的字符数
  • 其中不包含尾随空格
  • 若要返回用于表达式的字节数,使用datalength()函数
  • select len(字段)  from 表
select len(Student.age) as'字符数' from student
select datalength(Student.age) as'字节数' from student

7.5 随机数产生

  • select rand()      可以得到一个随机小数
  • select floor(rand()*N)          返回小于或等于所给数字表达式的最大整数
  • select ceiling(rand()*N)          返回大于或等于所给数字表达式的最大整数
  • eg:    floor(8.122)=8;ceiling(8.122)=9
select rand()
select floor(rand())
select ceiling(rand())

7.6 getdate()和getutcdate()函数

  • getdate()   返回当前数据库的系统时间值,返回值的类型为datetime
  • getutcdate() 返回当前国际标准时间值,返回值的类型为datetime
select getdate() as '当前时间'
select GETUTCDATE() as '国际标准时间'

7.7 convert()函数

  • 该函数是把日期转换为新数据类型的通用函数
  • 可以用不同的格式显示日期/时间数据
  • convert(长度,日期,格式)
格式数字
对应格式
0 或 100 (*) mon dd yyyy hh:miAM(或 PM)
101 mm/dd/yyyy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 mon dd, yy
108 hh:mm:ss
9 或 109 (*) mon dd yyyy hh:mi:ss:mmmAM(或 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
13 或 113 (*) dd mon yyyy hh:mm:ss:mmm(24h)
114 hh:mi:ss:mmm(24h)
20 或 120 (*) yyyy-mm-dd hh:mm:ss[.fff]
21 或 121 (*) yyyy-mm-dd hh:mm:ss[.fff]
126(***) yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
130* dd mon yyyy hh:mi:ss:mmmAM
131*

dd/mm/yy hh:mi:ss:mmmAM

select CONVERT(varchar(50),getdate(),101)
select CONVERT(varchar(50),getdate(),102)
select CONVERT(varchar(50),getdate(),103)
select CONVERT(varchar(50),getdate(),104)
select CONVERT(varchar(50),getdate(),105)
select CONVERT(varchar(50),getdate(),106)
select CONVERT(varchar(50),getdate(),107)
select CONVERT(varchar(50),getdate(),108)
select CONVERT(varchar(50),getdate(),109)
select CONVERT(varchar(50),getdate(),110)

7.8 datediff()函数

  • datediff()函数返回两个日期之间的天数

  • datediff(日期类型,日期1,日期2)

  • dateadd()函数返回两个日期之间的天数

  • dateadd(日期类型,天数,日期)

select dateadd(YY,5,'08-12-29 16:25:46.635')
select dateadd(MM,5,'08-12-29 16:25:46.635')
select dateadd(DD,5,'08-12-29 16:25:46.635')
select dateadd(HH,5,'08-12-29 16:25:46.635')

7.9 datepart()函数

  • 用于返回日期/时间的单独部分,比如年,月,日,小时,分钟等;返回类型是一个int类型
  • datename()同样是返回一个日期/时间的单独部分,返回类型是一个varchar()型
  • day(),Month(),year()
select DATEPART(yy,GETDATE())
select DATEPART(mm,GETDATE())
select DATEPART(dd,GETDATE())
select DATEPART(hh,GETDATE())
select DATEPART(mi,GETDATE())
select DATEPART(ss,GETDATE())

select DATENAME(yy,GETDATE())      --varchar类型

select YEAR(GETDATE())
select month(GETDATE())
select day(GETDATE())

7.10 charindex()和patindex()函数

7.10.1 charindex()函数

  • 返回字符或者字符串在另一个字符串中的起始位置
  • charindex(寻找的字符(串),字符串,[开始的位置(根据需要添加)])
  • 如果找到,则返回一个整数,整数即为位置;如果没有找到,则返回0

7.10.2 patindex()函数

  • 该函数支持通配符,不加%则需要完全相同
  • eg:%a,则需要结尾是a;a%,则需要开头是a;%a%,可以正确找到a的位置
  • patindex('%寻找字符(串)%',字符串)
select charindex('c','abcdefg')
select charindex('c','abcdefg',5)

select PATINDEX('%g','abcdefg')
select PATINDEX('g%','abcdefg')
select PATINDEX('%g%','abcdefg')

7.11 stuff()函数

  • 用于删除指定长度的字符,并可以在指定的起点处插入另一组字符,返回类型是一个字符串型
  • stuff(列名,开始位置,长度,替代字符串)
select stuff('aabbccddee',5,4,'')
select stuff('aabbccddee',5,4,'111111')

7.12 substring()函数

  • 用于截取指定长度的字符串
  • substring(列名,开始位置,截取长度)
select substring('aabbccddee',5,4)

7.13 left()和right()函数

  • left()返回字符串从左边开始指定个数的字符
  • left(列名,长度)
  • right()返回字符串从右边开始指定个数的字符
  • right(列名,长度)
select left('aabbccddee',5)
select RIGHT('aabbccddee',5)

7.14 ltrim()和rtrim()函数

  • ltrim()删除起始空格后返回字符表达式
  • ltrim(列名)
  • rtrim()删除尾随空格后返回字符表达式
  • rtrim(列名)
select ltrim('   aabbcc  ddee   ')
select rtrim('   aabbcc  ddee   ')

7.15 upper()和lower()函数

  • upper()返回将小写字符数据转换为大写的字符表达式
  • upper(列名)
  • lower()返回将小写字符数据转换为大写的字符表达式
  • lower(列名)
select upper('aabbccddee')
select lower('aabbccddee')

7.16 replace()函数

  • 用一个字符串值替代出现的所有指定字符串
  • replace(列名,被替代值,替代值)
select replace('aabbccddeeaa','aa','11')

7.17 replicate()和space()函数

  • replicate()以指定的次数重复字符表达式
  • replicate(字符表达式,次数)
  • space()返回指定个数的空格表达式
  • space(次数)
select replicate('aa',5)
select space(5)
select replicate('aa',5)+space(5)+replicate('aa',5)

7.18 reverse()函数

  • 用于倒置字符串中各个字符的位置
  • reverse(字符串)
select reverse('aabbccddee')

7.19 cast()函数

  • 用于将某种数据类型的表达式显示转换为另一种数据类型
  • cast(字符串 as 数据类型)
select cast(111 as varchar(10))
select cast(111 as varchar(10))+'aaaa'

7.20 case()函数

 

  • 是一种简单的条件判断转换的一个函数

  • 简单case函数:case 字段 when '1' then 'a' when '2' then 'b' else 'c'end

  • case搜索函数:case when 字段='1' then 'a' when 字段='2' then 'b' else 'c' end

select *,case id when '1' then '一号' when '2' then '二号' else '其它'end
from student

select *,case when age<12 then '儿童' when age<15 and age>=12 then '青少年' else '少年'end
from student

 

你可能感兴趣的:(SQL,Server数据库)