MYSQL(2)

本文深入解析数据库完整性概念,包括域、实体与参照完整性,探讨如何通过约束如非空、唯一、默认值、检查、主键及外键来维护数据准确性。同时,文章详细介绍了SQL查询技巧,涵盖条件、分组、排序与子查询,以及多表操作和表关系处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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都来源于给定的值,也就是可以调用带参数的方法传值。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值