继上一篇分享了Oracle学习笔记,现在继续分享MySQL学习笔记,希望对你有所帮助。
数据库系统
DataBase System = 数据库管理系统(DBMS , DataBase Management System) + 数据库(DataBase) + 管理员
DBS = DBMS + DB
定义:对大量信息进行管理的高效解决方案,按照数据结构来组织,存储和管理数据的库。
关系型数据库系统:建立在关系模型上的数据库系统。
关系模型:
当将日常生活中的实体(学生),和实体的属性(学号,姓名)保存到数据中时,应该如何处理该实体结构。
1.数据结构可以规定,同类数据,结构一致。就是一个二维的表格。
2.数据之间的关系可以设置。
Nosql
Not only sql
非关系型数据库系统
关系型数据库的典型概念:
数据库DataBase:存储数据的仓库
表table:数据是保存在表内,保存在一个表内的数据,应该具有相同的数据格式
行&列:行用于记录数据,列用于规定数据格式
记录:行内的数据
字段:数据的某个列
SQL(结构化查询语言 Structured Query Language):数据库管理系统,用来管理数据的语言。
MySQL
数据库(数据+管理)+谁能向数据库系统发出如何管理的命令。
MySQL是基于C/S(客户端/服务端 client/server)架构
管理MySQL服务端程序
1.通过windows提供的服务管理完成
命令行形式管理windows的MySQL服务:
Net start 服务名
Net stop 服务名
windows下,我们在 cmd 中重启 MySQL 时,出现了“发生系统错误 5,拒绝访问”的错误提示,
这个错误是由于我们操作 cmd 的权限不足造成的,解决问题方法如下:
在开始菜单的搜索栏输入cmd,然后右键单击搜索结果,选择以管理员身份运行即可!
2.直接使用mysqld来运行服务
mysqld可以正常运行,就可以使用客户端来访问操作了。
利用mysql.exe来操作
先连接认证:mysql -hlocalhost -P3306 -uroot -p -h 地址 -P端口 -u 用户名 -p 密码
数据库操作:create database db_name [数据库选项];
标识符(数据库名)命名规则:
大小写取决于当前操作系统。(认为是区分的)
见名知意。推荐使用下划线方式。
标识符的字符:使用任意字符,数字,符号,甚至中文。但是一些特殊的组合,例如纯数字组合,特殊符号,包括mysql的内部关键字,应该使用标识符限定符
来包裹。
限定符:反引号
数据查询:
查看当前存在的数据库:show databases;
注意:并不是只有用户可以创建数据库,mysql内部维护自己数据库。
查看数据的创建语句:show create database db_name;
数据库删除:drop database db_name;
不可逆的,慎用
修改数据库信息:alter database db_name [修改指令]
指令:数据库属性的修改
数据库是表的容器,表,必须属于某个数据库,可以通过.语法(库.表 database.table),指明数据表所属的数据库,
进行表操作时,都会指定当前的默认数据库 use db_name;
只是设定了默认数据库,不会影响操作其他数据库。
创建表:create table tbl_name(列结构) [表选项];
先分析,需要保存的实体数据,拥有哪些属性,这些属性应该如何保存。
例如:班级的信息
班级班号,班级开班日期
列定义:
列名 列的数据类型 [列的属性(约束)]
create table jdbc.sck_class (
class_no varchar(20),
date_start date
);
查看:
有哪些表 show tables [like 'pattern'];
表创建信息 show create table tbl_name;
表结构(描述表结构) describe tbl_name;
删除表 drop table [if exists] tbl_name;
修改表:
修改表名 rename table old_tbl_name to new_table_name;
支持同时修改多个表,
支持跨数据库重命名。 rename table old_tbl_name to database.new_table_name;
修改列定义
增加一个新列 add新列的定义
alter table td_s_param add param3 varchar(6);
修改一个列的定义 modify
删除一个列 drop
alter table td_s_param drop param3;
重命名一个列 change
alter table td_s_param change param3 tag int;
修改表结构,上面的是子命令,上级是,
alter table tbl_name [add|modify|drop|change]
修改表选项 alter table tbl_name 新的表选项;
alter table td_s_param character set gbk;
数据操作
创建数据(插入数据) 获得数据(查询数据) 删除数据 修改数据
创建数据:insert into tbl_name(字段列表) values(值列表);
获得数据:select 字段列表 from 表名 where 条件;
删除数据:delete from 表名 where 条件;
删除需要在逻辑上严格给条件,否则容易造成数据误操作,导致损失。语法上可以没有where。可以:如果删除所有数据,使用where 1。
修改数据:update 表名 set 字段=新值,... where 条件;
校对规则:每一套编码字符集都有与之对应的校对规则。
什么是校对规则?在当前编码下,字符直接的比较顺序是什么。
每个字符集都支持不定数量的校对规则,可以通过如下指令:show collation like[pattern];
可以看到:字符集地区名比较规则(ci,cs,bin)不区分大小写,区分大小写,字节比较
在设置字符集时,可以设置当前字符集所采用的校对规则。如果不设置校对规则,那么每个字符集都有一个默认的校对规则。
数值型-整数类型
类型 字节 最小值(有符号/无符号) 最大值(有符号/无符号)
TINYINT 1 -128/0 127/255
SMALLINT 2 -32768/0 32767/65535
MEDIUMINT 3 -8388608/0 8388607/16777215
INT/INTEGE 4 -2147483648/0 2147483647/4294967295
BIGINT 8 -9223372036854775808/0 9223372036854775807/18446744073709551615
create table tbl_int(
a tinyint unsigned,
b tinyint
);
是否有符号:
可在定义时,使用unsigned标识,没有符号,不写就认为有符号。
定义显示宽度:通过规定数据的显示宽度,达到统一显示的目的。类型(M)M表示显示的最小宽度是多少(不规定存储)。
需要使用前导零填充达到目的。称之为zerofill
alter table tbl_int add c tinyint(2) zerofill;
数值型-小数类型
浮点:小数位数可以变化。
类型 存储空间(字节) 最小值(理论) 最大值(理论)
FLOAT 4 -3.402823466E+38 3.402823466E+38 默认精度位数为6位左右
DOUBLE 8 -1.7976931348623157E+308 1.7976931348623157E+308 默认为16左右
DECIMAL 变长,大致是每9个数字,采用4个字节存储。整数和分数分开计算 M,最大是65 D,最大是30 默认是
10,2 -(65个9) (+65个9)
create table num_2(
a float(5,2),
b double(8,3)
);
支持,控制数值的范围。
type(M,D) M表示所有的数值位数(不包括小数点和符号),D表示允许的小数位数。
定点数:decimal(M,D)
日期时间类型
类型 显示格式 取值 存储空间 零值
DATETIME YYYY-MM-DD HH:MM:SS '1000-01-01 00:00:00'到'9999-12-31 23:59:59' 8 0000-00-00 00:00:00
TIMESTAMP YYYY-MM-DD HH:MM:SS '1970-01-01 00:00:00'到'2038-01-19 03:14:07' 4 0000-00-00 00:00:00
DATE YYYY-MM-DD '1000-01-01'到'9999-12-31' 3 0000-00-00
TIME HH:MM:SS ' -838:59:59'到'838:59:59' 3 00:00:00
YEAR YYYY '1901'到'2155' 1 0000
字符串类型
char(M) 固定长度
varchar(M) 可变长度
M表示允许的字符串长度,M在varchar的表示,是允许的最大长度。char内M表示严格限定的长度。
M表示的是字符数,而不是字节数。但是,总的长度的使用是按照字节计算的。
注意:字段的最大长度,除了类型本身限制之外,记录的总长度也有限制。
真实的varchar长度:总长度65535
varchar特点,当类型数据超过255时,采用2个字节表示长度,整条记录,需要额外的一个字节,用于保存当前字段的null值。除非所有的字段都不为null,
这个字节才可以忽略。一个记录,无论有多少个字段存在null,都是使用统一的一个字节来表示,而不是每一个字段一个字节。
列属性
是否为空:规定一个字段的值,是否可以是null。 null | not null
默认值属性:default value来声明。默认值,在没有为该字段设置值时启用,而且默认值的设置需要使用固定值。
主键:PK,primary key。可以唯一标识某条记录的字段或者是字段的集合,就是主键。
主键可以是真实实体的属性,但是,常用的好的解决方案:利用一个与实体不相关的属性,作为唯一标识。
主键与业务逻辑没有任何关系,只用来标识记录。
设置主键的语法:primary key完成
两种方案:
1.字段上设置,主键字段在插入时不能为空,或者冲突。
2.在定义完字段后,可以定义。可以定义多列主键(组合主键)。一个主键包含多个字段
mysql规定只能存在一个主键
自动增长:为每条记录提供一个唯一的标识,每次插入记录时,将某个字段的值自动加1,使用auto_increment标识。
需要整型,还需要索引。在插入数据时,可以选择性插入null,或者不插入。
自动增长的初始值,是可以设置的,默认为1。通过修改标的选项:auto_increment n
是否可以手动插入该列的值?可以,但是如果是主键的话,不能重复。
该列是否可以更新?可以。
实体
1:1
设计:
两个实体表内,存在相同的主键字码。
如果记录的主键值等于另一个关系表内记录的主键值,则两条记录1:1对应。
1:n 一对多
一个实体,对应多个其他实体。例如:一个班级对应多个学生
设计:
在多的那端,增加一个字段,用于指向该实体所属的另外实体的标识。
m:n多对多
设计:
典型的:利用一个中间表,表示实体之间的对应关系。中间表的每个记录,表示一个关系。
外键
概念:如果某个实体(student)的某个字段(student:class_id),指向(引用)另一个实体(class)的主键(class:class_id),就称student实体的class_id
是外键。
被指向的实体,称之为主实体(主表),也叫父实体(父表)。
负责指向的实体,称之为从实体(从表),也叫子实体(字表)。
作用:用于约束处于关系内的实体。
增加子表记录时,是否有与之对应的父表记录。
在删除或者更新主表记录时,从表应该如何处理相关的记录。
定义一个外键:在从表上增加一个字段,指向主表的主键,使用关键字foreign key
foreign key (外键字段) references 主表名 (关联字段) [主表记录删除时的动作][主表记录更新时的动作]
设置级联操作:在主表数据发生改变时,与之关联的从表数据应该如何处理
主表更新:
主表删除:
使用关键字:
on update
on delete来标识。
允许的级联操作:
cascade:关联操作,如果主表被更新或删除,从表也会至执行相应的操作。
set null:设置为null,表示从表不指向任何主表记录。
restrict:拒绝主表的相关操作。
存储引擎
子查询
1.比较大小函数SIGN
sign(x)或者Sign(x)叫做符号函数,其功能是取某个数的符号(正或负):
当x>0,sign(x)=1;
当x=0,sign(x)=0;
当x<0, sign(x)=-1;
x可以是函数或计算表达式
2.流程控制函数DECODE
在逻辑编程中,经常用到If – Then –Else 进行逻辑判断。在DECODE的语法中,实际上就是这样的逻辑处理过程。它的语法如下:
DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 这里的if、then及else 都可以是函数或计算表达式。
- 内连接很简单
select A.*, B.* from A,B where A.id = B.id
select A.*, B.* from A inner join B on A.id = B.id
以上两句是完全等价的
- 左外连接
select * from emp a left join dept d on a.deptno=d.deptno
select * from emp a,dept d where a.deptno=d.deptno(+)
以上两句是完全等价的
- 右外连接
select * from emp a right join dept d on a.deptno=d.deptno
select * from emp a,dept d where a.deptno(+)=d.deptno
以上两句是完全等价的
也就是说只要把语句中的表换个位置,右外和左外就可以起到同样的功能
外连接:
除了显示匹配相等连接条件的数据外,还可以显示某一个表中无法匹配相等连接条件的记录!
- 左条件(+) = 右条件
左条件所在的表必须严格进行相等连接条件的匹配,而右条件所在的表除了匹配相等连接条件外,还可以显 示无法匹配连接条件的数据!
也称为右外连接.
可以用下 列语句取代:
SELECT...FROM 表1 RIGHT OUTER JOIN 表2 ON 条件; - 左条件 = 右条件(+)
右条件所在的表必须严格进行相等连接条件的匹配,而左条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!
也 称为左外连接.
可以用下列语句取代:
SELECT...FROM 表1 LEFT OUTER JOIN 表2 ON 条件;
limit是mysql的语法
select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录