MySQL登录
-V, --version # 查看版本信息
-u #用户名
-p #密码
-h #服务器地址
-P #端口号
--prompt '>>>' #修改提示符为>>>
mysql -uroot -p -h127.0.0.1 -P3306 #h,P均为默认设定,可以不写
exit/quit/\q #退出
prompt >>> #修改提示符为>>>
#特殊提示符有:\D,完整日期;\d,当前数据库;\h,服务器名称;\u,当前用户
SELECT VERSION(); #版本信息
SELECT NOW(); #当前时间 --> 2017-11-12 15:43:10
SELECT USER(); #当前用户 --> root@localhost
其他操作
show error/warnings; #查看错误信息
操作数据库
show databses; # 显示所有数据库
create database if t2 character set=utf8/gbk; # 创建数据库
show create database test; #查看创建数据库的信息,如查看编码方式为gbk/utf8
alter database test character set utf8; #修改数据库t3编码方式为utf8
drop database test; 删除数据库
select database(); # 显示当前数据库
use test; # 选择数据库
数据类型
整数
数据类型 | 字节 |
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT | 4 |
BIGINT | 8 |
字节与储存范围的换算:1个字节,8位,有符号位−27−27−1,无符号位0−28−1
浮点型
FLOAT[(M,D)],储存范围:-3.40E38-1.76E-38,0,1.76E-38到3.40E38
M总位数,D小数点后位数,精度最大7为小数.
DOUBLE[(M,D)],储存范围大约是FLOAT的10倍.
字符型
CHAR,0-255,定长(补足位会用0补齐);VARCHAR,0-65535,变长.
TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT.
ENUM(‘var1’, ‘var2’,…),SET(‘var1’, ‘var2’),SET不用与ENUM,可以选多个,即取子集.
表操作
CREATE TABLE tb1(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, # AUTO_INCREMENT必须和PRIMARY KEY主键一起使用
username VARCHAR(20) NOT NULL UNIQUE KEY, # NOT NULL非空,UNIQUE KEY唯一约束
sex ENUM('0', '1', '2') DEFAULT '2', # DEFUALT默认‘2’
salary FLOAT(8,2) UNSIGNED
);
SHOW CREATE TABLES tb_name # 查看创建表的命令
desc tb_name #等价于SHOW COLUMNS FROM tb_name,查看表结构
SELECT * FROM tb1; # 查看tb1中所有记录.*表示选中所有字段.
# 添加单列
ALTER TABLE tb_name ADD col_name col_definition [FIRST|AFTER col_name]
# 添加多列,不能指定插入位置,只能在最后添加
ALTER TABLE tb_name ADD (col_name column_definition,...)
# 删除列
ALTER TABLE tb_name DROP col_name;
# 多操作
ALTER TABLE tb_name DROP col_name ,ADD col_name col_definition,...
# 修改列定义
alter table tb_name change old_col_name new_col_name col_definition;
alter table tb1 change id ID tinyint unsigned first;
# 数据表更名
alter table tb_name rename new_tb_name
rename table tb_name to new_tb_name [, tb_name to new_to_name,...] # 为多张数据据表更名
NOT NULL:非空
AUTO_INCREMENT:必须与主键组合使用,默认起始值1,每次增量1
PRIMARY KEY:每张表只有一个主键,字段唯一,自动设置为NOT NULL
UNIQUE KEY:每张表可以有多个, 字段唯一,可以为NULL
DEFAULT:默认值
约束
列级约束和表级约束(针对2个以上字段)
NOT NULL/PRIMARY KEY/UNIQUE KEY/DEFAULT/FOREIGN KEY
外键约束
- 父表和子表相同的储存引擎InnoDB,禁止使用临时表.
- 外键列和参照列,数字必须相同(类型,长度,有无符号),字符类型长度可以不同.
- 外键列和参照列必须创建索引,外键列不存在索引,MySQL自动创建.
- FOREIGN KEY物理外键约束,CASECADE为父表中删除和更新记录,子表中同样删除更新.
CREATE TABLE provinces( # 父表
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, # 参照列,有索引
pname VARCHAR(20) NOT NULL);
CREATE TABLE users( # 子表
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
pid SMALLINT UNSIGNED, # 外键列,数据类型必须相似;没有索引但会自动创建
FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE; # 设置外键约束
);
SHOW CREATE TABLE provinces; # 可查看表的储存引擎
SHOW INDEXES FROM provinces\G; # 查看索引
# 添加主键约束
ALTER TABLE tb_name ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
# 添加唯一约束
ALTER TABLE tb_name ADD UNIQUE [INDEX|KEY] (index_col_name,...)
alter table tb5 add unique (username);
# 添加外键约束
ALTER TABLE tb_name ADD FOREIGN KEY (index_col_name)reference_deinitin
# 添加/删除默认约束
ALTER TABLE tb_name ALTER col_name {SET DEFAULT iteral|DROP DEFAULT}
# 删除主键约束
alter table tb_name drop primary key
# 删除唯一约束/索引
alter table tb_name drop {index|key} index_name
# 删除外键约束
# alter table tb_name drop foreign key fk_symbol
show create table tb5; # 查看fk_symbol
alter table tb5 drop foreign key tb5_ibfk_1; # 删除外键约束
alter table tb5 drop index pid; # 索引还在,可以删除
记录操作
# 插入记录
insert tb1 values('Bing', 25, 3783.4); #不指定列,所有列都要插入
insert tb1 (username, salary) values('Wo', 4502.44); #插入指定列,部分插入
# 列可以为null或设置默认值的,insert时可以省略列. 如以上tb1有id字段(设为auto_increment),可以省略列
insert users values(default, 'Wu', '123', 2*10+1, 0); # 也可以是表达式
# 一次插入多条,比多次插入一条好快.
insert tb values('Bing', 25, 23.4), ('Wu', 34, 234.3); # 逗号(,)分隔,同时插入多条记录
# 插入索引出的数据
insert tb1(id, username) select ID, uname from tb2;
# insert很耗时,会降低等待处理select性能,low_priority可以跟在insert/update/delete之后,降低其性能,提高select性能.
insert low_priority tb values('Bing', 25, 232.4);
# 更新,在更新多行时,如果某行发生错误,则整个update操作被取消.
update users set age=age+1, sex=1 where id>=4; #逗号(,)分隔,更新多个字段,where添加条件
# 删除
delete from users where id=8; # 若不加where,则删除全部记录
truncate table tb4; # 清空表,速度快于delete from tb4;