1 数据类型
1.1 整型
数据类型 | 存储范围 | 字节 |
---|---|---|
TINYINT | 有符号:-2^7到2^7;无符号:0到2^8-1 | 1 |
SMALLINT | 有符号:-2^15到2^15-1;无符号:0到2^8-1 | 2 |
MEDEUMINT | 有符号:-2^23到2^23-1;无符号:0到2^24-1 | 3 |
INT | 有符号:-2^31到2^31-1;无符号:0到2^32-1 | 4 |
BIGINT | 有符号:-2^63到2^63-1;无符号:0到2^64-1 | 8 |
UNSIGNED跟在数据类型后面,表示无符号类型
1.2 浮点型
数据类型 | 存储范围 | 说明 |
---|---|---|
FLOAT[(M,D)] | -3.402823466E+38至-1.175494351E-38、0和1.175494351E~3.402823466E+38 | M是数字总位数,D是小数点后面额位数,若M和D省略根据硬件允许的限制来保存值。单精度大约精确到7位 |
DOUBLE[(M,D)] | -1.7976931348623157E+308至-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308 |
1.3 日期时间型
类型 | 存储需求 | 说明 |
---|---|---|
YEAR | 1 | 1970年~2069年之间的一个日期 |
TIME | 3 | -8385959~8385959 |
DATE | 3 | 1000年1月1日~9999年12月31日 |
DATETIME | 8 | 1000年1月1日0点~9999年12月31日23点59分59秒 |
TIMESTAMP | 4 | 1970年1月1日0点到2037年之间的一个值 |
1.4 字符型
列类型 | 存储需求 |
---|---|
CHAR(M) | M个字节,0<=M<=255,定长类型 |
VARCHAR(M) | L+1个字节其中L<=M且0<=M<=65535,变长类型 |
TINYTEXT | L+1个字节,其中L<2^8,变长类型 |
TEXT | L+2个字节,其中L<2^16,变长类型 |
MEDIUMTEXT | L+3个字节,其中L<2^24,变长类型 |
LONGTEXT | L+4个字节,其中L<2^32,变长类型 |
ENUM(‘value1’,’value2’,……) | 1或2个字节,取决于枚举值的个数(最多65535个个值) |
SET(‘value1’,’value2’,……) | 1、2、3、4或8个字节,取决于set成员的数目(最多64个成员) |
2 操作数据表
数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础,关系型的数据库就是一张二维的表格,行称之为记录,列称之为字段,仅创建了数据库,但是没有创建表,仍然无法存储数据。
2.1 创建数据表
创建数据表之前,必须先打开某个数据库:
USE database_name;
创建数据表
CREATE TABLE [IF NOT EXISTS] table_name( column_name data_type, ………… )
2.2 查看数据表
SHOW TABLES [FROM db_name]
[LIKE 'patter' | WHERE expr]
- [FROM db_name]查看其它数据库中的数据表
查看数据表的结构
SHOW COLUMNS FROM tbl_name;
2.3 记录的插入与查询
插入记录
INSERT [INTO] tbl_name[(col_name,……)] VALUES(val,…)
省略列名,所有的字段都要赋值:
给部分字段赋值:
查看记录
SELECT expr,…… FROM tbl_name;
3 约束
3.1 空值与非空
- NULL,字段值可以为空
- NOT NULL,字段值禁止为空
创建一个数据表
字段username禁止为空,字段age可以为空
3.2 自动编号 AUTO_INCREMENT与主键PRIMARY KEY
需要记录中某个字段的唯一性,可以使用AUTO_INCREMENT关键字
- 自动编号,且必须与主键组合使用
- 默认情况下,起始值为1,每次增量为1
- 该字段类型必须是整型或字符型(小数部分是0)
- 自动编号的字段必须定义为主键,否则提示错误
主键 PRIMARY KEY
- 主键约束
- 每张数据表只能存在一个主键
- 主键保证记录的唯一性
- 主键自动为NOT NULL
- 将自动编号的字段定义为主键
创建的数据表字段属性
创建记录,并查看其自动编号字段记录
备注:主键不一定与自动编号一起使用,但是自动编号必须与主键一起使用
3.3 唯一性约束 UNIQUE KEY
- 唯一约束可保证记录的唯一性
- 唯一约束的字段可以为空值(与PRIMARY KEY区分),但由于其唯一性,所以空值只能出现一个
- 每张表可以有多个唯一约束字段(与PRIMARY KEY区分)
创建表测试
3.4 默认约束 DEFAULT
默认约束是指当插入记录时,如果没有明确为字段赋值,则自动赋予默认值
注意ENUM类型
没有赋值的具有默认值的字段的记录被赋予默认值
3.5 外键约束FOREIGN KEY
- 约束保证数据的完整性和一致性
- 约束分为表级约束(针对两个及以上的字段使用)和列级约束(只针对一个字段使用)
- 约束类型包括:
- NOT NULL(非空约束)
- PRIMARY KEY(主键约束)
- DEFAULT(唯一约束)
- FOREIGN(外键约束)
外键约束是为了保持数据的一致性和完整性,实现一对一或一对多的关系
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表;
- 数据表的存储引擎只能为InnoDB;
- 外键列和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同。
- 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将自动创建索引。
备注:
1. 子表:具有外键列的表;父表:子表所参照的表
2. 存储引擎:MySQL中的数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。InnoDB :5.5版本后MySQL的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
3. 临时表:名称以井号 (#) 开头,临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内,如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。
编辑数据表的默认存储引擎,在MySQL文件夹中找到my.ini配置文件,打开找到配置存储引擎的行,如果不是INNODB,则修改
default-storage-engine=INNODB
修改后必须重启MySQL
创建一个课程数据表和学生数据表,使学生数据表为子表,课程数据表为附表:
创建课程数据表
创建学生数据表
设置外键:FOREIGN KEY (外键列名) REFERENCES 参照表名 (参照列名)
创建索引:
父表和子表中创建了主键,主键会自动创建索引,同时在外键字段上也已经自动创建了索引
查看是否创建了索引://表格形式 SHOW INDEXES FROM lesson; //列表形式 SHOW INDEXES FROM lesson\G;
3.5.1 外键约束的参照操作
在创建外键的时候,还可以写上针对于外键约束的参照操作:
- CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
- SET NULL:从父表删除货更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
- RESTRICT:拒绝对父表的删除或更新操作
- NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
它们实际上指出了在进行外键约束的创建以后,更新父表的时候,子表是否也进行相应的操作。
首先再创建一个students1的数据表,使用CASCADE关键字,设置子表在父表删除记录时要进行的更新操作。
- 在设置外键时使用ON 操作名(如ON DELETE)来指明什么更新操作,之后跟参照操作关键字。
- 在两个数据表中插入记录,注意必须先在父表中插入记录,这样在子表中插入记录时外键列才能参考父表的参照列。
但是在子表的外键列中无法插入参照列中不存在的值:
- 删除父表中的一条记录,同时子表中的相应记录也会被删除:
3.6 表级约束和列级约束
- 对一个数据列建立的约束,称为列级约束
- 对多个数据列建立的约束,称为表级约束
- 列级约束既可以在列定义时声明,也可以在列定义后声明
- 表级约束只能在列定义后声明
- NOT NULL和DEFAULTE不存在标记约束
4 修改数据表
4.1 添加/删除列
添加单列
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
[FIRST|AFTER col_name]指出了插入的列的位置,如果省略则插入到所有列的最后
添加多列
ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,……)
添加多列时不能指定添加的位置,所添加的所有列依次在所有列后面。
删除(多)列
ALTER TABLE tbl_name DROP [COLUMN] col_name,……
也可以删除一(多)列同时添加一(多)列,操作之间用逗号隔开。
4.2 添加/删除约束
添加主键约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name,……)
CONSTRAINT用于给约束起名字。
删除主键约束
ALTER TABLE tbl_name DROP PRIMARY KEY
任何数据表最多只有一个主键约束
添加唯一性约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type](index_col_name,……)
与主键约束不同的是,可以添加多个唯一性约束
删除唯一约束
ALTER TABLE tbl_name DROP {INDEX|KEY} index_name
删除唯一约束用索引的原因在于 unique字段会被默认创建为索引,一张表可以有多个唯一约束,每个唯一约束字段都有索引功能。只有指定了索引的名字(也是字段名),才能确定是删除哪个字段的唯一约束。删除索引的同时也删除了唯一性约束,所以唯一性约束和索引是一一对应的。添加外键约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,……) reference_definition
删除外键约束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
添加/删除默认约束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
4.3 修改列定义和更名数据表
修改列定义是指修改字段的数据类型或位置
ALTER TABLE tbl_name MODIY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
注意如果不需要修改数据类型,也要原样输入在对应位置
修改数据类型的时候,注意可能造成数据的丢失修改列名称
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
可以看到该命令也可以修改列定义
修改数据表名称
方法一:
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
方法二:
RENAME TABLE tbl_name TO new_tbl_name[,tbl_name2 TO new_tbl_name2,……]
注意,应尽量少使用数据列和数据表的更名,当我们以后创建了索引,或者使用过视图或存储过程的话,表名或列名曾经被引用的情况下,将它们进行修改可能会导致视图或存储过程无法正常的工作
5 小结
- 数据类型:整型、浮点型、字符型、日期时间型
- 操作数据表
- 创建数据表
- 查看数据表:查看数据表的字段,查看数据表的创建,查看数据表的索引等
- 插入记录
- 查询记录
- 约束
- 按功能划分:NOT NULL , PRIMARY KEY , UNIQUE KEY , DEFAULT , FOREIGN KEY
- 按数据列的数目划分为:表级约束 , 列级约束
- 修改数据表
- 针对字段的操作:添加/删除字段,修改列定义,修改列名称等
- 针对约束的操作:添加/删除各种约束
- 针对数据表的操作:数据表更名(两种方法)