结构化查询语言
5.7 以后符合SQL92严格模式
通过sql_mode参数来控制
数据定义语言
数据操作语言
数据控制语言
数据查询语言
-u:(接上用户名)
-p:(接密码)
-S:(本地通过sock文件连接)
-h:(接上IP地址)
-P:(接上端口号)
-e:(免交互执行sql语句 不登录数据库执行(一般用于监控脚本等))
示例1:本地sock文件链接数据库
mysql -uroot -p -S /tmp/mysql.sock
示例2::远程连接数据库
mysql -uroot -p -h10.0.0.51 -P3306
示例3:免交互执行sql语句
mysql -uroot -p -e "show databases;"
help 打印mysql帮助
\c ctrl+c 结束上个命令运行
\q quit; exit; ctrl+d 退出mysql
\G 将数据竖起来显示
source 恢复备份文件
相当于MySQL的密码本(编码表)
show charset;
utf8 : 3个字节
utf8mb4 (建议): 4个字节,支持emoji
对于英文字符串的,大小写的敏感
# 示例
utf8mb4_general_ci 大小写不敏感
utf8mb4_bin 大小写敏感(存拼音,日文)
show collation;
说明:手机号是无法存储到int的。一般是使用char类型来存储手机号
小数
float
double 一般不用这2个,因为这2个不准确会四舍五入
decimal 用这个参数,准确度更高 格式为:decimal(总长,小数位数)
例:decimal(4,2) 最大数为99.99
理解为:这个数值的长度只能有4位,且小数点后面只能有2为位数
固定长度字符串,最多为255个字符
#例子
char(11) :
#解释:定长的字符串类型,在存储字符串时,最大字符长度11个,立即分配11个字符长度的存储空间,如果存不满,空格填充!
可变长度字符串,最多为65535个字符
# 例子
varchar(11):
#解释:变长的字符串类型看,最大字符长度11个。在存储字符串时,自动判断字符长度,按需分配存储空间。而且会分配单独的一个字节来存储字符长度值(如果字符长度大于255,则会分配2个字节来存储)
枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。
1. 少于255个字符串长度,定长的列值,选择char
2. 多于255字符长度,变长的字符串,可以选择varchar
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
# timestamp会受到时区的影响(就是说,如果变更了地理位置,会自动调整成当地的时间)
非空且唯一,一张表中只能有一个主键,但是主键可以是多个列
列值必填,不能为空!一般在设计表的时候每一列都要加上
列值不能重复
对于数字列,无符号 (此约束一定要跟在数字列的后面)
comment: 注释
default: 默认值
auto_increment: 自动增长
create database zabbix charset utf8mb4 collate utf8mb4_bin;
show databases;
show databases create zabbix;
1.库名不能有大写字母
2.建库要加字符集
3.库名不能有数字开头
4.库名要和业务相关
mysql> drop database 库名;
#一定是从小往大了改!(目标字符集一定是源字符集的严格超级)
例如:utf8--->utf8mb4
1. 创建一个名字叫yfc的库
create database yfc;
2. 查看库的字符集
show create database yfc;
3. 修改字符集为utf8mb4
alter database yfc charset utf8mb4;
1. 先切换到要在哪个库下建表
use yfc
2. 建表
CREATE TABLE stu(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘学号‘,
NAME VARCHAR(64) NOT NULL COMMENT ‘姓名‘,
age TINYINT UNSIGNED NOT NULL DEFAULT 99 COMMENT ‘年龄‘,
gender ENUM(‘m‘,‘f‘,‘n‘) NOT NULL DEFAULT ‘n‘ COMMENT ‘性别‘,
telnum CHAR(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘手机号‘,
intime DATETIME NOT NULL DEFAULT NOW() COMMENT ‘入学时间‘
) ENGINE=INNODB CHARSET=utf8mb4 COMMENT ‘学生表‘;
show create table stu;
create table t1 like stu;
create table user select * from mysql.user;
1. 表名小写字母,不能数字开头,
2. 不能是保留字符,使用和业务有关的表名
3. 选择合适的数据类型及长度
4. 每个列设置 NOT NULL + DEFAULT .对于数据0填充,对于字符使用有效字符串填充
5. 每个列设置注释
6. 表必须设置存储引擎和字符集
7. 主键列尽量是无关列数字列,最好是自增长
8. enum类型不要保存数字,只能是字符串类型
第一种方法:
desc 表名;
第二种方法:
show create table 表名;
mysql> drop table 表名;
1. 大表结构变更,会长时间锁表,肯定会影响到线上业务
2. 8.0以后就自动解决了,8.0以前需要业务不繁忙期间或者使用PT-OSC工具
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL DEFAULT 0 COMMENT ‘QQ号‘;
--检查
DESC stu;
ALTER TABLE stu ADD wecht VARCHAR(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘微信号‘ AFTER gender ;
--检查
DESC stu;
ALTER TABLE stu ADD sid VARCHAR(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘sid‘ FIRST;
--检查
DESC stu;
ALTER TABLE 表名 drop 列名;
modify 只能修改列的属性
change 可以修改列字段的名字
ALTER TABLE stu MODIFY NAME VARCHAR(100) NOT NULL COMMENT ‘姓名‘;
ALTER TABLE stu CHANGE 修改前的字段名 修改后的字段名 VARCHAR(64) NOT NULL COMMENT ‘姓名‘;
--例子:
+-----------+---------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| user_name | varchar(20) | NO | | NULL | |
| email | varchar(50) | NO | | NULL | |
| age | tinyint(3) unsigned | NO | | 0 | |
| fee | decimal(10,2) | NO | | 0.00 | |
| intime | datetime | NO | | CURRENT_TIMESTAMP | |
+-----------+---------------------+------+-----+-------------------+----------------+
1. 一次性录入一行
insert into 表名(id,user_name,email,age,fee,intime)
values(1,‘yufenchi‘,‘784381392@qq.com‘,27,500.24,now());
--数字不用加引号,字符串要加引号
2. 一次性录入多行
insert into user(id,user_name,email,age,fee,intime)
values(2,‘yufenchi1‘,‘784381391@qq.com‘,28,500.25,now()),
(3,‘yufenchi2‘,‘784381393@qq.com‘,29,500.26,now());
一定要加where 条件,如果不加会把表的记录全部改掉
--例:
+----+-----------+------------------+-----+--------+---------------------+
| id | user_name | email | age | fee | intime |
+----+-----------+------------------+-----+--------+---------------------+
| 1 | yufenchi | 784381392@qq.com | 27 | 500.24 | 2019-09-08 23:19:13 |
| 2 | yufenchi1 | 784381391@qq.com | 28 | 500.25 | 2019-09-08 23:28:49 |
| 3 | yufenchi2 | 784381393@qq.com | 29 | 500.26 | 2019-09-08 23:28:49 |
+----+-----------+------------------+-----+--------+---------------------+
mysql> update user set age=100 where id=1;
--这里的=是一个判断,判断id=1
mysql> select * from user;
mysql> update user set fee=12.11 where fee=500.25;
mysql> update user set user_name=‘yufenchi‘ where user_name!=‘yufenchi‘;
--判断不等于!=
mysql> update user set user_name=‘yufenchi2‘ where id in (2,3);
--用in 还有一种是not in(不在里面)
mysql> update user set age=54 where id between 2 and 4;
--between 在...之间的
mysql> select * from user;
表结构+数据全部(物理)删除
数据全部清空(物理),清空是区!磁盘空降立即释放,HWM高水位线会下降
逐行删除表中所有数据,逻辑删除!如果数据行多,删除的会很慢!并没有真正的从磁盘上删除,只是在存储层面打了标记,磁盘空间不会立即释放,HWM高水位线不会降低
用状态列标记一个行是否存在.
UPDATE 替代 DELETE
ALTER TABLE stu ADD state CHAR(1) NOT NULL DEFAULT ‘0‘ COMMENT ‘状态列:1代表删除,0代表未删除‘;
SELECT * FROM stu;
--原语句:
DELETE FROM stu WHERE sname=‘张四‘;
--改写为:
UPDATE stu SET state=‘1‘ WHERE sname=‘张四‘;
--原查询语句:
SELECT * FROM stu;
--改写为:
SELECT * FROM stu WHERE state=‘0‘;
原文:https://www.cnblogs.com/yufenchi/p/12961422.html