数据库之mysql

准备

  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

  配置文件更改时应该先做备份,更改完成之后需要重新启动来重新读取配置文件

  设置完成后查看编码信息与排序信息

  1. SHOW VARIABLES LIKE '%char%';
  2. 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客户端输入下述三条命令:

  1. CREATE USER 'jack'@'%' IDENTIFIED BY '123456'   # jack是用户名,%是任意主机,123456是密码

  2. GRANT ALL ON *.* TO 'jack'@'%'
  3. FLUSH PRIVILEGES

  也可以直接用下面两条命令:

  1. grant all on 数据库.* to 用户名@登录主机 identified by "密码"
  2. 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()

备份与还原数据库

  1. 备份整个数据库   mysqldump -uroot -p123456 database>new_database.sql
  2. 备份数据库某张表   mysqldump -uroot -p123456 database table>new_table.sql
  3. 还原数据库   mysqldump -uroot -p123456 database<new_database.sql                # 恢复时数据库必须存在,可以是空数据库
  4. 还原数据库表  登录进入数据库,然后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 );
View Code

表信息

  1. 查看表的创建语句:SHOW CREATE TABLE `mysql`.`user`;
  2. 删除表:DROP TABLE `mysql`.`user`;
  3. 重命名或移动表:RENAME TABLE FROM `mysql`.`user` TO `test`.`user`
  4. 查看表结构:DESC `mysql`.`user`;
  5. 查看列信息:SHOW COLUMNS FROM  `mysql`.`user` LIKE Pattern
  6. 添加列:ALTER TABLE `mysql`.`user` ADD COLUMN `gender` enum('M','F'),ADD COLUMN `age` int
  7. 删除列:ALTER TABLE `mysql`.`user` DROP COLUMN `gender`(暂不支持删除多列)
  8. 修改现有列的类型和选项:ALTER TABLE `mysql`.`user` MODIFY `gender` char(1) default 1;     注:一旦修改的列已经存在了违反约束的数据,那么修改失败
  9. 完全修改列信息: ALTER TABLE `mysql`.`user` CHANGE `gender` `sex` enum('M', 'F')  注:无法只修改列名字。如果只想修改名字,那么请带上原来的列类型选项

数据类型

  MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。

  1. 数值数据类型:包括整数类型TINYINT(1byte)、SMALLINT(2bytes)、MEDIUMINT(3bytes)、INT(4bytes)、BIGINT(8bytes)、浮点小数数据类型FLOAT(4bytes)和DOUBLE(8bytes)、定点小数类型DECIMAL。# 默认是有符号的。参数是可以显示的最大位数
  2. 日期/时间类型:包括YEAR(1byte)、TIME(3bytes)、DATE(3bytes)、DATETIME(8bytes)和TIMESTAMP(4bytes)
  3. 字符串类型:包括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、外键

    非功能键(索引)

  1. 添加索引   ALTER TABLE `mysql`.`user` ADD INDEX(`age`)
  2. 删除索引   ALTER TABLE `mysql`.`user` DROP index `age`

记录(行)之增加

  1. 普通插入: INSERT INTO `users` VALUES ();                 # 默认为空的也必须插入,否则这条语句语法就无法通过
  2. 指定列插入:INSERT INTO  `users`  () VALUES ()                         # 插入指定数据需要知道哪些不需要指定值
  3. 一次插入多行:INSERT INTO `users` VALUES (),()

记录(行)之删除

  1. 清空表:DELETE FROM `users` WHERE 1
  2. 删除指定行:DELETE FROM `users` WHERE pattern

  注:通常在删除之前,我们要注意我们的WHERE,同时,我们建议在删除前,使用相同的WHERESELECT先查询一遍

记录(行)之改

  UPDATE `users` SET `name`='jack' WHERE pattern

  注:通常在删除之前,我们要注意我们的WHERE,同时,我们建议在删除前,使用相同的WHERESELECT先查询一遍

记录(行)之查

  1. 完整查询:  SELECT * FROM `users` WHERE 1
  2. 指定列查询: SELECT Column1,Column2 FROM `users` WHERE 1
  3. 指定行查询: SELECT * FROM `users` WHERE pattern
  4. 查询排序:SELECT * FROM `users` WHERE pattern ORDER BY `u_id` `name` DESC
  5. 分组查询: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连接条件

 

  

     

 

  

  

  

 

 

 

 

  

posted @ 2017-05-02 16:19  龙云飞谷  阅读(443)  评论(0编辑  收藏  举报