准备
ubantu系统,navicat for mysql软件
引言
mysql是基于c/s通信架构设计的,用户通过客户端和服务器端进行交互,服务器端对数据库进行操作。简单地来说,我们把sql语句传达给客户端,客户端把sql语句翻译成服务器端可以理解和可以执行的指令,服务器端按照这些指令对数据库进行查询操作,把操作结果传给客户端,客户端再把结果翻译成用户也就是我们可以看懂的内容。c/s架构的好处之一就是用户不需要和服务器端打交道,也就是意味着用户不需要学习复杂的服务器端命令,只需要学习简单的sql语句以及客户端命令即可,客户端会帮我们进行指令的翻译等工作。mysql的c/s架构是一个服务器端可对应多个客户端,对于mysql怎么区分不同用户这里暂不需要了解。
mysql是关系型数据库的一种,所以我们在设计数据库的时候一定要抓住实物之间的关系。我们以后设计网站的时候,不同的业务板块都应该有一个单独的架构或者数据库,我们可以把单独的板块理解为单独的网站。
安装mysql
命令:sudo apt install mysql-server
配置mysql
修改/etc/mysql/my.cnf文件,在文件末尾加上下述几条语句([]表示组)
[client]
default-character-set = utf8 # 指定客户端编码,因为默认的latin1不支持中文,所以我们在这里选择utf8
[mysqld]
character-set-server = utf8 # 指定服务器端编码,通常设定为与客户端编码一致
collation-server = utf8_general_ci # 同一种编码也有不同的排序规则
bind_address = 0.0.0.0 # 第一层守护,监听所有IP
配置文件更改时应该先做备份,更改完成之后需要重新启动来重新读取配置文件
设置完成后查看编码信息与排序信息
- SHOW VARIABLES LIKE '%char%';
- SHOW VARIABLES LIKE '%colla%';
启动mysql
命令:sudo service mysql restart 或者 sudo systemctl restart mysql
注意:mysql的服务进程名是mysql,所以命令不是sudo service mysqld restart,我们通常不是直接使用mysqld的程序名来启动程序,因为这个程序可能需要一些复杂的参数,我们借助systemctl 与 service 可以轻松处理相关命令
navicat连接mysql
mysql客户端输入下述三条命令:
-
CREATE USER 'jack'@'%' IDENTIFIED BY '123456' # jack是用户名,%是任意主机,123456是密码
- GRANT ALL ON *.* TO 'jack'@'%'
- FLUSH PRIVILEGES
也可以直接用下面两条命令:
- grant all on 数据库.* to 用户名@登录主机 identified by "密码"
- flush PRIVILEGES
建库
查看已有数据库:SHOW DATABASES;
创建数据库: CREATE DATABASE `test` charset utf8(character set utf8);
查看数据库创建过程: SHOW CREATE DATABASE `test`;
删除数据库:DROP DATABASE `test`
修改数据库编码:ALTER DATABASE `test` charset utf8
查看数据库版本号:status/select version()
备份与还原数据库
- 备份整个数据库 mysqldump -uroot -p123456 database>new_database.sql
- 备份数据库某张表 mysqldump -uroot -p123456 database table>new_table.sql
- 还原数据库 mysqldump -uroot -p123456 database<new_database.sql # 恢复时数据库必须存在,可以是空数据库
- 还原数据库表 登录进入数据库,然后USE选定数据库,用source导入
建表
数据库中的表在用户层相当于二维的excel表格
查看表的创建过程:SHOW CREATE TABLE `mysql`.`user`;
创建表:CREATE TABLE `test`.`user`(column1 type1 option, colum2 type2 option);
查看数据库表(已选定数据库情况下):SHOW TABLES;
移动并重名数据库表:RENAME TABLE `python`.`user` TO `test`.`user`
删除表:DROP TABLE `test`
注:
- 创建表的最后一行不要加逗号;排序 collate=utf8_general_ci不区分大小写,查询快 collate=utf8_genaral_bin区 分大小写,排序速度慢;每个表度需要一个primary key(主键唯一且为非空);char()分配固定长度, varchar()是最大长度可变的,性能相对较差
- 数据库引擎:1、myisam 非事务型,查询快 2、innodb 事务型,修改快,默认引擎(功能强大)
- 数据库表、列和数据库一样,可以单独地设置字符集与排序规则
- 不指定列的default时默认会default null。
- 关于字符集编码如果不指定就存在继承现象:列寻找表的编码,表寻找库的编码,库寻找配置文件编码
- 数据库的每一个字段都必须有固定类型
- mysql的其中一个规则是名字(字段名也是名字)要加反引号
- c 取消命令(cancle) G 把列数据逐行显示
- 主键唯一且非空,但是唯一且非空不一定是主键
- 建表有个套路就是用没有实际含义的id当作主键
- 注册的时候哪些字段可以为空,哪些可以为空根据实际需求来定
- AUTO_INCREMENT 需要和INT结合使用,有了AUTO_INCREMENT可以不指定id进行插入
- 只有ALTER、RENAME、CREATE等关键字要接DATABASE 以及TABLE
- 实体之间的关系分为三种:一对一;一对多;多对多。区分这三种关系可以通过画图来说明。
- 一对多:使用
外键
约束来实现 - 一对一:使用外键 + UNIQUE KEY来实现
- 多对多:使用外键 + 第三方表来实现
1 CREATE TABLE `users` ( 2 `id` int PRIMARY KEY AUTO_INCREMENT, 3 `email` char(50) UNIQUE KEY NOT NULL, 4 `user_name` varchar(20) NOT NULL, 5 `telphone` char(11) 6 ); 7 8 CREATE TABLE `sellers` ( 9 `id` int PRIMARY KEY AUTO_INCREMENT, 10 `user_id` int UNIQUE KEY NOT NULL, 11 FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) 12 ); 13 14 CREATE TABLE `houses` ( 15 `id` int PRIMARY KEY AUTO_INCREMENT, 16 `summary` varchar(100) NOT NULL, 17 `seller_id` int NOT NULL, 18 FOREIGN KEY (`seller_id`) REFERENCES `seller`(`id`) 19 ); 20 21 CREATE TABLE `sellers_tags`( 22 `sellers_id` int NOT NULL, 23 `tag_id` int NOT NULL, 24 FOREIGN KEY (`sellers_id`) REFERANCES sellers(`id`), 25 FOREIGN KEY (`tag_id`) REFERANCES tags(`id`), 26 UNIQOE KEY(`sellers_id`, `tag_id`) # PRIMARY KEY(`sellers_id`, 27 28 `tag_id`) 29 ); 30 31 CREATE TABLE `tags` ( 32 `id` int PRIMARY KEY AUTO_INCREMENT, 33 `name` varchar(20) UNIQUE KEY NOT NULL 34 );
表信息
- 查看表的创建语句:SHOW CREATE TABLE `mysql`.`user`;
- 删除表:DROP TABLE `mysql`.`user`;
- 重命名或移动表:RENAME TABLE FROM `mysql`.`user` TO `test`.`user`
- 查看表结构:DESC `mysql`.`user`;
- 查看列信息:SHOW COLUMNS FROM `mysql`.`user` LIKE Pattern
- 添加列:ALTER TABLE `mysql`.`user` ADD COLUMN `gender` enum('M','F'),ADD COLUMN `age` int
- 删除列:ALTER TABLE `mysql`.`user` DROP COLUMN `gender`(暂不支持删除多列)
- 修改现有列的类型和选项:ALTER TABLE `mysql`.`user` MODIFY `gender` char(1) default 1; 注:一旦修改的列已经存在了违反
约束
的数据,那么修改失败 - 完全修改列信息: ALTER TABLE `mysql`.`user` CHANGE `gender` `sex` enum('M', 'F') 注:无法只修改列名字。如果只想修改名字,那么请带上原来的
列类型
和选项
数据类型
MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
- 数值数据类型:包括整数类型TINYINT(1byte)、SMALLINT(2bytes)、MEDIUMINT(3bytes)、INT(4bytes)、BIGINT(8bytes)、浮点小数数据类型FLOAT(4bytes)和DOUBLE(8bytes)、定点小数类型DECIMAL。# 默认是有符号的。参数是可以显示的最大位数
- 日期/时间类型:包括YEAR(1byte)、TIME(3bytes)、DATE(3bytes)、DATETIME(8bytes)和TIMESTAMP(4bytes)
- 字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等
YEAR的日期格式是YYYY, TIME的日期格式是HH:MM:SS, DATE的日期格式是YYYY-MM-DD, DATETIME的日期格式是YYYY-MM-DD HH:MM:SS,TIMESTAMP的日期格式是YYYY-MM-DD HH:MM:SS。
字符串类型括号里的参数意义就是字节数
键和索引
mysql中可以把键就理解为索引,索引就是为某些列,花费额外的空间,来维持一个高效的数据结构,加快查找速度。注:加速只对指定的列有效
功能键(约束键):1、主键 2、唯一键 3、外键
非功能键(索引)
- 添加索引 ALTER TABLE `mysql`.`user` ADD INDEX(`age`)
- 删除索引 ALTER TABLE `mysql`.`user` DROP index `age`
记录(行)之增加
- 普通插入: INSERT INTO `users` VALUES (); # 默认为空的也必须插入,否则这条语句语法就无法通过
- 指定列插入:INSERT INTO `users` () VALUES () # 插入指定数据需要知道哪些不需要指定值
- 一次插入多行:INSERT INTO `users` VALUES (),()
记录(行)之删除
- 清空表:DELETE FROM `users` WHERE 1
- 删除指定行:DELETE FROM `users` WHERE pattern
注:通常在删除之前,我们要注意我们的WHERE
,同时,我们建议在删除前,使用相同的WHERE
的SELECT
先查询一遍
记录(行)之改
UPDATE `users` SET `name`='jack' WHERE pattern
注:通常在删除之前,我们要注意我们的WHERE
,同时,我们建议在删除前,使用相同的WHERE
的SELECT
先查询一遍
记录(行)之查
- 完整查询: SELECT * FROM `users` WHERE 1
- 指定列查询: SELECT Column1,Column2 FROM `users` WHERE 1
- 指定行查询: SELECT * FROM `users` WHERE pattern
- 查询排序:SELECT * FROM `users` WHERE pattern ORDER BY `u_id` `name` DESC
- 分组查询:SELECT `gender`,COUNT(*) AS num FROM WHERE 1 GROUP BY `gender`
注:分组查询只有和聚合函数结合使用才有意义
多表查询
- 内联接(交叉连接)
SELECT `s_name`, `c_flower` FROM `classes` INNER JOIN `students` ON `students`.`c_id` = `classes`.`c_id` WHERE `students`.`c_id` = 9;
注:on是连接条件,where是筛选条件。也就是说,ON
用来连接出有意义数据行的条件,WHERE
是已经连接了以后,再筛选出当时有需要的数据
- 外连接(左连接与右连接)
SELECT * FROM FROM `classes` LEFT JOIN `students` ON `students`.`c_id` = `classes`.`c_id`
注:左连接以左表为基准,右连接以右表为基准。区别于内连接的是外连接必须要用ON连接条件