组织管理和存储数据的操作
my.cnf是MySQL的配置文件
mysql -u root -p
mysql -u root -p root
mysql -u root -p root -D db_name
exit
quit
mysql -V
mysql --version
Commands end with ; or \g
表示命令行结果符默认使用;或\g来结束
Type 'help;' or '\h' for help.
表示可以通过help或者\h或者?加上相关关键字来查看手册
Type '\c' to clear the current input statement.
表示使用\c取消当前命令的执行
如执行:show table\c
则会跳转到下一行,即该行忽略
SELECT USER();
SELECT VERSION();
SELECT NOW();
SELECT DATABASE();
CREATE (DATABASE|SCHEMA) db_name;
注意:
检测数据库名称是否存在,不存在再创建:CREATE DATABASE [IF NOT EXISTS] db_name;
在创建数据库的同时指定编码方式:CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARACTER SET [=] 'charset';
其中db_name为数据库名,charset为编码字符集。例子如下:
CREATE DATABASE IF NOT EXISTS test3 DEFAULT CHARACTER SET 'UTF8';
SHOW (DATABASES|SCHEMAS);
SHOW CREATE DATABASE db_name;
ALTER DATABASE db_name [DEFAULT] CHARACTER SET [=] 'charset';
USE db_name;
SELECT DATABASE()|SCHEMA();
DROP DATABASE db_name;
DROP DATABASE [IF EXISTS] db_name;
创建数据表语法规范:
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [完整性约束条件],
字段名称 字段类型 [完整的约束条件],
...
)ENGINE=存储引擎 CHARSET=编码方式;
约束条件
unsigned
无符号,没有负数,从0开始zerofill
零填充,当数据的显示长度不够的时候可以使用前补0的效果填充到指定长度[设置为零填充时,自动带有unsigned约束条件]NOT NULL
非空约束,也就是插入值的时候这个字段必须要给值DEFAULT
默认值,如果插入记录的时候没有给字段赋值,则使用默认值PRIMARY KEY
主键,标识表示记录的唯一性,值不能重复,一个表只能有一个主键。【可以使用PRIMARY KEY(主键1,主键2)
定义复合主键】UNIQUE KEY
唯一性,一个表中可以有多个字段是唯一索引,同样的值不能重复,但NULL值除外AUTO_INCREMENT
自动增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1,可以通过SHOW CREATE TABLE 表名;
的最后一行查看当前增长到的需要。当前增长的序号为所设增长的所有值中最大值+1。 FOREIGN KEY
外键约束SHOW TABLES;
完整查看数据表语句:SHOW [FULL] TABLES [{FROM | IN} db_name][LIKE 'pattern'| WHERE expr]
写SHOW [FULL] TABLES FROM db_name;
进行查询时,可以不打开指定数据库
SHOW CREATE TABLE tbl_name;
DESC tbl_name;
DESCRIBE tbl_name;
SHOW COLUMNS FROM tbl_name;
DROP TABLE [IF EXISTS] tbl_name;
INSERT [INTO] tbl_name (id,username,...) VALUES(1,'KING',...);
SELECT * FROM tbl_name;
添加字段到指定字段周围ALTER TABLE tbl_name ADD 字段名称 字段属性[完整性约束条件][FIRST|AFTER 字段名称];
删除字段ALTER TABLE tbl_name DROP 字段名称;
添加默认值ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值;
删除默认值ALTER TABLE tbl_name ALTER 字段名称 DROP DEFAULT;
修改字段类型、字段属性ALTER TABLE tbl_name MODIFY 字段名称 字段类型[字段属性][FIRST|AFTER 字段名称]
修改字段名称、字段类型、字段属性ALTER TABLE tbl_name CHANGE 原字段名称 新字段名称 字段类型 字段属性 [FIRST|AFTER 字段名称]
添加主键约束ALTER TABLE tbl_name ADD PRIMARY KEY(字段名称);
删除主键约束ALTER TABLE tbl_name DROP PRIMARY KEY;
删除前需要删除自增长的约束
添加唯一ALTER TABLE tbl_name ADD UNIQUE KEY|INDEX index_name (字段名称)
index_name为索引名称,可以通过查询表创建语句查看索引名称,添加时index_name可以省略(默认使用字段名称作为索引名称)
删除唯一ALTER TABLE tbl_name DROP KEY|INDEX index_name;
修改数据表名称`ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
或RENAME TABLE tbl_name TO new_tbl_name;
测试MyISAM存储引擎
CREATE TABLE test_myisam(
a INT UNSIGNED,
b VARCHAR(20),
c CHAR(32)
)ENGINE=MyISAM
默认MyISAM的表会在磁盘中产生3个文件
可以在创建表的时候指定数据文件和索引文件的存储位置,只有MyISAM表支持
DATA DIRECTORY [=] 数据保存的绝对路径
INDEX DIRECTORY [=] 索引文件保存的绝对路劲
MyISAM单表最大支持的数据量:2的64次方条数据
每个表最多可以建立64个索引
如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B
MyISAM引擎的存储格式【使用SHOW TABLE STATUS LIKE '表名'
来查看】
设计遵循ACID模型,支持事务,具有从服务崩溃中恢复的能力,能够最大限度保护用户的数据。
SHOW WARNINGS;
#注释内容
--注释内容
创建慕课网imooc数据库
CREATE DATABASE IF NOT EXISTS imooc DEFAULT CHARACTER SET 'UTF8';
打开imooc
USE imooc;
创建用户表
CREATE TABLE IF NOT EXISTS user(
id INT,
username VARCHAR(20),
password CHAR(32),
email VARCHAR(50),
age TINYINT,
card CHAR(18),
tel CHAR(11),
salary FLOAT(8,2),
married TINYINT(1),
addr VARCHAR(100),
sex ENUM('男','女','保密')
)ENGINE=INNODB CHARSET=UTF8;
查看user表结构
DESC user;
DESCRIBE user;
SHOW COLUMNS FROM user;
删除user表
DROP TABLE [IF EXISTS] user;
查看当前数据库下的数据表
SHOW TABLES;
查看user表的详细信息
SHOW CREATE TABLE user;
向user表插入记录
INSERT user (id,username,password,email,age,card,tel,salary,married,addr,sex) VALUES(1,'king','king','[email protected]',24,'210203199003311777','18041168030',800000.68,0,'Dalian','男');
查询user表中所有记录
SELECT * FROM user;
创建用于测试整型的表
CREATE TABLE test_int(
a tinyint,
b smallint,
c mediumint,
d int,
e bigint
);
创建用于测试无符号的表
CREATE TABLE test_unsigned(
a tinyint,
b tinyint unsigned
);
INSERT test_signed(a,b)VALUES(-12,-12);#报错:ERROR 1264 (22003): Out of range value for column 'b' at row 1
INSERT test_unsigned(a,b)VALUES(0,0);#插入成功:Query OK, 1 row affected (0.00 sec)
INSERT test_unsigned(a,b)VALUES(0,256);#报错:ERROR 1264 (22003): Out of range value for column 'b' at row 1
创建用于测试零填充的表
CREATE TABLE test_int1(
a tinyint ZEROFILL,
b smallint ZEROFILL,
c mediumint ZEROFILL,
d int ZEROFILL,
e bigint ZEROFILL
);
INSERT test_int1 (a,b,c,d,e) VALUES (1,1,1,1,1);
创建用于测试浮点型的表
CREATE TABLE test_float(
a FLOAT(6,2),
b DOUBLE(6,2),
c DECIMAL(6,2)
);
INSERT test_float (a,b,c) VALUES (4.143,4.146,4.149);#报出警告:c是被截断进行四舍五入,FLOAT和DOUBLE直接进行四舍五入不报警高
CREATE TABLE test_float1(
a FLOAT,
b DOUBLE,
c DECIMAL
);
INSERT test_float1 (a,b,c) VALUES (4.143,4.146,4.149);#报出警告:c是被截断进行四舍五入,DECIMAL默认保存整数,FLOAT和DOUBLE正常保存
创建用于测试char和varchar【CHAR效率高于VARCHAR,CHAR,相当于拿空间换时间,VARCHAR拿时间换空间】CHAR默认存储数据的时候,后面会用空格填充到指定长度;而在检索的时候会去掉后面的空格;VARCHAR在检索的时候不进行填充,尾部的空格会留下。
CREATE TABLE test_str(
a CHAR(5),
b VARCHAR(5)
);
INSERT test_str (a,b) VALUE('','');
INSERT test_str (a,b) VALUE('a','a');
INSERT test_str (a,b) VALUE('ab','ab');
INSERT test_str (a,b) VALUE('abc','abc');
INSERT test_str (a,b) VALUE('abcd','abcd');
INSERT test_str (a,b) VALUE('abcde','abcde');
INSERT test_str (a,b) VALUE('abcdef','abcdef');#报错:ERROR 1406 (22001): Data too long for column 'a' at row 1
INSERT test_str (a,b) VALUE(' 123 ',' 123 ');#查询时,CHAR会将后面的空格去掉,VARCHAR不会去掉,结果a为" 123",b为" 123 "
SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;#CANCAT用于拼接字符串
测试TEXT不能有默认值,检索的时候不存在大小写转换
CREATE TABLE test_str1(
content TEXT DEFAULT 'THIS IS A TEXT'
);#报错:ERROR 1101 (42000): BLOB, TEXT, GEOMETRY or JSON column 'content' can't have a default value
测试ENUM,枚举类型在插入的时候会自动过滤到空格
CREATE TABLE test_enum(
sex ENUM('男','女','保密')
);
INSERT test_enum(sex) VALUES('男');
INSERT test_enum(sex) VALUES('男1');#报错
INSERT test_enum(sex) VALUES(NULL);#没有指定非空,则可以插入NULL值
INSERT test_enum(sex) VALUES(1);#则插入的为'男',编号从1开始
测试SET集合
CREATE TABLE test_set(
a SET('A','B','C','D','E','F')
);
INSERT test_set(a) VALUES ('A');
INSERT test_set(a) VALUES ('C');
INSERT test_set(a) VALUES ('C,D,E');
INSERT test_set(a) VALUES ('C,F,A');#插入时会变成A,C,F
INSERT test_set(a) VALUES (2);#插入的是B
TIME类型存储[D HH:MM:SS] D表示天数0~34。若为2 10:10:10
则小时为2*24+10,分钟为10,秒为10
CREATE TABLE test_time(
a TIME
);
INSERT INTO test_time(a) VALUES ('12:23:45');#12:23:45
INSERT INTO test_time(a) VALUES ('2 12:23:45');#60:23:45
INSERT INTO test_time(a) VALUES ('22:22');#22:22:00
INSERT INTO test_time(a) VALUES ('22');#00:00:22
INSERT INTO test_time(a) VALUES ('2 22');#70:00:00
INSERT INTO test_time(a) VALUES ('121212');#12:12:12
INSERT INTO test_time(a) VALUES ('0');#00:00:00
INSERT INTO test_time(a) VALUES ('787878');#报错
INSERT INTO test_time(a) VALUES (NOW());#当前时间
INSERT INTO test_time(a) VALUES (CURRENT_TIME);#当前时间
DATE类型
#YYYY-MM-DD YYYYMMDD
CREATE TABLE test_date(
a DATE
);
INSERT INTO test_date(a) VALUES('2017-03-04');#2017-03-04
INSERT INTO test_date(a) VALUES('2017-3-4');#2017-03-04
INSERT INTO test_date(a) VALUES('4017-03-04');#4017-03-04
INSERT INTO test_date(a) VALUES('20170304');#2017-03-04
INSERT INTO test_date(a) VALUES('2017@03@04');#2017-03-04 任意分隔符都可以分割时间
#YY-MM-DD YYMMDD(插入方式,查询结果都是YY-MM-DD) 70~99之间转换成1970~1999 00~69之间转换成2000~2069
INSERT INTO test_date(a) VALUES('17-03-04');#2017-03-04
INSERT INTO test_date(a) VALUES('88-03-04');#1988-03-04
INSERT INTO test_date(a) VALUES(NOW());#当前日期
INSERT INTO test_date(a) VALUES(CURRENT_DATE);#当前日期
DATETIME类型
CREATE TABLE test_datetime(
a DATETIME
);
INSERT INTO test_datetime(a) VALUES('2017-03-04 13:05:10');#2017-03-04 13:05:10
INSERT INTO test_datetime(a) VALUES('170304130510');#2017-03-04 13:05:10
INSERT INTO test_datetime(a) VALUES(NOW());#当前日期
TIMESTAMP类型,与DATETIME类似,就是时间范围比DATETIME小;且自动带有时区
CREATE TABLE test_timestamp(
a TIMESTAMP
);
INSERT INTO test_timestamp(a) VALUES('2017-03-04 13:05:10');#2017-03-04 13:05:10
INSERT INTO test_timestamp(a) VALUES('170304130510');#2017-03-04 13:05:10
INSERT INTO test_timestamp(a) VALUES(CURRENT_TIMESTAMP);#当前日期时间
INSERT INTO test_timestamp(a) VALUES(NULL);#当前日期时间
INSERT INTO test_timestamp(a) VALUES();#当前日期时间
YEAR类型,用于存储年份(范围1901~~2155)
CREATE TABLE test_year(
a YEAR
);
INSERT INTO test_year(a) VALUES(1901);#1901
INSERT INTO test_year(a) VALUES(1900);#报错
INSERT INTO test_year(a) VALUES(2155);#当前日期时间
INSERT INTO test_year(a) VALUES(2156);#报错
INSERT INTO test_year(a) VALUES(0);#0000
INSERT INTO test_year(a) VALUES('0');#2000
#00~69为2000~2069 70~99表示1970~1969