1.为什么学习MySQL
MySQL 是目前最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 也是目前最好的 RDBMS 应用软件之一。随着淘宝去IOE(去除IBM小型机、Oracle数据库及EMC存储设备)化的推进,MySQL 数据库在当前的互联网应用中变得越来越重要,本教程主要讲授针对 Java 开发所需的 MySQL 高级知识,课程中会让大家快速掌握索引,如何避免索引失效,索引的优化策略,了解innodb和myisam存储引擎,熟悉MySQL锁机制,能熟练配置MySQL主从复制,熟练掌握explain、show profile、慢查询日志等日常SQL诊断和性能分析策略。
2.数据和信息
1.数据
能够承载信息 的一切东西
2.信息(Information)
信息是被人所认知的正确数据
3.开源软件(open Source Software)
背景:20世纪70年代左右-计算机产业 潮流:买硬件送软件
问题:用户群体量不大 多种计算机用户平台 做开源软件---》商业软件: Business Software
GNU-》GNU's not unix->gnu/linux
开源软件 =免费软件? 开源软件:源代码必须公开,并可以修改
代表人物:Richard Stallman ->毕业于MIT AI 软件自由 领导自由软件运动 组织:Free Software Foundation ->FSF
区分{
自由软件-一种思想 开源软件 免费软件
}
创立GPL协议(GNU general public license)
1.本软件随便用
2.本软件随便改
为最终用户考虑,未考虑到开发者
3.本软件再修改后,如果再次发布也需要遵循GPL(专利版权问题)java 在2017年被oracal卖给eclipse Foundation
早期:A)光盘(存储介质产品挣钱)---互联网
后期:B)服务(技术支持)mysql(oracal后期开发) -》MariaDB(同一作者 Michael Widenius:Monty 开发)早期成立Tcx Datakonsult
官网: www.mysql.com
Bill Gates 达摩院 ---人工智能 软件开源已经成为一种趋势
GNU/Linux 第一个免费开源软件操作系统 芬兰
免费开源网站:
www.opnesourcesoftwaredirectory.com
www.sfs.com
开源软件:
1)操作系统 Linux
GNU/Linux Centos (都是在linux 根据GPL的不同版本)
2)应用软件 并没有出现
3)数据库MySQL-my Ess Que Ell读音(my s q l )
Derby mSQL NOSQL MOGODB
4)中间件
Hibernate MyBatis Spring JDBC
5)web server
tomcat
4.MySQL & MariaDB
开源数据库 -mysql
1.起源 70年代左右 任务:Michael Widenius--Monty 公司:Tapio 供职 后创建Tcx Datakonsult 后更名 MySql(98年前后)
伙伴 Allan Larsson 业务: 外包,从事数据挖掘 数据量小/大的时候根据UniReg数据管理软件->SQL 两者不兼容
David Axmark协同 流行软件mSQL的接口(可用SQL)与UniReg组合发布MySQL(1996)公布版本3.1.1(直接)
Don't repeat youselt 市场上有的东西不要重复做
2.成立根据地-->mysql 被oracal收购 要改成闭源软件从而创建 MariaDB
5.数据库的一些概念
DataBase Management System ->DBMS 数据库管理软件
Relational Database Management Systemn ->RDBMS 关系型数据库管理软件
数据库设计(Design)
1)概念设计 ( 自己理解:将整个需求进行抽象 分清各个部分 把实体定义为概念名称)
识别系统中的实体(名词)以及他们之间的关系; 识别业务规则 例 数据的之间的存取关系 工作流程业务流程
2) 逻辑设计 对概念设计中的部分进行细化,对系统的中各个内容进行更加细致的设计 E-R图 Entity 实体关系图
逻辑设计完成后将得到完整的数据库设计图
3)数据库管理系统实现设计 mysql 或者oracal 语言:sql(结构化查询语言)
4)物理设计 (数据分布,数据优化 ,集群、云服务等)
6.数据库建模
1.数据库命名规则:
开始菜单运行cmd(COmmand)->命令行窗口
mysql -uroot -p123456
命名:1.见名知意
2.单数/复数
注意规则保持一致 如Students Teachers Rooms
student teacher room 随着项目进行,跟随项目标准规则 ,推荐表列行等使用单数
3.缩写/全拼 缩写必须是别人都认可,不会对别人产生明显的阅读障碍,才可以缩写
由于缩写的标准不一样,description desc desn descr 全拼的出现解决以上的所有矛盾,能不用缩写的就不用缩写
2.建模过程
1.识别实体
2.寻找能够标识、构成和描述了实体的东西【需找属性】
3.需找实体之间的关系
问题:如何找寻是实体中的属性?并且找准?
1)标识符 (identifier) -最重要的属性
2)值(数字)
3)定位器
4)描述性信息
N) 关系属性
小结:呈现实体本身
->寻找实体->寻找实体之间的关系
->寻找属性 (属性描述实体 属性可能是后期附加上的,与实体并没什么的关系,而是被人强行加上的)90%属性发源于自身,10%人为强加上的
属性分类:
1)标识符属性 能够区分出实体中某个特定的实例(instance),有时需要多个属性组合作为唯一标识
标识符的选择:唯一且稳定
例:身份证唯一但不算稳定,我们人为做一个代理键当作主键替代身份证号,主键不能被人为的使用和更改,这样就不算安全
2)值
3)定位器(用于在现实或者在生活定位到某个地点或者人,起定位作用)
4)描述性信息
N)关系属性 -》外键 Foreign Key
注意数据库设计:
尽量不能有数据冗余,每个数据项都是不可再分的单元子项
数据合格性检验:(check检验)
考虑:存储一个时间列的注意事项
1、该值必须是一个日期值
2、对该值大于18小于70
3.必须小于当前日期
4.保证存储的有效性 域 domain :有效值范围的集合
总结的话:
1.必须考虑边界条件,其中包括一些规则和法律,以及需求要求
2.数据类型
7.键的分类
键(key)唯一的、无歧义的标识实体
键!=标识符 并不是所有的标识符都可以作为键 例如身份证号
{
主键 :标识中用来标识胜出的键 特点:唯一 且不能为空
候选键:所有待选的标识符
替代键:在候选键中失败的
}
问题:如何选择键?(伴侣)
1.系统能够自助控制,不为人所控制
键的组成越简单越好,越单一越好,比较好控制(个数),客户看不到最好
标识中不代表具体内容,人为取名的键,我们称谓 代理键
总结:能够控制的,不是客户关心的数据,就有很强的稳定性(和尚和梳子)
2.键的类型?
自然键(智能键);例如身份证号 前三个字 代表地方
智能键:有多个自然键组合而成,包含某种信息,但是智能键可能被用光
代理键 并没有实际作用,但是只起标识作用
主键并不是都存在主键,但是我们都人为添加主键
8.元数据(元信息)
元数据(元信息):Metadata (数据字典) 存储下来用于描述数据的数据->数据本身也需要被描述
例如 文件的 大小,几个表,几个属性,如创建时间,修改时间
客户所用的数据 我们称谓业务数据或业务数据
例如 XML schema 描述xml的数据
mysql存储在Information_Schema.tables
--》用户数据或者业务数据我们是通过 -sql进行查询
元数据查询用什么呢?
都是数据,我们查询时是否要统一,codd 十二法则规定 ,用同等的SQL语言
!UNLL=UNKONW
MULL!=Null 是正确的
null与任何数据进行运算的时候仍为null
meta Anotation 数据描述、class用于描述类的类
9.SQL
sql :structure Query language
DDL:Date Define Language 数据定义语言
CREATE DATABASE 数据库名;
CREATE TABLE 表名;
DROP DATABASE 数据库名; DROP TABLE 表名;
ALTER
修改表名 ALTER TABLE 旧表名 RENAME AS 新表名
添加字段 ALTER TABLE 表名 ADD 字段名(类型)
修改字段 ALERT TABLE 表名 MODIFY 字段名列类型
ALTER TABLE 表名 CHANGE 旧字段 新字段 列 属性
删除字段 ALTER TABLE 表名 DROP 字段名
增加主键 ALTER TABLE 表名 CONSTRAINT 主键名(pk_表名) PRIMARY KEY(id)
删除主键 ALTER TABLE 表名 DROP PRIMARY KEY;
增加外加 ALTER TABLE 表名 CONSTRAINT fk_表名_指向表 FORIGN KEY(sid) REFERANCES 表名(主键);
删除外键 ALTER TABNLE 表名 DROP FORIGN KEY 外键名;
DML:DATE Manipulate language 数据操纵语言
UPDATE...
INSERT...
DELETE...
DQL: 数据查询语言 Data Query Language
SELECT...
DCL:数据控制语言 Data Control Language
GRANT REVOKE 撤销权利
10.数据库连接的整体过程演示
1.连接服务器的mysql 访问ip地址与端口号
mysql -h192.168.1.119:3306 -uroot -p123456
2.服务器mysql 是否授权给
mysql 》grant all privileges on *.* to 'root'@ %
3。查看现有数据库:
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| first |
| mysql |
| performance_schema |
| second_db |
| test |
+--------------------+
6 rows in set (0.04 sec)
mysql> use information_schema;
mysql> show databases;
建表:
CREATE TABLE 表名
(
列 的定义 列名 数据类型 【约束】 注释 如果出现多列中间用英文的恶斗号隔开
}
11.数据类型简述
1.数值类型
整数类型 字节数
int(integer) 4
bigint 8
mediumint 3
smallint 2
tinyint 1
小数类型(浮点类型)
非精确类型 m/g*g并不一定等于m
float
double
精确类型
decimal
decimal(5,2) 5是精度 2是标度,精度标识保存值的主要位数
标度表示小数点后面保存的位数 decimal(M) 等价与decimal(M,0)
位类型:
常用于 性别
2.文本类型(字符类型)
字符:Character(char)各种文字、数字、标点符号、图形、以及一些控制字符(并不显示出来 如F1)。。,回车,空格)
CHAR(N) N代表字符而非字节
VARCHAR(N) 比较两者的区别
BLOB 存放二进制
TEXT tinytext text mediumtext
3.日期类型和时间
datetime 8个字节
date 3个字节
timestamp 4个字节
year 1个字节
time 3字节
如果无特殊要求标准写为 yyyy-mm-dd hh:mm:ss
强制类型转换 select cast('日期' as DATETIME) as 列名
在5.5之后支持显示微秒可以通过microsecond()函数提取微秒
可以对微秒的个数进行精确,默认为零,最大为6
type_name(fsp) type_name可以为time、datetime、timestamp
函数也可以加上精确 如CURTIME(4)、sysdate(?)、utc_timestamp(?);
timestamp:显示的结果是和datetime 是一样的,但是存储的结果是从1970年到现在的毫秒数
UTC 世界同一时间
timestamp可以设置一个默认值,但是datetime不可以
更新表时,可以设置timestamp 的类型的列自动更新为当前时间 用CURRENT_TIMESTAMP的值为当前时间
注:自动更新的触发,必须为改变了具体的行数;
year
year(2)时 00-69表示2000-2069 70-99表示1970
time time 的存储范围不一定只是本天数据,可以前天。。
范围是-838:59:59-838:59:59
4.枚举类型
ENUM 和set类型
sex enum('male','female') 设置严格模式:就可对吸纳定内容限定,只能选用枚举类型
建议使用 默认设置字符集为utf-8;
5.特殊的类型
1)UNSIGNED 无符号数 常用在主键自动增长非负数
unsigned的滥用例如1-2 的结果,会因为它的选择在不同语言和系统中不同
在mysql 中对于unsigned的数的操作,其返回值都是unsigned;除非设置了模式
如: mysql>set sql_mode='NO_UNSIGNED_SUBTRACTION'后才会出现负数
建议:不要使用unsigned 用于操作的列
2)zerofill
常与整形的int一类使用,如int(10) 如果没有zerofill是无意义的
一旦使用了zerofill 系统默认启用unsigned属性
zerofill只是对输出格式进行了规范,并没对数据在计算机中的存储进行改变
3)SQL_MODE
默认为空,强烈建议启用严格模式
对全局和当前回话参看sql模式
select @@global.sql_mode\G;
和select @@session.sql_mode\G;
设置严格模式:
set global sql_mode='strict_trans_tables';
12.Null空集
关系数据库,引入NULL后产生的问题
1.null与任何数据进行拼接操作,其结果为NULL
2.null与任何数据进行算数运算,其结果为NULL
3.Null参与逻辑运算、或者比较运算的时候带来的 问题 ,其结果也为NULL或UNKNOW
4.布尔运算其结果为NULL
select null=null 结果为null
select null and false 结果为0
select null or false 结果为null
select null or null 结果为null
select null and true 结果为null
取反
select not null; 结果为null
13.系统函数
********与时间有关的函数:
now() current_timestamp() sysdate() 显示系统时间
sleep(2)使系统睡眠两秒但是只对sysdate()起作用
now()和current_timestamp()返回的是执行语句的时间
*************时间加减函数
date_add(now(),interval 1 day);interval时间间距 数值可正可负
date_sub(。。。)
默认对闰月问题的处理:闰月返回2月29 非的话返回2月28
可以添加的单位可以使year day month hour week
minute second、 microsecond
******date_format 按照给事打印出时间字符显示
select date_format(now(),'%y%m%d')
14.字符集和排序规则
字符集:
在mysql 中默认的额字符集是latin1;
show charset;//查看字符集
简体中文 我们首选gbk或者gb2312
gbk是gb2312 的超集;
目前mysql不支持中文字符集gb18030(+少数名族语言) 因此 mysql中不能显示特定中文字体
繁体中文 我们使用big5;
兼容世界上所有语言的unicode utf-8可以看做unicode的一种形式
unicode是一种字符编码,而不是一种字符集,是一种方案
具体实现是utf8.utf16.utf32。ucs2实现的
对于unicode强烈建议讲说的char字段设置成varchar类型,数据库会保存最大可能的字节数;
可以在mysql 的配置文件中设置 character_set_sever=utf-8;
要看当前使用的字符集可以使用status;
mysql>status;
mysql>set names 'gbk';//用来更改当前会话连接、当前回话的客户端的字符集
可以在表的时候对表中的每一个类分别设置字符集编码格式
类型NCHAR=> 在mysql中显示为 utf-8 编码下的char格式
在sql sever中显示为ucs-2 下的char
具体显示为 'a' char(10) character set utf-8 default null;
排序规则:
1.每种字符集都有不同的排序规则
2.通用命名规范
-ci 忽略大小写
-cs 大小写敏感
-bin 二进制比较
可以通过show collation;或者iInformation--schema下的表collations查看
更改当前回话的排序规则
set names utf-8 collate utf_bin;区分大小写
建立唯一索引时由于排序规则对大小写不敏感而导致错误
CHAR(N)0-255 和VARCHAR(N)0-65535
N表示字符长度
char(N)采用右边填充的操作,直到指定的长度为N,在读取数据库的时候会自动将字符串删除
通过char_length 函数 和length函数用来测量字符个数和字节个数
utf-8中中文占两个字节
VARCHAR存储时前缀长度列表加上实际存储的字符,占1-2个字符
15.注释
注释 列上加注释
COMMENT 't5表的主键'
表上加注释 COMMENT='加快看看' 两者是不同的
create table 'tablename'(
'id' tinyint(4) unsign zerofill default 12 comment '没有固定顺序',
primary key('id') COMMENT后加主键
);
mysql注释:
1.#、、、、,。。。 单行注释
2./* ''''''''''*/
16.搜索引擎
MyISAM、InnoDB。。HEAP、BOB、CSV
常见的两种比较
myisam 不支持事务处理 不支持行锁定 不支持外键约束 支持全文索引 表空间较小 主要用于查
innoDB 支持事务处理 支持行锁定 支持外键约束 不支持全文索引 较大越两倍 查询一般,主要用于增删改
外键约束 :不得书写主键不存在的外键
全文索引: 与大文本搜索有关
ENGINE=INNoDB/MyISAM;
mysql数据表以文件的方式存放在磁盘中
包括表文件 ,数据文件,数据库选项文件。opt文件
ibdata1数据文件 INNODB 的存储
数据表文件以 .frm 存储,
muyisam 还要加上.myd 数据文件 和.myi 索引文件 .frm 表结构定义文件
表字符集 :在建库建表的时候可以重新指定字符集
CREATE DATABASE db CHARACTER SET gbk COLLATE gbk_chinese_ci;
建表的的时候
create table tb( ******) DEFAULT CHARSET=gbk;
设置 dos窗体下字符集为gbk SET names gbk;
如果无设定,可在my.ini中设置默认字符集 character-set-sever=utf-8;