连接数据库参数
- -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 : 大小写敏感(存拼音,日文)
数据类型介绍
整数
字符串
- char(100) : 定长字符串类型,不管字符串长度多长,都立即分配100个字符长度的存储空间,未占满的空间使用"空格"填充
- varchar(100) : 变长字符串类型,每次存储数据之前,都要先判断一下长度,按需分配此盘空间,会单独申请一个字符长度的空间存储字符长度(少于255,如果超过255以上,会占用两个存储空间)
日期
- 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;
关于库定义规范
- 库名使用小写字符
- 库名不能以数字开头
- 不能是数据库内部的关键字
- 必须设置字符集
建表定义列属性
- 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 '性别';
建表规范
- 表名小写字母,不能数字开头
- 不能是保留字符,使用和业务有关的表名
- 选择合适的数据类型及长度
- 每个列设置
NOT NULL DEFAULT
对于数据0填充,对于字符使用有效字符串填充 - 每个列设置注释
- 表必须设置存储引擎和字符集
- 主键列尽量是无关列数字列,最好是自增长
- 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;
最后一次更新于2020-05-30 13:15
0 条评论