zoukankan      html  css  js  c++  java
  • 数据库之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连接条件

     

      

         

      

      

      

     

      

  • 相关阅读:
    IOS证书的申请和使用
    团队开发中如何共用证书
    IOS 开发文件操作——NSFileManager
    RxJava中的doOnSubscribe默认运行线程分析
    XMPP协议实现即时通讯底层书写 (一)--从RFC6121阅读開始
    ant 打批量渠道包,第三方项目作为library打包出错的问题
    hdu5289 2015多校联合第一场1002 Assignment
    【一步步学OpenGL 21】 -《聚光灯光源》
    Images.xcassets 的简单使用
    网易 2016 实习研发project师 3道 编程题
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/6753061.html
Copyright © 2011-2022 走看看