|
| 1 | +#mysql-基础 |
| 2 | +1. 介绍 |
| 3 | + |
| 4 | + 20世纪90年代诞生于瑞典 |
| 5 | + |
| 6 | + 2008年被SUN收购 |
| 7 | + |
| 8 | + 2009年SUN被ORICAL收购 |
| 9 | + |
| 10 | + [官网](http://dev.mysql.com/downloads/installer/) |
| 11 | +2. 80版本navigat无法登陆的情况 |
| 12 | + |
| 13 | + |
| 14 | + 命令行 mysql -u root -p 然后进入管理页面 |
| 15 | + |
| 16 | + ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; |
| 17 | +2. 安装目录及配置 |
| 18 | + |
| 19 | + 1. windows: my.ini |
| 20 | + 2. mac: my.conf |
| 21 | + |
| 22 | + 配置参数 |
| 23 | + |
| 24 | + # 以下选项会被MySQL客户端应用读取。 |
| 25 | + # 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。 |
| 26 | + # 如果你想你自己的MySQL应用程序获取这些值。 |
| 27 | + # 需要在MySQL客户端库初始化的时候指定这些选项。 |
| 28 | + [client] |
| 29 | + port = 3306 |
| 30 | + socket = /usr/local/mysql/mysql.sock |
| 31 | + # MySQL 服务端 |
| 32 | + [mysqld] |
| 33 | + #默认存储引擎INNODB |
| 34 | + default-storage-engine=INNODB |
| 35 | + #GROUP_CONCAT长度 |
| 36 | + group_concat_max_len =99999 |
| 37 | + #端口号 |
| 38 | + port = 3306 |
| 39 | + #socket位置 |
| 40 | + socket = /usr/local/mysql/mysql.sock |
| 41 | + #pid写入文件位置 |
| 42 | + pid-file = /usr/local/mysql/mysqld.pid |
| 43 | + #数据库文件位置 |
| 44 | + datadir = /home/data/mysql/data |
| 45 | + user = mysql |
| 46 | + #SQL模式具体查阅相关资料 |
| 47 | + sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES |
| 48 | + #当外部锁定(external-locking)起作用时,每个进程若要访问数据表, |
| 49 | + #则必须等待之前的进程完成操作并解除锁定。由于服务器访问数据表时经常需要等待解锁, |
| 50 | + #因此在单服务器环境下external locking会让MySQL性能下降。 |
| 51 | + #所以在很多Linux发行版的源中,MySQL配置文件中默认使用了skip-external-locking来避免external locking。 |
| 52 | + skip-external-locking |
| 53 | + #跳过DNS反向解析 |
| 54 | + skip-name-resolve |
| 55 | + #关闭TIMESTAMP类型默认值 |
| 56 | + explicit_defaults_for_timestamp |
| 57 | +3. 启动服务 |
| 58 | + |
| 59 | + windows: |
| 60 | + |
| 61 | + 1. service mysqld start |
| 62 | + 2. service mysqld stop |
| 63 | + 3. service mysqld restart |
| 64 | + 4. service mysqld status |
| 65 | + |
| 66 | +4. 三大范式 |
| 67 | + |
| 68 | + 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。 |
| 69 | + |
| 70 | + 1. 第一范式(确保每列保持原子性) |
| 71 | + |
| 72 | + 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 |
| 73 | + |
| 74 | + 第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。 |
| 75 | + |
| 76 | + 2. 第二范式(确保表中的每列都和主键相关) |
| 77 | + |
| 78 | + 第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。 |
| 79 | + |
| 80 | + 比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。 |
| 81 | + |
| 82 | + 订单信息表 |
| 83 | + |
| 84 | +  |
| 85 | + |
| 86 | + 这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。 |
| 87 | + |
| 88 | + 而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。 |
| 89 | + |
| 90 | + 案例分析: |
| 91 | + |
| 92 | + 学生| 课程| 老师| 老师职称| 教材| 教室| 上课时间| |
| 93 | + ---|---|---|---|---|---|---| |
| 94 | + 小明| 一年级语文(上)| 大宝| 副教授| 《小学语文1》| 101| 14:30| |
| 95 | + |
| 96 | + 3. 第三范式(确保每列都和主键列直接相关,而不是间接相关) |
| 97 | + |
| 98 | + 第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。 |
| 99 | + |
| 100 | + 比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。 |
| 101 | + |
| 102 | +  |
| 103 | + |
| 104 | + |
| 105 | + drop database if exists db_name; |
| 106 | + |
| 107 | +4. DDL |
| 108 | + |
| 109 | + 新建数据库 |
| 110 | + |
| 111 | + -- 数据库名不需要加引号 |
| 112 | + DROP database if EXISTS mystudents; |
| 113 | + CREATE DATABASE mystudents DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; |
| 114 | + |
| 115 | + 新建表结构 |
| 116 | + |
| 117 | + -- 新建student表 |
| 118 | + |
| 119 | + -- drop TABLE if EXISTS student; |
| 120 | + CREATE table student( |
| 121 | + id int PRIMARY KEY auto_increment, |
| 122 | + sno VARCHAR(10) UNIQUE, |
| 123 | + sname varchar(20) not NULL, |
| 124 | + sgender VARCHAR(2) DEFAULT '女', |
| 125 | + sbirthday date, |
| 126 | + sdept varchar(20) |
| 127 | + |
| 128 | + ) |
| 129 | + |
| 130 | + |
| 131 | + -- 新建course |
| 132 | + |
| 133 | + CREATE table course( |
| 134 | + cno VARCHAR(4) PRIMARY key, |
| 135 | + cname VARCHAR(40) not null, |
| 136 | + cpno varchar(4), |
| 137 | + ccredit SMALLINT, |
| 138 | + -- 记住属性要用括号 |
| 139 | + FOREIGN key(cpno) REFERENCES course(cno) |
| 140 | + ) |
| 141 | + |
| 142 | + |
| 143 | + -- 新建sc表 |
| 144 | + |
| 145 | + create table sc( |
| 146 | + sno VARCHAR(10), |
| 147 | + cno varchar(4), |
| 148 | + grade SMALLINT, |
| 149 | + PRIMARY key(sno,cno), |
| 150 | + FOREIGN key(sno) REFERENCES student(sno), |
| 151 | + FOREIGN key(cno) REFERENCES course(cno) |
| 152 | + ) |
| 153 | + |
| 154 | + |
| 155 | + -- 查看表结构 |
| 156 | + |
| 157 | + desc sc; |
| 158 | + show create table sc; |
| 159 | + |
| 160 | + -- 修改表约束 |
| 161 | + |
| 162 | + alter table sc add FOREIGN key(sno) REFERENCES student(sno); |
| 163 | + alter table sc add FOREIGN key(cno) REFERENCES course(cno); |
| 164 | + |
| 165 | + |
| 166 | + use mystudents; |
| 167 | + |
0 commit comments