===================================================================================================================================
用表组织数据
数据完整性
1.实体完整性约束
实体完整性要求表中的每一行数据都反应不同的实体,不能存在相同的数据。
通过索引。唯一约束、主键约束或标识列属性,可以实现表的实体完整性。
2.域完整性约束
域完整性指的是给定列输入的有效性。
通过限制数据类型。检查约束。输入格式。外键约束,默认值,非空约束等多种方法,可以实现表的域完整性。
3.引用完整性约束
在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系
引用完整性通过主键和外键之间的引用关系来实现
4.自定义完整性约束
用户自定义完整性用来定义特定的规则
主键:
一个表中至少有一个主键
作用:重复值无法录入,选用主键的时候,需要考虑两个原则:(最少性 和稳定性)
===================================================================================================================================
使用SQL语句操作数据库
dml 操作语言
insert 增
update 改
delete 删
dcl 控制语言
grant 授权
revoke 撤销
dql 查询语言
select查询
ddl 定义语言
create table 创建
drop table 删除
插入数据
(列和值一一对应)
insert into 表名(列)
values(值)
复制多条数据
insert into ... select ... from
(两表列名一一对应,有表)
insert into 新表名(各列名)
select 各列名 from 原表名
复制多条数据
select ... into ... from
(无表)
select 各列名
into 新表名
from 原表名
插入多条
insert into ... select ... union
(有表)
insert into 表名(各列名)
select 数据 union
select 数据 union
......
更新数据
update 表名
set 需要更新的列(,隔开)
where 拥有的条件(and或者or 隔开)
是否为空 is null or ""
删除数据
指定条件(含有外键时,删除主表中的数据必须删除子表数据)
delect from 表名
where 数据
全部清空
delect from 表名
插入数据:(default默认)
insert into(列)
values(赋值)
插入多行数值:
(1)insert into 新数据名 (新列)
select (老列)
from 老数据名
(2)select 老数据名.老列
into 新数据名
from 老数据名
合并数据插入多行数据:
insert 数据名(数据类)
select'赋值','赋值',union
select'赋值','赋值',union
select'赋值','赋值',union
select'赋值','赋值',union
select'赋值','赋值'
更改数据:
upate 表明 ate 列名=更新值[where 更新条件]
upate student
ate saddress='表中值'
where saddress='改值'
删除数据:
delete[from] 表名[where <删除条件>]
delete from student
where scode=22
删除所有数据:
truncate table 表名
===================================================================================================================================
查询(*可代表全部)(<>代表不等于于)
select 列名 from 表名(,隔开)
where 查询条件
order by 排序的列名
查询常量列
常量 as 别名
限制固定行
top 所需行
top 数字 percent(百分比)
(紧放在selsct后)
order by 列名(降序desc 升序asc(默认) )
多列时 ,隔开 前面为主排序列
字符串函数
(用于控制返回给用户的字符串)
====================================================================================================================================
模糊查询和聚合函数
1.通配符
通配符是一类字符,它可以代替一个或多个字符。
通配符 | 解释 | 示例 |
_ | 一个字符 | A LIKE 'C_', 则符合条件的A如CS,Cd 等 |
% | 任意长度的字符串 | B LIKE 'CO%' 则符合条件的B如CONST,COKE等 |
[] | 括号中所指定范围内的一个字符 | C LIKE '9W0[1-2]' 则符合条件的C如9W01,9w02 |
[^] | 不在括号中所指定范围内的任意一个字符 | D LIKE '9W0[^1-2]' 啧符合条件的D如9W03,9W07 |
2.使用LIKE进行模糊查询
由于该运算符只用于字符串,因此仅与字符数据类型联合使用
在进行数据更新、删除或者查询的时候,依然可以使用LIKE关键字进行匹配查找,例如,查找姓张的学生信息:
select * from Students
where SName LIKE '张%'
或者查询住址包含 “北京” 字样的学生信息:
select * from Students
where Saddress LIKE '%北京%'
3.使用BETWEEN在某范围内进行查询
使用关键字BETWEEN可以查找那些介于两个已知值之间的未知值。要实现这种查找,必须知道查找的初值和终值,并且初值要小于终值,初值和终值用AND分开。
例如:查询分数在60到80之间的信息如下:
select * from Score
where Score BETWEEN 60 and 80
4.使用IN在列举值内进行查询
查询的值是指定的某些值之一,可以使用带列举的IN关键字来进行查询。将列举值放在圆括号内,用逗号分开。
例如:查询北京、广州和上海的学生姓名:
select SName as 学生姓名 from Students
where Saddress
IN('北京','广州','上海') order by SAddress
5.SUM () 函数
SUM()函数返回表达式中所有数值的总和,空值将被忽略。SUM()函数只能用于数字类型的列,不能够汇总字符,日期等其他数据类型。
例如:查询学生编号为23的考试总分,可以使用如下查询:
select sun(Score) as 学号为23的学生的总分 from Score
where StudentID=23
6.AVG()函数
AVG()函数返回表达式中所有数值的平均值,空值将被忽略。AVG()函数也只能用于数字类型列
要查询及格线以上的平均值,语句如下:
select AVG(Score) as 平均成绩 from Score
where Score>=60
7.MAX()函数和MIN()函数
MAX()函数返回表达式中最大的值,MIN()函数返回表达式中最小的值,这两个函数都忽略了任何空值,并且他们都可以用于数字型、字符型及日期/时间类型的列。
例如:查询平均成绩、最高分、最低分的语句如下:
select AVG(Score) as 平局成绩,MAX(Score) as 最高分,MIN(Score) as 最低分 from Score
where Score >=60
8.COUNT()函数
COUNT()函数返回提供的组或记录集中的计数。
例如:查询总记录数的语句如下:
select COUNT(*) as 总记录数 from Score
====================================================================================================================================
链接查询和分组查询
使用GROUP BY 进行分组查询
示例:
SELECT name,AVG(Score)AS 平均成绩
FROM Score
GROUP BY name
多列分组:GROUP BY name,score
使用HAVING子句进行分组筛选
SELECT COUNT(*)AS 人数,SGrade AS 年级 FROM Student
GROUP BY SGrade
HAVING COUNT(*)>15
多表链接查询
使用 INNER JOIN ···ON
示例:SELECT S.NAME, C.COURSID, C.SCORE
FROM STUDENT AS S
INNER JOIN Score AS C ON (S.SCode=C.student)
外链接查询
左链接查询
SELECT S.NAME, C.COURSID, C.SCORE
FROM STUDENT AS S
LEfFT OUTER JOIN Score AS C ON (S.SCode=C.student)
表示 student为主表查找相关信息,没有的会以空值NULL替代
右链接就是,找不到匹配的值,整行都不会显示出来
====================================================================================================================================
……使用ADO.NET 访问数据库 知识重点:
ADO.NET:大部分的应用程序都要访问或者操作大量数据,通常这些数据都是存在数据库中的。
ADO.NET:可以对数据源进行连接,对数据进行行增,删,改,查,等操作。
ADO.NET:可以把数据检索到的数据保存在本地一个叫做 (数据集)的地方
ADO.NET的主要组件
1..NET Framework 数据提供程序时专门为数据处理及快速地只进,只读访问数据而设计的组件
2.DataSET 是专门为独立任何数据源的数据访问而设计的
.NET Framework 四个核心对象
Connection :建立与特定数据源的链接
Command: 对数据源执行命令
Datareader:从数据源中读取只进且只读的数据流
DataAdaper: 用数据源填充 DataSet 并解析更新
不同的命名空间中都有相应的对象
使用Connection 对象
Connection 对象的常用属性和方法
·Connection:对象是应用程序链接数据库的桥梁
·ConnectionString: 链接字符转
·Open() 打开数据库链接
·Close() 关闭数据库链接
1.定义链接字符串
String connString=Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Pwd=密码
2.创建 Connection 对象
Sql Connection conn = new Sql Connection(conn String);- 链接字符串
3.打开与数据库的链接
conn.Open();
示例代码:
使用Command 对象
不同的数据库同样提供程序有各自的Command 对象 如:SqlCommand
为什么使用Command?
Connection 对象也是,NET.Frameword 数据提供程序的一个核心对象。
Command 的主要成员
属性:Connection : Command对象使用的数据库链接
CommandText : 执行的SQL语句
方法:
ExecuteNonQuery() : 执行不返回的语句,如UPdate等
ExecuteReader() :或:SqlDataReader ExecuteReader(CommandBehavior behavior) 返回dataReader对象
ExcuteScalar() : 返回单个值,如执行带Count(*)的SQL语句
语法:
SqlCommand 变量名 =new SqlCommand(sql语句,链接数据库定义的名);
要使用Command对象,必须有一个可用的Connection对象
1.创建数据库链接
2.定义执行的Sql语句
3.创建Command对象
4.执行Sql语句
====================================================================================================================================
使用ADO.NET访问数据库
string和stringBuilder
语法:
stringBuilder stb=new stringBuilder();
stb.AppendLine("aaaa");
stb.AppendLine("bbbb");
当对 stb 对象调用Append()方法时,在stb对象的原字符串后面追加新的字符串,而不是创建一个新的对象。
可以使用Tostring()方法把stb对象的值转换为 String 类型输出
StringBuilder 常用的属性和方法
Capacity:获取或设置可包含在当前对象所分配的内存中的最大字符个数
Length:获取或设置当前对象的长度
StringBuilder Append(string format,object arg0,object arg1):添加特定格式的字符串
stringbuilder insert(int index,string value) 在指定位置插入指定字符串
stringbuilder remove (int strtindex,int length) 移除指点字符串
示例:
查询数据
我们可以使用 Command 对象的ExecuteReader()方法,ExecuteReader()返回一个Datareader对象,通过Data Reader就可以从数据库中读取多条记录了。
Data Reader对象
命名空间 Data Reader 类
system.date.sqlclient sqldata reader
system.date.oledd oledddatareader
system.data.obdc odbcdatareader
system.data.oracleclient oracledatareader
datareader的主要成员
属性 说明
hasrows 是否返回了结果
FieldCount 当前行中的列数
方法 说明
read 前进到下一行记录
close 关闭datareader对象
使用datereader检索数据步骤
·创建command对象
·调用executereader()创建datareader 对象
·使用datareader 对象的read()方法逐行读取数据
·读取某列的数据,(type)reader["列名"]
·关闭Data Reader 对象,调用它的Close()方法
相关代码示例演示
C#1 public void message() {
2 string conut = "Data Source=.;Initial Catalog=MySchools;Persist Security Info=True;User ID=sa;Password=mlq980505";
3 SqlConnection tion = new SqlConnection(conut);
4 try
5 {
6 Console.WriteLine("请输入学生姓名:");
7 string name = Console.ReadLine();
8 Console.WriteLine(string.Format("{0,0}", "学号") + string.Format("{0,20}", "姓名") + string.Format("{0,10}", "性别")
9 + string.Format("{0,10}", "年级") + string.Format("{0,15}", "联系电话") + string.Format("{0,25}", "地址")
10 + string.Format("{0,25}", "出生日期") + string.Format("{0,25}", "邮箱")
11 );
12 tion.Open();
13
14 StringBuilder buider = new StringBuilder();
15 buider.AppendLine("select");
16 buider.AppendLine("A.[studentno]");
17 buider.AppendLine(",A.[loginpwd]");
18 buider.AppendLine(",A.[studentname]");
19 buider.AppendLine(",A.[sex]");
20 buider.AppendLine(",B.[gradename]");
21 buider.AppendLine(",A.[phone]");
22 buider.AppendLine(",A.[address]");
23 buider.AppendLine(",A.[borndate]");
24 buider.AppendLine(",A.[email]");
25 buider.AppendLine("from ");
26 buider.AppendLine("[student] as A,[grande] as B");
27 buider.AppendLine("where");
28 buider.AppendLine("A.[studentname] like '%" + name + "%'");
29 buider.AppendLine("and");
30 buider.AppendLine("A.gradeid=B.gradeid");
31 SqlCommand mand = new SqlCommand(buider.ToString(), tion);
32 SqlDataReader date = mand.ExecuteReader();
33 while (date.Read())
34 {
35 Console.Write(string.Format("{0,0}", date["studentno"]));
36 Console.Write(string.Format("{0,20}", date["studentname"]));
37 Console.Write(string.Format("{0,10}", date["sex"]));
38 Console.Write(string.Format("{0,10}", date["gradename"]));
39 Console.Write(string.Format("{0,15}", date["phone"]));
40 Console.Write(string.Format("{0,25}", date["address"]));
41 Console.Write(string.Format("{0,30}", date["borndate"]));
42 Console.Write(string.Format("{0,40}", date["email"] + "\n"));
43 }
44 date.Close();
45 }
46 catch (Exception ex)
47 {
48 Console.WriteLine("异常错误:" + ex);
49 }
50 finally
51 {
52 tion.Close();
53 }
54 }
更新数据
ExecuteNonQuery() 方法
该方法执行的sql增删改语句
返回受影响的行数
使用executenonquery()的步骤
1 创建connection 对象
2 定义sql语句
3 创建command 对象
4 执行executenonquery()方法
5 根据返回的结果进行处理
相关演示代码如下:
1 public void modification() {ExecuteNonQuery
2 string conut = "Data Source=.;Initial Catalog=MySchools;Persist Security Info=True;User ID=sa;Password=mlq980505";
3 SqlConnection tion = new SqlConnection(conut);
4 try
5 {
6 tion.Open();
7 Console.WriteLine("请输入学号:");
8 String nameNo = Console.ReadLine();
9 String sqq = "select count(studentno) from student where studentno='"+nameNo+"'";
10 SqlCommand madd = new SqlCommand(sqq,tion);
11 int sum = (int)madd.ExecuteScalar();
12 if (sum == 1)
13 {
14 Console.WriteLine("请输入修改的日期:xxxx-xx-xx");
15 string date = Console.ReadLine();
16 string sql = "update student set borndate='"+date+"' where studentno='"+nameNo+"'";
17 SqlCommand mand = new SqlCommand(sql, tion);
18 int num = (int)mand.ExecuteNonQuery();
19 if (num >= 1)
20 {
21 Console.WriteLine("成功修改");
22 }
23 else {
24 Console.WriteLine("修改失败!!!");
25 }
26 }
27 else
28 {
29 Console.WriteLine("没有此人!!!");
30 }
31
32 }
33 catch (Exception ex)
34 {
35 Console.WriteLine("异常错误:" + ex);
36 }
37 finally
38 {
39 tion.Close();
40 }
41
42 }