1 完整性
确保db中包含的数据尽可能的准确和一致的数据特性。
如果db中存储有不正确的数据值,则该db就丧失了数据的完整性,比如student表中有birthday字段名(date类型),则该字段存储的值必须为date的值,不能存储其他类型的值。
满足数据完整性的数据的特点:
1.1数据的值正确无误
1.2数据的存在必须确保统一表格数据之间的和谐统一
1.3必须维护不同表格之间的数据的和谐统一
为了维护数据的完整性,防止不合法的数据录入到表中,DBA和开发人员可以定义完整性规则,限制表的数据。
数据完整性的分类:
1 域完整性
2 实体完整性
3 参照完整性
实现完整性,需要约束:
2约束 constraint
2.1 非空约束 not null 例如一个表的序号
2.2 唯一unique约束 不重复 字段中的值不能重复 例如:一个表 的序号
2.3 默认值default约束 例如字段表示时间,即可以给定一个默认值
2.4 检查check约束(mysql不支持)
2.5 主键primary key约束: 非空唯一 一个表必须有一个主键,一般主键使用id。
2.6 外键foreign key 约束 : 保持关联表的完整性。
一个表的主键在另外一个表中存在。
比如Student表,stu_id,存在一个course_id(课程表中的id)
Course表,course_id,courser_name…
course_id就是Student表的外键。
单表操作SQL:
1 通过navicat 创建表,可以方便设置约束。
重要是查询:
条件查询:
1 查询年龄为18
2 查询年龄大于18
3 查询年龄19-23之间 and between…and
4 查询 年龄为20,25 or in
5 模糊查询 like
查询名字有l的
% 匹配0个到多个字符
_ 匹配一个字符
查询以l开头,且名字只有两个字符的:
%l 匹配多个字符,以l结束
l% 匹配多个字符,以l开头
%l% 匹配多个字符,只要有l的
_l% 匹配第二字符是l的
__l% 匹配第三个字符是l的
6 聚合函数
count(字段名) 统计
sum() 求和
max() 最大 min() 最小 avg() 平均
求年龄的平均数
查询年龄最大的学生信息
子查询(可以理解成 SQL的嵌套):至少有两个查询语句组成。 其中一个查询语句的结果作为另一个查询的条件。
1 查询出最大的年龄
2 根据查询出的年龄查询学生信息
多表(表关系操作):
外键
1 在student表中添加一个字段,字段名为c_id(不要设置为not null),但是此时c_id和course中c_id是没有任何关系的。
2 设置外键,建立两个表间的关联:
别忘记点击保存
完善student的选课:
两个关系表操作:
1 查询选择java课程的学生有多少个?
2 分组查询 group by
查询每个课程都有多少学生选择
按照课程进行分组查询,查询出每个课程由多少人选择
3 查询选择某一个课程的人数大于1的 信息(课程编号和学生人数)
having
4 排序
查询所有学生,并按照年龄排序
Order by 字段名 asc/desc;
5 limit 分页
查询前两条信息学生信息 作为一页显示
Limit a,b
a:从第几条开始(包含这一条)
b: 每次查询几个 (每页显示的条数)
总结:对于一个很长的查询sql:
select */字段名 [as] 别名 ,… from 表名 [as] 别名 [where 条件] [group by 字段名] [having 条件] [order by asc/desc] [limit ?,?];
6 查询所有的学生和课程信息
select * from student,course;
6.1 全连接 查询的结果是一个笛卡尔集
[a,b,c] [1,2,3]
[a1,a2,a3] [b1,b2,b3] [c1,c2,c3]
6.2等值连接
练习:1 获得结果:
1 zs 18 java
2 ls 20 math
6.3 左连接 left join 表名 on
查询出左表的所有信息和右表里面符号条件的信息
6.4 右连接 left join 表名 on
查询出右表的所有信息和左表里面符号条件的信息
练习:2查询出laosun的所有信息。
4 laosun 18 mysql
3 增加一个表 班级表 class (id className)
练习相关的查询操作
然后在查询出laosun的所有信息
Pm:
JDBC java 访问数据库的技术
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。
DAO Database Access Object 在工程中,从属于dao层。 respository(仓库)
之前处理其他业务逻辑,与DB无关,成为service层,比如处理注册登录的业务功能。
一 导jar包
1 下载Driver For Java
在mysql安装目录中找到:
2 加入到工程中
在工程列表创建lib文件夹,用于工程中所用到的jar包(第三方工具包)。
把jar直接拖拽过来,选择copy file
3 加入到 build path中,目的建立使用jar中的工具类,能让eclipse编译时可以识别。
Jar包中都是工具包和工具类(xx.class)
二 编码
// 1 加载驱动
// 2 建立连接
// 3 准备SQL
// 4 执行SQL
// 5 处理结果
// 6 断开连接
1 加载驱动
使用Class.forName 这一反射方式加载Driver类的原因是因为 倘若使用new Driver()方式,则会指定Driver类中的静态代码块,而静态代码块中又出现了一次new Driver(),如此 相当于new了两次Driver对象,显然,不好!
所以,使用Class.forName也会执行Driver类中的静态代码块,最终也就只执行了一次new对象。这种方式才是我们想要的。
里面执行的都是死值,一般执行SQL都来源于给定的值,也就是可以调用带参数的方法传值。