目录
1、字段属性
1.1 zerofill 填充0
影响数字的显示方式:如果一个数字的宽度小于所允许的最大宽度,这个值前面会用0填充。如果声明了zerofill,该列会自动设为unsigned。
1.2 primary key 主键
具有主键约束的列不允许有null值,并且不允许有重复值。Primary key = not null + unique
主键:用来唯一的标示表中的每一行,其类型一般为整型或者字符串。
每个表最多只允许一个主键。主键名总是PRIMARY。
建立主键的好处:
方便查找,在查询数据的时候,先查询索引,然后根据索引去查询数据,速度会非常快
索引的作用:就是在查询数据的时候可以提速,没有索引就是全表扫描。
root@hunan 14:32 mysql>create table width(id int(4) zerofill primary key,name varchar(10));
Query OK, 0 rows affected (0.01 sec)
root@hunan 14:38 mysql>desc width;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id | int(4) unsigned zerofill | NO | PRI | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.11 sec)
root@hunan 14:38 mysql>insert into width(id,name) values(1,'cali'),(2,'xiaoxiao');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
root@hunan 14:39 mysql>select * from width;
+------+----------+
| id | name |
+------+----------+
| 0001 | cali |
| 0002 | xiaoxiao |
+------+----------+
2 rows in set (0.00 sec)
root@hunan 14:39 mysql>insert into width(id,name) values(1,'cali'),(2,'xiaoxiao');
ERROR 1062 (23000): Duplicate entry '0001' for key 'PRIMARY'
root@hunan 14:40 mysql>insert into width(id,name) values(3,'cali'),(4,'xiaoxiao');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
root@hunan 14:41 mysql>select * from width;
+------+----------+
| id | name |
+------+----------+
| 0001 | cali |
| 0002 | xiaoxiao |
| 0003 | cali |
| 0004 | xiaoxiao |
+------+----------+
一个表内可以建立两个主键:
root@hunan 16:31 mysql>create table user(id int,name varchar(10),primary key(id,name));
Query OK, 0 rows affected (0.08 sec)
root@hunan 16:32 mysql>insert into user(id,name) value(1,'xixi'),(2,'xixi');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
1.3 auto_increment
在上一个基础上自增,默认的起始值是1,步长(偏移量)是1,适合整数类型的不是适合字符串类型。
只适应于整数类型。一个表中只有一个列可以是自动增长的。
root@hunan 14:50 mysql>insert into t1 values(5,'xiaoxiao'),(9,'jiaojiao');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
root@hunan 14:52 mysql>select * from t1;
+----+----------+
| id | name |
+----+----------+
| 1 | xiaoxiao |
| 2 | jiaojiao |
| 5 | xiaoxiao |
| 9 | jiaojiao |
+----+----------+
4 rows in set (0.00 sec)
root@hunan 14:52 mysql>insert into t1(name) values('xixi');
Query OK, 1 row affected (0.00 sec)
root@hunan 14:53 mysql>select * from t1;
+----+----------+
| id | name |
+----+----------+
| 1 | xiaoxiao |
| 2 | jiaojiao |
| 5 | xiaoxiao |
| 9 | jiaojiao |
| 10 | xixi |
+----+----------+
5 rows in set (0.00 sec)
1.4 not null
不能为空,定义了not null的字段在插入数据的时候不能为空。
1.5 foreign key 外键
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键,一张表中可以定义多个外键。外键列默认可以给null值。
按照定义,外键必须引用一个主键或者唯一键。引用的主键一般在另外一张表中,也可以是本表的主键。后一种情况通常称为“自引用”。
父子表的概念:外键所在的表叫做子表,外键所引用的主键所在的表叫做父表。注意,父子表是相对而言的,表a可以是表b的子表,但同时也可以是表c的父表。
举个例子,A表的主键到B表里面做一个字段,这个字段就是外键,并且B表里面会引用A表里面的数据,并且B表受限与A表。A是主表,B为子表。
外键的好处: 直接引用别的表里的字段,自己的表里就不需要再创建相同的数据了,可以避免数据的冗余。
外键的缺点:产生临时表并进行关联,消耗大量的内存和CPU。
root@san 11:58 sc-mysql>select id,name,dname from emp join dept using(deptid);
+----+--------+-----------+
| id | name | dname |
+----+--------+-----------+
| 1 | 张三 | 市场部 |
| 2 | 李四 | 市场部 |
+----+--------+-----------+
2 rows in set (0.00 sec)
root@san 12:00 sc-mysql>select id,name,emp.deptid,dname from emp, dept where emp.deptid=dept.deptid;
+----+--------+--------+-----------+
| id | name | deptid | dname |
+----+--------+--------+-----------+
| 1 | 张三 | 10 | 市场部 |
| 2 | 李四 | 10 | 市场部 |
+----+--------+--------+-----------+
2 rows in set (0.00 sec)
1.6 comment
用来给列添加注释。最多255个字符。注释会保存到数据字典中。
root@hunan 15:55 mysql>create table xixi(id int primary key comment '编号',name varchar(20) comment '姓名');
Query OK, 0 rows affected (0.04 sec)
root@hunan 15:57 mysql>show create table xixi \G'
*************************** 1. row ***************************
Table: xixi
Create Table: CREATE TABLE `xixi` (
`id` int(11) NOT NULL COMMENT '编号',
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1.7 default 默认值
设定了值就用设定了的值,没有设定,就用默认的值。
root@hunan 15:53 mysql>create table grade(id int primary key,grade int default 60);
Query OK, 0 rows affected (0.04 sec)
root@hunan 15:53 mysql>desc grade;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| grade | int(11) | YES | | 60 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
root@hunan 15:53 mysql>insert into grade(id,grade) values(1,90);
Query OK, 1 row affected (0.00 sec)
root@hunan 15:54 mysql>insert into grade(id) values(2);
Query OK, 1 row affected (0.00 sec)
root@hunan 15:54 mysql>select * from grade;
+----+-------+
| id | grade |
+----+-------+
| 1 | 90 |
| 2 | 60 |
+----+-------+
2 rows in set (0.00 sec)
1.8 unique
唯一性,允许为null,null可以出现很多次,空值只能出现一次,字符串为空'',单引号或者双引号里没有任何内容。
null值空值的区别:
真空和空气的区别,null值是真的是什么都没有。
root@hunan 16:05 mysql>create table yuan(id int primary key,name varchar(10) unique);
Query OK, 0 rows affected (1.04 sec)
root@hunan 16:24 mysql>desc yuan;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(10) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
root@hunan 16:24 mysql>insert into yuan(id, name) values(1,'yuan');
Query OK, 1 row affected (0.01 sec)
root@hunan 16:24 mysql>insert into yuan(id, name) values(2,'yuan');
ERROR 1062 (23000): Duplicate entry 'yuan' for key 'name'
root@hunan 16:24 mysql>insert into yuan(id, name) values(2,'yuan2');
Query OK, 1 row affected (0.00 sec)
root@hunan 16:25 mysql>select * from yuan;
+----+-------+
| id | name |
+----+-------+
| 1 | yuan |
| 2 | yuan2 |
+----+-------+
2 rows in set (0.00 sec)
root@hunan 16:25 mysql>insert into yuan(id, name) values(3,null);
Query OK, 1 row affected (0.04 sec)
root@hunan 16:25 mysql>insert into yuan(id, name) values(4,null);
Query OK, 1 row affected (0.00 sec)
root@hunan 16:25 mysql>insert into yuan(id, name) values(5,null);
Query OK, 1 row affected (0.00 sec)
root@hunan 16:25 mysql>select * from yuan;
+----+-------+
| id | name |
+----+-------+
| 3 | NULL |
| 4 | NULL |
| 5 | NULL |
| 1 | yuan |
| 2 | yuan2 |
+----+-------+
5 rows in set (0.00 sec)
root@hunan 16:26 mysql>insert into yuan(id, name) values(6,'');
Query OK, 1 row affected (0.29 sec)
root@hunan 16:26 mysql>insert into yuan(id, name) values(7,'');
ERROR 1062 (23000): Duplicate entry '' for key 'name'
2、engine 存储引擎
指定表使用的存储引擎。存储引擎决定了数据如何存储以及如何访问,还有事务如何处理。MySQL允许对每个表使用不同的存储引擎。如果在create table语句中没有指定存储引擎,则使用默认的存储引擎。
几种存储引擎:
1、innodb
默认的存储引擎
2、myisam
3、csv
csv文件:是一个文本我文件,里面的字段以逗号‘,’进行分割,可以用来做数据存储的文件,数据分析,日志文件--》数据清洗--》csv文件--》数据库
4、memory
放在内存中的,适合临时存储的。
在MySQL内可以使用来查看engines。
show engines;
innodb有什么特性:
innodb存储引擎支持事物、行锁、外键。
3、字符集
字符集 character set,各种各样的字符集合。
可以使用 show character set; 来查询你的mysql支持哪些字符集。
SHOW variables like '%CHARACTER%'; 来查看你正在使用哪些字符集
root@(none) 09:17 mysql>show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
+----------+---------------------------------+---------------------+--------+
继承问题:
比如说mysql-server使用的是utf-8,那么在mysql-server里面建立的数据库和表,都会使用utf-8。
为什么英文占一个字节,中文占3字节:
英文字母+数字+标点符号 < 256,2^8 = 256,占8位刚好一字节,8位一字节。中文同理。