- 范式
①1NF: 数据库表的每一列都是不可分割的原子数据项。即代表第一范式就是无重复的域。
②2NF:在1NF的基础上,非码属性必须完全依赖于候选码(候选码指这个属性(组)可以唯一标识一个元祖,但它的真子集不能唯一标识一个元组)。即要求实体的属性完全依赖于主关键字。索引完全依赖是指不能存在仅依赖于主关键字的一部分属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体。
③3NF:在2NF基础上不可出现传递依赖。举例:存在一个部门信息表,其中每个部分有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表列出部门编号后就不能再将部分名称,部门简介等于部门有关的信息加入员工信息表。
④BCNF范式:在3NF基础上,主键不允许出现其键的一部分被主键的另一部分或其它部分决定。 - 事务
数据库中事务的概念:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
事务具有以下性质:
①原子性:事务是数据库的逻辑工作单位,事务包括的操作要么都做,要么都不做。
②一致性:事务执行的结果必须使从一个一致性状态变到另一个一致性状态(关于一致性状态,我认为是保持数据库数据的一致性,可以自行百度)
③隔离性:一个事务的执行不能被其他事务干扰。
④持续性:一个事务一旦提交,它对数据库中数据的改变就应该是永久的。 - 数据库中的锁(这个不同数据库中的锁还不太一样)
Mysql中有行锁(锁定某个表的某条记录,InnoDB是行锁,这个行锁不是说只可能锁定一行,对某些条件下还是可能锁定多行甚至一个表的所有行),表锁(锁定一个表,MyiSAM是表锁),和页级锁定(这个还是查一查吧。感觉是锁定多行?)
※注意InnoDB中支持事务,MyiSAM中不支持事务,他们对索引的建立还有区别。这两个的区别还是自行百度。
每种锁都包括,共享锁(用于所有的只读操作,共享锁是非独占的,允许多个并发事务读取其锁定的资源)和排它锁(排它锁是为修改数据而保留的,它锁定的资源,其他事务不能读取也不能修改)
mysql 的锁,在增删改查的时候系统会自动调用,手动用的话,语法如下:
lock table film_text write;
unlock tables; (write表示写锁,read表示读锁。这个例子是在MyiSAM下,而且我没有测试过) - 索引:
索引的分类方法有好几种
① 按实现索引的数据结构可以分为顺序索引,B树索引,哈希索引。
②《数据库系统概论》中索引分为有
a. 普通索引:允许被索引的数据列包含重复的值。
b. 唯一索引:索引的数据列只包含彼此不同的值。
c. 主索引:为主键字段创建的索引。
d.外键索引:为外键字段创建的索引。
e.复合索引:索引可以覆盖多个数据列,如像index(column A,column B,column C)索引,使用组合索引时一定要带上最开头的那一列,这个意思是说,你可以通过A、AB、ABC来使用组合索引,但是不可以通过B、C、BC来使用这个索引。
③ 索引还可以分为聚簇索引(又称聚集索引)和非聚簇索引。聚簇索引存储的记录是物理上连续存在的。非聚簇索引时逻辑上的连续,物理上并不连续。
举个例子,聚簇索引,比方说一个图书馆的书按照书名的字母顺序来排放,b开头的书放在a开投的书后面,那么以a-z这样建立的索引就是聚簇索引。而对于上面这样的排放方式,以书的作者建立的索引就是非聚簇索引。
一个表中只有能一个聚簇索引,因为一个表只能有一种物理的存储顺序。这个聚簇索引可以是组合索引。(聚簇索引的底层实现的数据结构还是得去自行百度,不知道是不是B树或者B+树)
InnoDB中的索引是聚簇索引。它建立的其余索引要保存索引的key和主键值(查询时是通过索引的key找到主键值,再用主键值查它的聚簇索引)。建立聚簇索引时先为主键建立,不行的话再为Unique索引建聚簇。 内连接:典型的连接运算,(连接条件中使用=或<,>之类的比较运算符)包括等值连接和自然连接(在等值连接中将目标列中重复的属性去掉,即去掉两个表中的重复列)内连接是返回连接表中符合连接条件和查询条件的数据行(连接表是指在数据库做查询的过程中形成的中间表)
内连接语法上可以分为显示和隐式两种(显示和隐式的区别还得查一下,总感觉前面查的资料说的有点问题)
隐式内连接:形成的中间表是为两个表的笛卡尔积
select O.id,O.order_number,C.id,C.Name
from Customers C,Orders O
on C.id=O.id
where C.id=”123”;
显式:使用inner join,形成的表为两个表经过on条件过滤后的笛卡尔积。
select O.id,O.order_number,C.id,C.name
from Customers C,Order O
on C.id=O.id
where C.id=”123”;外链接
外链接不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外链接分为三类:左外连接(LEFT OUTER JOIN),右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN),三者的共同点是都返回符合连接条件和查询条件(即内连接)的数据行。不同点如下:左外连接返回左表中不符合连接条件但符合查询条件的数据行。右外连接返回右表中不符合连接条件但符合查询条件的数据行。全外连接时左外连接和右外连接的并集。
左外连接语法:
select O.id,C.id
From Customers C LEFT OUTER JOIN Order O
on C.id=O.id
where C.id=”123”;
※注意on 对应的是连接条件,where对应的是查询条件。
举个例子:
对于以下两个表
student表
学号 姓名 性别 年龄 所在系
Sno Sname Ssex Sage Sdept
200215121 李勇 男 20 CS
200215125 张立 男 19 ZSSC表
学号 课程号 成绩
Sno Cno Grade
200215121 1 92
200215121 2 85
select student.sno,sname,ssex,sage,sdept,cno,grade
from student LEFT OUTER JOIN sc
on student.sno=sc.sno;结果是
student.sno sname ssex sage sdept cno grade
200215121 李勇 男 20 cs 1 92
200215121 李勇 男 20 cs 2 85
200215121 张立 男 19 ZS null null右外连接和全外连接语法与左外连接相同,就是LEFT OUTER JOIN 换成RIGHT OUTER JOIN和 FULL OUTER JOIN
常用的sql语句
※“[]” 这个括号内表示可选项.”<>”表示必须要有的项
① 这个是创建表
create table <表名>
( <属性1> <数据类型> [完整性约束条件],
<属性2> <数据类型> [完整性约束条件],
<属性3> <数据类型> [完整性约束条件],
[完整性约束条件],
[完整性约束条件]
);
※ 如果多个列作为主键的话,就
primary key(列1,列2);
设置外键
foreign key <列名> references <表名>(<列名>)
②修改列
alter table 表名
[add <列名> <数据类型> [完整性约束条件] ] (这个是添加列)
[drop <完整性约束条件>] (删除完整性约束条件)
[alter column <列名> <数据类型>] (更改列名的数据类型)
[drop column <列名>] (删除列)
[change column <旧列名> <新列名> <数据类型>] (修改列名)
③ 修改表名
alter table <旧表名> rename <新表名>;
④ 删除表
drop table 表名 cascade;
选择cascade时,删除该表时会删除相关的依赖关系、视图等。
⑤创建索引
create [unique] [cluster] index <索引名>
on <表名> (<列名>,<列名>….)
⑥查询
select <列名>,<列名>…..
from <表名>
where <条件>;
a. select * 将查询全部列
b. select distinct <列名> from <表名> 将取出重复行
c. where中的条件可以是
xx and xx, 列名 between xx and 选项,
列名 in(xx,xx,xx);
d. 字符匹配,_代表任意单个字符,%代表任意的任意长度字符
如 where sname not like “刘_%”;
not like 和 like。注意这些谓词。
e. order by <列名>: 查询结果按XX排序。 casc表示升序,desc表示降序。
f. group by <列名>:按某列分组。
group by sno having <条件>
分组时可以用having来筛选元组。
g. 聚集函数
COUNT() 求个数
SUM() 求和
AVG() 求平均数
MAX() 求最大值
MIN() 求最小值
h.嵌套查询
where <列名> in/exist/not exist ( select xx from xx where xx);
注意sql的!=是用<>表示(待检验)
⑦ 插入数据
insert into <表名> (<列名1>,<列名2>,<列名3>…)
values (<值1>,<值2>,<值3>…)
注意值和列名要一一对应
⑧更新数据
update <表名> set <列名> =<值> where <条件>
⑨建立视图(待测试)
create view <视图名> [列名,列名]
as select xx,xx,xx from xx where xx;
视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表,对视图的更新插入删除等操作还得反馈到基本表来操作。对视图的查询和删除语法与表一致。
视图可以屏蔽一部分属性,只提供给用户它需要的属性,可以保障数据的安全(视图的作用自行百度吧)
注意视图和垂直分表的区别。操作视图并不能减少基本表的IO,减少IO的方法还是分表。java用jdbc连接mysql数据库
注意要先把mysql-connection.jar导入(好像是这个名字,自行百度)
String driver="com.mysql.jdbc.driver";
String url="jdbc:mysql://地址:端口/数据库名";
String user="user";
String password="password";
try{
Class.forName(driver);//类加载
connection conn=DriverManager.getConnection(ur,user,password);
Statement statement=conn.createStatement();//preparedStatement更好用一点,如何使用自行百度
String sql="select sname from student where sno=200215121";
ResultSet rs=statement.excuteQuery(sql);
while(rs.next()){
String name =rs.getString("Sname");
}
rs.close();
conn.close():