连接数据库参数

  • -u : 登录用户
  • -p : 登录密码
  • -P : 登录端口
  • -h : 登录主机
  • -S : Socket方式登录
  • -e : 免交互执行sql语句
  • < : 恢复数据
mysql -p123456 -e "select user,host from mysql.user;"
mysql -uroot -p -S /tmp/mysql.sock
mysql -uroot -p -h10.0.0.51 -P3306
mysql -uroot -p123456 < /root/world.sql

内置命令

  • help : 打印mysql帮助
  • \c : 结束上个命令运行
  • ctrl+c : 结束上个命令运行
  • \q : 退出mysql
  • ctrl+d : 退出mysql
  • \G : 将数据竖起来显示
  • source : 恢复备份文件
#登录后执行命令
help
?
select user,host from mysql.user\G;
source /root/world.sql

SQL基础应用

结构化的查询语言,关系型数据库通用的命令,遵循SQL92的标准(SQL_MODE)

数据库的逻辑结构

  • 库名
  • 字符集
  • 排序规则

  • 表名
  • 存储引擎类型
  • 字符集
  • 排序规则
  • 列名
  • 数据类型
  • 约束
  • 其他属性
  • 数据行

字符集

相当于MySQL的密码本(编码表)

#查看所有编码
show charset;
  • utf8 : 3个字节
  • utf8mb4 : 4个字节,支持emoji,推荐使用

排序规则

#查看排序规则
show collation;
  • utf8mb4_general_ci : 大小写不敏感
  • utf8mb4_bin : 大小写敏感(存拼音,日文)

数据类型介绍

整数

16956686-6cb8cf2c0c681252.png

字符串

16956686-599be7ba0c7040a9.png

  • char(100) : 定长字符串类型,不管字符串长度多长,都立即分配100个字符长度的存储空间,未占满的空间使用"空格"填充
  • varchar(100) : 变长字符串类型,每次存储数据之前,都要先判断一下长度,按需分配此盘空间,会单独申请一个字符长度的空间存储字符长度(少于255,如果超过255以上,会占用两个存储空间)

日期

16956686-7abec7820bfb10cd.png

  • datetime : 范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
  • timestamp : 范围为从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999

DDL 数据定义语言

创建数据库

CREATE DATABASE zabbix CHARSET utf8mb4 COLLATE utf8mb4_bin;

查看库情况

#查看所有库
SHOW DATABASES;
#查看zabbix库语句
SHOW CREATE DATABASE zabbix;

删除数据库(谨慎操作)

DROP DATABASE zabbix;

修改数据库字符集

当前字符集一定是目标字符集的子集,否则可能会出现乱码的情况

ALTER DATABASE zabbix CHARSET utf8mb4;

关于库定义规范

  1. 库名使用小写字符
  2. 库名不能以数字开头
  3. 不能是数据库内部的关键字
  4. 必须设置字符集

建表定义列属性

  • PRIMARY KEY : 主键约束,每个表中只能有一个,非空且唯一
  • NOT NULL : 非空约束,不允许空值
  • UNIQUE KEY : 值唯一约束,不允许重复值
  • DEFAULT : 设置默认参数,一般配合NOT NULL一起使用
  • UNSIGNED : 无符号约束,一般是配合数字列,非负数
  • COMMENT : 备注
  • AUTO_INCREMENT : 值自增

创建数据表

CREATE TABLE stu(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '学号',
sname char(20) NOT NULL COMMENT "名字",
age TINYINT NOT NULL DEFAULT 0 COMMENT "年龄",
gender enum('m','f','n') NOT NULL DEFAULT 'n' COMMENT "年龄",
intime datetime NOT NULL DEFAULT now() COMMENT "时间"
)ENGINE INNODB CHARSET utf8mb4;

查看表情况

#查看所有表
SHOW TABLES;
#查看stu表语句
SHOW CREATE TABLE stu;
#查看stu表结构
DESC stu;

创建一个表结构一样的表

#创建一个表结构和stu一样的表
CREATE TABLE test LIKE stu;

删除数据表(谨慎操作)

DROP TABLE test;

在stu表中添加列

#添加qq列到最后
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL COMMENT 'qq号';
#添加wechat列到sname列后
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname;
#添加num列到最前面
ALTER TABLE stu ADD num INT NOT NULL UNIQUE COMMENT '身份证' FIRST;

删除列

ALTER TABLE stu DROP qq;
ALTER TABLE stu DROP wechat;
ALTER TABLE stu DROP num;

修改列属性

#修改列属性
ALTER TABLE stu MODIFY sname VARCHAR(64) NOT NULL COMMENT "名字";
#修改列名和属性
ALTER TABLE stu CHANGE gender sex CHAR(4) NOT NULL COMMENT '性别';

建表规范

  1. 表名小写字母,不能数字开头
  2. 不能是保留字符,使用和业务有关的表名
  3. 选择合适的数据类型及长度
  4. 每个列设置NOT NULL DEFAULT对于数据0填充,对于字符使用有效字符串填充
  5. 每个列设置注释
  6. 表必须设置存储引擎和字符集
  7. 主键列尽量是无关列数字列,最好是自增长
  8. enum类型不要保存数字,只能是字符串类型

DCL 数据控制语言

  • grant
  • revoke

DML 数据操作语言

  • INSERT
  • UPDATE
  • DELETE

添加数据

#最规范
INSERT INTO stu(id,sname,age,sex,intime) VALUES(1,'zs',12,'m',now());
#最简洁
INSERT stu VALUES(2,'ls',13,'f',now());
#针对性的录入数据
INSERT stu(sname,age,sex) VALUES('ww',14,'f');
#一次性录入多行
INSERT stu(sname,age,sex) VALUES('xx',15,'f'),('zz',16,'m'),('yy',17,'f');

修改数据

#指定条件修改数据
UPDATE stu SET sname='bb' WHERE id=6;
#不指定条件修改数据,则修改所有数据
UPDATE stu SET sname='aaa';

删除数据

#指定条件删除数据
DELETE FROM stu WHERE id=1;
#不指定条件删除数据,则删除所有数据
DELETE FROM stu;
#全表删除
truncate table stu;

两个全表删除命令的区别

  • truncate : DDL操作,对与表段中的数据页进行清空,速度快
  • delete : DML操作,是逻辑性质删除,逐行进行删除,速度慢

生产中屏蔽delete功能,也可以建1个字段通过该字段来表示数据删除

#新增一个字段
ALTER TABLE stu ADD is_del TINYINT DEFAULT 0;
#修改该字段的值来表示该数据删除
UPDATE stu SET is_del=1 WHERE id=7;