MySQL 学习笔记

97 阅读3分钟

install it(docker)

docker run --name mysqltest \
  -p 3306:3306 \
  -v $HOME/_docker/mysql/conf.d:/etc/mysql/conf.d \
  -v $HOME/_docker/mysql/data:/var/lib/mysql \
  -v /etc/localtime:/etc/localtime:ro \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -d mysql:5.7.23
  • --name mysql:容器名字为 mysql
  • -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
  • -v $HOME/_docker/mysql/conf.d:将主机当前目录下的 ~/_docker/mysql/conf.d 挂载到容器的 /etc/mysql/conf.d,这个是挂载配置目录
  • -v $HOME/_docker/mysql/data:将主机当前目录下的 data 目录挂载到容器的 /var/lib/mysqs,为数据文件存放路径
  • -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

登录mysql

mysql -uroot -p

wangchujiang.com/docker-tuto…

常用命令

  • show databases; //有多少个数据库
  • use school; //切换到某个数据库
  • show tables; //查看数据库中所有的表
  • describe student; --显示数据库中所有表的信息
  • exit; --退出连接
  • SHOW COLUMNS FROM runoob_tbl; // 显示列信息(第一行)
  • SHOW INDEX FROM runoob_tbl; // 显示索引信息(第一列,primary key)

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

juejin.cn/post/689972…

数据库文件

MySQL如果使用InnoDB存储引擎,数据库文件类型就包括

  • .frm 主要存放与表相关的数据信息,主要包括表结构的定义信息
  • .ibd 如果使用独享表去存放数据,每个表都有一个ibd
  • .ibdata1 如果使用共享表去存放数据,所有表的数据都在一起

www.cnblogs.com/h--d/p/1472…

备份与还原

Mysql 备份所有的table,databases,以及整个数据库

mysqldump -u username -p dbname table1 table2 ...-> BackupName.sql
mysqldump -u username -p --databases dbname2 dbname2 > Backup.sql
mysqldump -u username -p -all-databases > /home/BackupName.sql

还原

mysql -u root -p [dbname] < backup.sq
  • restore 需要dbname存在或者不指定,全部导入。
  • mysqldump 本质上是通过查询的方式,把数据导出,不能关闭daemon进程(热备份)
  • 冷备份就是直接拷贝文件夹,但要注意mysql信息的一致

增删改查

CREATE DATABASE IF NOT EXISTS codes_user;

CREATE TABLE IF NOT EXISTS `codes_user`(
   `user_id` INT UNSIGNED AUTO_INCREMENT,
   `user_title` VARCHAR(100) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `user_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO codes_user(user_title,submission_date) VALUES("good2",curdate());

SELECT * FROM codes_user WHERE user_id=2;
SELECT * FROM codes_user WHERE user_title="good";
SELECT * FROM codes_user WHERE BINARY user_title="good"; -- 区分大小写

UPDATE codes_user SET user_title="bad" WHERE user_id=10;

DELETE FROM codes_user WHERE user_id=3;

SELECT * from codes_user WHERE user_title LIKE '%2';
'%a'     //以a结尾的数据
'a%'     //以a开头的数据
'%a%'    //含有a的数据
'_a_'    //三位且中间字母是a的
'_a'     //两位且结尾字母是a的
'a_'     //两位且开头字母是a的

SELECT * from codes_user ORDER BY user_title ASC;

SELECT user_title, COUNT(*) FROM codes_user GROUP BY user_title; -- 统计每个出现的次数
SELECT user_title, SUM(user_id) as user_id_sum FROM codes_user GROUP BY user_title; -- 统计总计的值


-- 能够将几个SQL命令合并成一个原子操作,要么全部执行成功,要么全部执行失败。
begin;
....
commit;

  • mysql的大小写是由参数控制的。(windows下默认不区分,linux下默认区分)
  • sql的命令大小写不敏感

SQL 注入

以下是SQL注入的几个example

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

//实际执行可能是这样的,进而获取了所有的用户信息
SELECT * FROM Users WHERE UserId = 105 OR 1=1;

//也可能是这样,恶意删除了相关的信息
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
``
> 不使用用户输入直接生成SQL语句,需要对用户的输入进行检查。
Reference from <https://www.w3schools.com/sql/sql_injection.asp>