数据库操作(一)
1.库操作
数据库命名规则:
- 由字母、数字和下划线组成;
- 大小写区分;
- 唯一性;
- 不能使用关键字;
- 最长128位;
- 不能单独使用数字.
库相关操作
查看数据库: show databases; show create database db1; select database(); #查看当前所在的库 选择数据库: use db1 增: create database db1 charset utf8; 改: alter database db1 charset gbk; 删: drop database db1;
2.表操作
表相关操作
先切换到文件夹下: use db1 增: create table t1(id int,name char(10)); create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件]); 查: show tables; #查看所有表 desc t1; #查看表结构 show create table t1; #查看表详细结构 改: alter table t1 modify name char(3); alter table t1 change name name1; 删: drop table t1; 注意: 1.在同一张表中,字段名不能相同 2.宽度和约束类型可选 3.字段名和类型时必须的
3.MySQL基础数据类型
MySQL常用数据类型概览
1.数字 整型: tinyint int bigint 小数: float:在位数比较短的情况下不精准 double:在位数比较长的情况下不精准 decimal:如果用小数,则推荐使用decimal 精准,内部原理是以字符串形式存储 字符串: char:定长存储,存取速度快,浪费空间 vachar:变长存储,精准,存取速度慢,节省空间 #sql优化:创建表时,定长类型往前放(比如性别)变长类型往后放(比如地址或描述信息),>255个字符就把文件路径存放到数据库中 时间类型: date datetime 枚举和集合类型: emu set
数据类型详解
1.整数类型和浮点型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
MySQL支持的整数类型有TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
对于小数的表示,MYSQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在mysql中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
整数类型作用:存储年龄、等级、id、各种号码等
浮点型作用:存储薪资、身高、温度、体重、体质参数等
类型 | 大小 | 范围(有符号) | 范围(无符号)unsigned约束 | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节float(255,30) | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节double(255,30) | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2double(65,30) | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
整数类型分类: tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号: -128 ~ 127 无符号: 0 ~ 255 PS: MySQL中无布尔值,使用tinyint(1)构造。 int[(m)][unsigned][zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有符号: -2147483648 ~ 2147483647 无符号: 0 ~ 4294967295 bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有符号: -9223372036854775808 ~ 9223372036854775807 无符号: 0 ~ 18446744073709551615
整数类型范围验证: 有符号和无符号tinyint 1.tinyint默认为有符号 mysql> create table t1(x tinyint); #默认为有符号,即数字前有正负号 mysql> desc t1; mysql> insert into t1 values -> (-129), -> (-128), -> (127), -> (128); mysql> select * from t1; +------+ | x | +------+ | -128 | #-129存成了-128 | -128 | #有符号,最小值为-128 | 127 | #有符号,最大值127 | 127 | #128存成了127 +------+ 2.设置无符号tinyint mysql> create table t2(x tinyint unsigned); mysql> insert into t2 values -> (-1), -> (0), -> (255), -> (256); mysql> select * from t2; +------+ | x | +------+ | 0 | -1存成了0 | 0 | #无符号,最小值为0 | 255 | #无符号,最大值为255 | 255 | #256存成了255 +------+ 有符号和无符号int 1.int默认为有符号 mysql> create table t3(x int); #默认为有符号整数 mysql> insert into t3 values -> (-2147483649), -> (-2147483648), -> (2147483647), -> (2147483648); mysql> select * from t3; +-------------+ | x | +-------------+ | -2147483648 | #-2147483649存成了-2147483648 | -2147483648 | #有符号,最小值为-2147483648 | 2147483647 | #有符号,最大值为2147483647 | 2147483647 | #2147483648存成了2147483647 +-------------+ 2.设置无符号int mysql> create table t4(x int unsigned); mysql> insert into t4 values -> (-1), -> (0), -> (4294967295), -> (4294967296); mysql> select * from t4; +------------+ | x | +------------+ | 0 | #-1存成了0 | 0 | #无符号,最小值为0 | 4294967295 | #无符号,最大值为4294967295 | 4294967295 | #4294967296存成了4294967295 +------------+ 有符号和无符号bigint 1.有符号bigint mysql> create table t5(x bigint); mysql> insert into t5 values -> (-9223372036854775809), -> (-9223372036854775808), -> (9223372036854775807), -> (9223372036854775808); mysql> select * from t5; +----------------------+ | x | +----------------------+ | -9223372036854775808 | | -9223372036854775808 | | 9223372036854775807 | | 9223372036854775807 | +----------------------+ 2.无符号bigint mysql> create table t6(x bigint unsigned); mysql> insert into t6 values -> (-1), -> (0), -> (18446744073709551615), -> (18446744073709551616); mysql> select * from t6; +----------------------+ | x | +----------------------+ | 0 | | 0 | | 18446744073709551615 | | 18446744073709551615 | +----------------------+ 用zerofill测试整数类型的显示宽度 mysql> create table t7(x int(3) zerofill); mysql> insert into t7 values -> (1), -> (11), -> (111), -> (1111); mysql> select * from t7; +------+ | x | +------+ | 001 | | 011 | | 111 | | 1111 | #超过宽度限制仍然可以存 +------+ #设置了数据类型,会有约束效果,只能表示本类型范围内的数
浮点型分类: 1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 定义: 单精度浮点数(非准确小数值),m是整数部分+小数部分的总个数,d是小数点后个数。m最大值为255,d最大值为30,例如:float(255,30) 有符号: -3.402823466E+38 to -1.175494351E-38, 无符号: 1.175494351E-38 to 3.402823466E+38 精确度: **** 随着小数的增多,精度变得不准确 **** 2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 定义: 双精度浮点数(非准确小数值),m是整数部分+小数部分的总个数,d是小数点后个数。m最大值也为255,d最大值也为30 有符号: -1.7976931348623157E+308 to -2.2250738585072014E-308 无符号: 2.2250738585072014E-308 to 1.7976931348623157E+308 精确度: ****随着小数的增多,精度比float要高,但也会变得不准确 **** 3.decimal[(m[,d])] [unsigned] [zerofill] 定义: 准确的小数值,m是整数部分+小数部分的总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。比float和double的整数个数少,但是小数位数都是30位 精确度: **** 随着小数的增多,精度始终准确 **** 对于精确数值计算时需要用此类型 decimal能够存储精确值的原因在于其内部按照字符串存储。 精度从高到低:decimal、double、float decimal精度高,但是整数位数少 float和double精度低,但是整数位数多 float已经满足绝大多数的场景了,但是什么导弹、航线等要求精度非常高,所以还是需要按照业务场景自行选择,如果又要精度高又要整数位数多,那么你可以直接用字符串来存。
浮点型测试: mysql> create table t8(x float(256,31)); ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30. mysql> create table t8(x float(256,30)); ERROR 1439 (42000): Display width out of range for column 'x' (max = 255) mysql> create table t8(x float(255,30)); #建表成功 Query OK, 0 rows affected (0.02 sec) mysql> create table t9(x double(255,30)); #建表成功 Query OK, 0 rows affected (0.02 sec) mysql> create table t10(x decimal(66,31)); ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30. mysql> create table t10(x decimal(66,30)); ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65. mysql> create table t10(x decimal(65,30)); #建表成功 Query OK, 0 rows affected (0.02 sec) mysql> show tables; +---------------+ | Tables_in_db1 | +---------------+ | t8 | | t9 | | t10 | +---------------+ rows in set (0.00 sec) mysql> insert into t8 values(1.1111111111111111111111111111111); #小数点后31个1 Query OK, 1 row affected (0.01 sec) mysql> insert into t9 values(1.1111111111111111111111111111111); Query OK, 1 row affected (0.00 sec) mysql> insert into t10 values(1.1111111111111111111111111111111); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t8; #随着小数的增多,精度开始不准确 +----------------------------------+ | x | +----------------------------------+ | 1.111111164093017600000000000000 | +----------------------------------+ row in set (0.00 sec) mysql> select * from t9; #精度比float要准确点,但随着小数的增多,同样变得不准确 +----------------------------------+ | x | +----------------------------------+ | 1.111111111111111200000000000000 | +----------------------------------+ row in set (0.00 sec) mysql> select * from t10; #精度始终准确,d为30,于是只留了30位小数 +----------------------------------+ | x | +----------------------------------+ | 1.111111111111111111111111111111 | +----------------------------------+ row in set (0.00 sec)
2.位类型
BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
bin()显示为二进制
hex()显示为十六进制
位类型测试: mysql> create table t0(id bit); mysql> desc t0; #bit默认宽度为1 +-------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+-------+ | id | bit(1) | YES | | NULL | | +-------+--------+------+-----+---------+-------+ mysql> insert into t0 values(8); mysql> select * from t0; #直接查看是无法显示二进制位的 +------+ | id | +------+ | | +------+ mysql> select bin(id),hex(id) from t0; #需要转换才能看到 +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | +---------+---------+ mysql> alter table t0 modify id bit(5); mysql> insert into t0 values(8); mysql> select bin(id),hex(id) from t0; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | | 1000 | 8 | +---------+---------+ 位类型测试
3.字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
char/vachar类型介绍 #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定长,简单粗暴,浪费空间,存取速度快 字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节) 存储: 存储char类型的值时,会往右填充空格来满足长度 例如:指定长度为10,存>10个字符则报错(严格模式下),存<10个字符则用空格填充直到凑够10个字符存储 检索: 在检索或者说查询时,查出的结果会自动删除尾部的空格,如果你想看到它补全空格之后的内容,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';) #varchar类型:变长,精准,节省空间,存取速度慢 字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存储: varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用) 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535) 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
char/varchar测试: mysql> create table t10 (v varchar(4),c char(4)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t10 values ('ab ','ab '); Query OK, 1 row affected (0.00 sec) # 在检索的时候char数据类型会去掉空格 mysql> select * from t10; +------+------+ | v | c | +------+------+ | ab | ab | +------+------+ row in set (0.00 sec) # 来看看对查询结果计算的长度 mysql> select length(v),length(c) from t10; +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 2 | +-----------+-----------+ row in set (0.00 sec) # 给结果拼上一个加号会更清楚 mysql> select concat(v,'+'),concat(c,'+') from t10; +---------------+---------------+ | concat(v,'+') | concat(c,'+') | +---------------+---------------+ | ab + | ab+ | +---------------+---------------+ row in set (0.00 sec) # 当存储的长度超出定义的长度,会截断 mysql> insert into t10 values ('abcd ','abcd '); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t10; +------+------+ | v | c | +------+------+ | ab | ab | | abcd | abcd | +------+------+ rows in set (0.00 sec)
4.日期类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 年月日 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时分秒 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 年月日时分秒 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
日期类型介绍: YEAR YYYY(范围:1901/2155)例:2018 DATE YYYY-MM-DD(范围:1000-01-01/9999-12-31)例:2018-01-01 TIME HH:MM:SS(范围:'-838:59:59'/'838:59:59')例:12:09:32 DATETIME YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59 )例: 2018-01-01 12:09:32 TIMESTAMP YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037 年某时)
日期类型示例: year: mysql> create table t11(born_year year); #无论year指定何种宽度,最后都默认是year(4) mysql> insert into t11 values -> (1900), -> (1901), -> (2155), -> (2156); mysql> select * from t11; +-----------+ | born_year | +-----------+ | 0000 | | 1901 | | 2155 | | 0000 | +-----------+ date,time,datetime: mysql> create table t12(d date,t time,dt datetime); mysql> desc t12; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | d | date | YES | | NULL | | | t | time | YES | | NULL | | | dt | datetime | YES | | NULL | | +-------+----------+------+-----+---------+-------+ mysql> insert into t12 values(now(),now(),now()); mysql> select * from t12; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2019-08-30 | 16:26:54 | 2019-08-30 16:26:54 | +------------+----------+---------------------+ timestamp: mysql> create table t13(time timestamp); mysql> insert into t13 values(); mysql> insert into t13 values(null); mysql> select * from t13; +---------------------+ | time | +---------------------+ | 2019-08-30 16:29:17 | | 2019-08-30 16:30:01 | +---------------------+ #1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入 #2. 插入年份时,尽量使用4位值 #3. 插入两位年份时,<=69,以20开头,比如50,结果2050 # >=70,以19开头,比如71,结果1971
5.枚举类型和集合类型
ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集合中选取单个值,而不能一次取多个值。
SET和ENUM非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。
类型 | 大小 | 用途 |
---|---|---|
ENUM | 对1-255个成员的枚举需要1个字节存储;对于255-65535个成员,需要2个字节存储;最多允许65535个成员。 | 单选:选择性别 |
SET | 1-8个成员的集合,占1个字节9-16个成员的集合,占2个字节17-24个成员的集合,占3个字节25-32个成员的集合,占4个字节33-64个成员的集合,占8个字节 | 多选:兴趣爱好 |
enum和set类型示例: mysql> create table consumer( -> name varchar(50), -> sex enum('male','female'), -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一 -> hobby set('play','music','read','study') #在指定范围内,多选多 -> ); mysql> insert into consumer values -> ('xiaogui','male','vip5','read,study'), -> ('taibai','female','vip1','girl'); mysql> select * from consumer; +------+--------+-------+------------+ | name | sex | level | hobby | +------+--------+-------+------------+ | xiaogui | male | vip5 | read,study | | taibai | female | vip1 | | +------+--------+-------+------------+
4.SQL模式简单操作
使用MySQL必须修改为严格模式,即STRICT_TRANS_TABLES 查看当前会话的sql模式: mysql>select @@sql_mode; 查看全局的sql模式: mysql>select @@global.sql_mode; 永久修改sql模式: 在mysql的安装目录下找到my.ini或my.cnf文件,使用pycharm或notepad++打开此文件 在[mysqld]下添加 sql_mode=STRICT_TRANS_TABLES 然后重启mysql即可
5.完整性约束
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致
约束条件分类: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充
完整性约束详细说明: 非空约束 not null: mysql>create table t1(id int not null); 默认值 default: mysql>create table t1(id int not null, sex char(5) not null default 'male'); 唯一约束 unique: mysql>create table t1(id int unique, username char(18) unique); 主键 primary key: 一张表只能有一个主键 主键的约束作用 = 非空 + 唯一 非空+唯一 not null unique: 如果一张表中没有设置primary key主键,那么第一个设置非空+唯一的字段会被设置为主键 mysql>create table t1(id int primary key, username char(10) not null unique age tinyint unsigned ); 自增 auto_increment: 1.只能操作数字 2.自带非空属性 3.只能对unique字段进行设置 4.不受删除影响 mysql>create table t1(id int unique auto_increment, name char(12) not null ); 外键约束 foreign key: 建立表关系使用的约束条件,对应外表中的字段至少是unique的,推荐使用主键作为关联字段 mysql>create table class3( id int primary , cname char(12) not null unique, start_date date, period char(12), course char(12), teacher char(12) ); mysql>create table student3( id int primary key auto_increment, name char(12) not null, gender enum('male','female'), cid int, foreign key(cid) references class3(id) on delete cascade on update cascade ); 表关系: 多对一 (一对多): 在多的表里面添加一个字段,并给这个字段加foreign key,比如: 出版社对应书籍是多对一的关系 1.先创建出版社表 publish表 2.创建书籍表,外键写法: create table book( id int primary key, name char(10), pid int, foreign key(pid) references publish(id) ); 3.先给出版社插入数据 一对一关系 学生表(student)和客户表(customer) create table student( id int primary key, name char(10), cid int unique, foreign key(cid) references customer(id) ); 多对多关系 作者表和书籍表 需要借助第三张表来完整两者的关系记录 第三张表最后创建 create table authortobook( id int primary key, author_id int, book_id int, foreign key(author_id) references author1(id), foreign key(book_id) references book1(id) );
外键约束三种模式
外键约束有三种约束模式(都是针对父表的约束): 模式一: district 严格约束(默认的 ),父表不能删除或者更新已经被子表数据引用的记录 模式二:cascade 级联模式:父表的操作,对应的子表关联的数据也跟着操作 。 模式三:set null:置空模式,父表操作之后,子表对应的数据(外键字段)也跟着被置空。 通常的一个合理的约束模式是:删除的时候子表置空;更新的时候子表级联。 指定模式的语法:foreign key(外键字段)references 父表(主键字段)on delete 模式 on update 模式; 注意:删除置空的前提条件是 外键字段允许为空,不然外键会创建失败。 外键虽然很强大,能够进行各种约束,但是外键的约束降低了数据的可控性和可拓展性。通常在实际开发时,很少使用外键来约束。