既然要学数据库,肯定要先安装软件
https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
新手就用免费的。
第3步时是打开网页,要去下载数据库的UI管理软件,安装好 SSMS
一,怎么连数据库
1登陆页面》服务器类型》数据库引擎
2服务器名称》点下拉 <浏览更多...> 》网络服务器》数据库引擎》选择服务器名》确定
3身份验证》windows 身份验证》连接
//这里在对象资源管理器里应该能看见服务器对象,且有绿色运行三角标志(库桶)。
//技巧:有失效的服务器名可以删除,服务器名称下拉框鼠标停放,按Delete键;
二,创建登陆账号
1安全性》登陆名》右键新建登录名》//如sql2017密码sql2017
2你会发现sql2017密码sql2017还是登陆不上。
3你要在对象资源管理器里的服务器》右键 重新启动
4这样断开数据库,你重新用sql2017密码sql2017就能登陆了。
5在服务器名称后面加端口号登陆 ,1433这样是登陆不上的,解决办法是
SQLServer网络配置》协议》tcp/ip》打开,并且重新启动服务(在sqlserver服务,sqlserver里)
三,库(新建)用于保存表
.mdf是主数据文件
.ndf是次要数据文件
.ldf是日志文件
use master --使用系统库
go
--执行
if exists(select * from sysdatabases where name='HMI')
drop database HMI
go
--重复的话,删除再重建
create database HMI --新建 HMI
on primary
(
--数据库的逻辑文件名(就是系统用的,必须唯一)
name='HMI_主',
--数据库物理文件名(绝对路径)
filename='D:\DB\HMI_主件.mdf',--主数据文件名
--数据库初始文件大小(一定要根据你的实际生产需求来定)
size=20MB, --初始大小
--数据文件增值量(也要参考文件本身大小)
filegrowth=1MB --增长
)
,
(
name='HMI_副',
filename='D:\DB\HMI_副件.ndf',--次要数据文件名
size=20MB,
filegrowth=1MB
)
log on
(
name='HMI_日志',
filename='D:\DB\HMI_日志log.ldf',--日志文件名
size=10MB,
filegrowth=1MB
)
go
三,表(新建表)
use HMI
go
--使用数据库
if exists(select * from sysobjects where name='tb表1')--搜索 表名:表1
drop table tb表1 --删除 该表1
go
--去重复
create table tb表1 --新建 表1
(
列0 int identity(1000,2) primary key , --自动增长1000起,每次加2,主键唯一性
列1 varchar(50) not null, --自动长度,最大50
列2 varchar(18) check(len(列2)>=6 and len(列2)<=18) not null, --不能为空
列3 varchar(20) not null,
列4 char(11) not null, --固定长度11
列5 nvarchar(100) default('地址不详') --住址 默认值
)
go
--创建 表2
if exists (select * from sysobjects where name='tb表2')
drop table tb表2
go
create table tb表2
(
编号 int identity(10,1),
分类 varchar(20)primary key not null
)
go
约束表(新建)
--创建 约束表3 (表3的内容必须包含表12才能创建对象)(外键必须是主键唯一性)
if exists (select * from sysobjects where name='tb表3')
drop table tb表3 --删除 表3
go
create table tb表3
(
编号 int identity(1000,1) primary key,
名字 nvarchar(50) not null ,
内容 nvarchar(500) not null,
课时 int not null,--课时
学分 int check(学分>=1 and 学分<=30) not null, --学分
表2约束 varchar(20) references tb表2(分类) not null, --外键约束
表1约束 int references tb表1(列0) --次表唯一约束
)
go
--表3建立后,就不能删除表1和表2了。需要先删表3
增 增对象
--===================================
--指向要操作的数据库
use db盘A
go
--表1 内容--标识列将不能被赋值
--当我们启用标识列的时候,不能显式的插入值
insert into tb表1(列1,列2,列3,列4)--列5 ‘地址不详’
values('学生01','1234567890','赵老师','15800000001'),
('学生02','123456','钱老师','15800000002'),
('学生03','123456','孙老师','15800000003'),
('学生04','123456','李老师','15800000004'),
('学生05','123456','祁老师','15800000005')
insert into tb表1(列1,列2,列3,列4,列5)--
values('学生007','1234567','祁老师','1589502007','江苏')
--==================================
--表3有表2和表1的外键约束
--表3的外键值,需要表2和表1已有的元素
--表3
insert into tb表3(名字,内容,课时,学分,表2约束,表1约束)--次表唯一约束
values('名字很好','内容不知道',400,10,'化学','1044')
删 删对象
--===================================
--指向要操作的数据库
use db盘A
go
delete from tb表1 where 列5='地址不详'
改 改对象
update tb表1 set 列2 ='1222233',列3='禽老师' where 列0=1044
查 查对象
--===================================
--指向要操作的数据库
use db盘A
go
select * from tb表1 --查询这张表
--查询 tb表1 的所有列名
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='tb表1')
--===============================
--联合查询:查询2张表的所有列值
select * from tb表3 inner join tb表2 on 表2约束=分类
select tb表3.编号,名字,内容,课时,学分,表2约束,表1约束
from tb表3
inner join tb表2 on tb表3.表2约束=tb表2.分类
再核对一下效果
四,连接数据库
1 using System.Data.SqlClient; //鼠标点下SqlClient然后按F1键,可以查看所有成员
2 System.Data.SqlClient.SqlConnection conn库连接; //这个对象用于连接数据库
3 SqlCommand cmd = new SqlCommand(textBox6.Text, conn库连接);//sql命令,库连接
4 增,删,改,流程如下:
conn库连接.Open();
textBox7.Text = cmd.ExecuteNonQuery().ToString();//执行
conn库连接.Close();
5如果是查询的话,cmd对象需要用另一个方法。(cmd包含conn且需要打开状态。)
//object obj1 = cmd.ExecuteScalar();//返回第一行第一列
//sql数据.sql第1行1列 = obj1.ToString();
SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);//带关闭的读取
/
SqlDataReader reader = (SqlDataReader)obj;
while (reader.Read())
{
list1.Add(new tb课类()
{
id = Convert.ToInt32(reader[0]),//第1列
//id = Convert.ToInt32(reader['列1']),//第1列
name = reader[1].ToString(),//第2列
});
}
reader.Close();// 必需关闭
return list1; // 返回集合
标识列(自动增长列) 从1000开始,每次加2
1表》右键,设计》在需要的列位置》右键,插入列
2 设置列名为标识列,数据类型设置int
3 在列属性处,找标识规范》展开》标识增量 2 》标识种子 1000
外键(外键约束)作用是 外表的属性内包含这个值,主表才能插入这个对象。
1表》右键设计》右键,插入列》取名:w外键课类
2 w外键课类》右键,关系》添加》然后点击“表和列规范”后面的小按钮
3 弹出另外一个窗体让我们选择主键表和列,记住要选择相同的,选好之后点击确定。
4 展开INSERT和UPDATE规范,在更新规则和删除规则有四个选项,分别是“不执行任何操作”、“级联”、“设置为NULL”、“设置默认值”。
外键约束:就好比2个表之间的关系。
工资条一张表格,员工信息一张表格。
这2表格横向是员工对象,比如100个员工,就有100行。
这2表的列向,肯定有员工姓名这一栏。那姓名就可以设置主外键关系了。
员工信息表里(姓名设置主键),工资条表格里(姓名设置外键)。这样造工资的时候,工资表添加姓名如张三。这时,员工信息表里(姓名)没有张三这一行。那工资表里就添加不了这一行。因为没有这个员工,发什么工资!
在《数据库关系图》新建,把需要的表添加进去,这样就能看见他们的关系了。也可以修改他们的关系:鼠标在列名处,左键拖动到另一个表的列名处,会弹出对话框,设置主外键。
表,右键,表视图,修改自定义,添加说明,这样就方便查看了。
补充说明
表3关联外键表1和表2,此时表1和表2就不能被删除了。需要先删除表3
表3添加对象时,外键列数据必须是表1和表2已有的元素,否则添加失败
对于列主键有null出错,先删除列,再添加新列并且设置 default 默认值
SQL语句的用法
最重要的语句莫过于查询了。 select
查数据我们肯定是想获取工资条这样的表格对吧。
比如3个员工一起去查工资,财务只愿意给出这3个人名字的工资表。
工资表有很多列,比如名字,天数,夜班天数,白班天数,基本工资,加班工资,医保,补贴,扣税,应发工资,和实发工资。
这3个人去查工资,肯定只要显示需要的信息:名字,实发工资
select 名字,实发工资 from 工资表
// select 表示查询。后面跟 你需要获取出来的列。
// from 后面填数据源。比如 工资表
//想查所有的列,可以用星号 * 表示 如 select * from 工资表
//如果列名是英文的。你想翻译出显示。可以用as
// 实发工资as到手工资。(这样读取的列名就变成到手工资)select 名字,实发工资 as 到手工资 from 工资表
// 还有一种也可以改列名 select 名字,到手工资=实发工资 from 工资表
//注意=的左右顺序
//不管是=还是as都不会修改原数据,只是显示出来的被改变了。
多表查询 inner join 。。。on 。。。 (用于提供数据源)
where用于筛选条件
在3个人查工资时,他们想提涨工资的事。那是不是需要查看这3个人工作的工龄。
可是工资表里没有工龄这个列。在另一张表招工信息表有工龄。
抛开数据库,我们正常理解:财务是不是需要拿出2张表,用名字来比对。
那数据库也一样,用inner join再提供一个数据源,招工信息表
select 姓名,工龄 from 工资表
inner join 招工信息表 这里填主外键
where 这里填筛选条件
结果排序 order by 。。。 desc
在查出结果后,想将对象排序,比如用成绩排序
order by 成绩 desc
//desc是降序,成绩从高到低排序。
//asc 是升序
模糊查询 like
link ‘常州%’
%表示通配符,满足常州,后面不管是什么,都是true
多条件筛选
where Age between 80 and 90
where Age in(21,22,28)
//筛选出年龄80到90岁的
//筛选出只有年龄21和22和28的对象