列的属性

*简单的查询和插入语句

看某个表中已经存储了哪些数据:select * from 表名;

在MySQL中插入数据的时候是以行为单位,一行数据也成为一条记录

插入语句格式:insert into 表名(列1,列2....) values(列1的值,列2的值....);

mysql> insert into first_table(first_column,second_column) values(1,'aaa');
Query OK, 1 row affected (0.01 sec)

mysql> select * from first_table;
+--------------+---------------+
| first_column | second_column |
+--------------+---------------+
| 1            | aaa           |
+--------------+---------------+
1 row in set (0.00 sec)

我们也可以只指定部分的列,没有显式指定的列的值就被设置成NULL(NULL的意思就是此列的值尚不确定)

mysql> insert into first_table(first_column) values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from first_table;
+--------------+---------------+
| first_column | second_column |
+--------------+---------------+
| 1            | aaa           |
| 2            | NULL          |
+--------------+---------------+
2 rows in set (0.00 sec)
 

批量插入

语法:insert into 表名(列1,列2,.....) values(列1的值,列2的值....),(列1的值,列2的值....),.....;

列的属性

再上一章创建表结构的时候我们就提到过这个概念,列的属性,在first_table中没有定义,所以哦我们这里会重新创建first_table,并给该表的各个列添加各种属性,因此这里需要先把first_table删掉。

默认值属性:在像列中插入数据的时候说到 只指定部分的列进行插入数据的话,其余没有被显式指定的列的值就会被默认设置成NULL。如果我们不想让他们被设置成默认值NULL的话。可以在定义列的时候给该列增加一个default属性。  列名 列的类型 default 默认值

mysql> create table first_table(
    -> first_column INT,
    -> second_column VARCHAR(100) default 'abc'
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into first_table(first_column) values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from first_table;
+--------------+---------------+
| first_column | second_column |
+--------------+---------------+
|            1 | abc           |
+--------------+---------------+
1 row in set (0.00 sec)

NOT NULL属性:如果我们想让表中某些列必须有值,不能存放NULL,此时可以给列添加NOT NULL属性。意思就是表中这一列在插入数据的时候必须有值,没有值就报错。

语法:列名 列的属性 NOT NULL;

主键属性:有时在表中可以通过某些列的组合来确定一条唯一的记录,我们可以把这些列或者这些列的组合称为候选键。一个表中可能有多个候选键,我们可以选择一个候选键作为表的主键。一个表最多只能有一个主键,主键的值不能重复。

定义主键的两种方式:

如果主键是单个列的话,直接在该列后声明primary key。

也可以把主键的声明单独提取出来,放到列的定义后面就好了。当多个列的组合作为主键的情况,必须使用单独声明的形式。

如果在创建表的时候就申明了主键,MySQL会对待插入的信息记录进行校验,如果带待插入记录的主键值已经在表中存在,那就会报错。另外主键列默认具有not NULL属性,如果填入NULL值会报错

 create table student_score(
    -> number INT,
    -> subject VARCHAR(30),
    -> score TINYINT,
    -> PRIMARY KEY (number)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into student_score(number) values(NULL);
ERROR 1048 (23000): Column 'number' cannot be null

unique 约束属性:

除了主键外,有时我们也希望其他某个列或者列组合中存储的值是唯一的。也就是说,当我们像表中插入新纪录时,如果新纪录中这些列或者列组合的值与表中原有的值重复了,MySQL也会报错,从而拒绝插入新纪录。想要达到这个效果必须给这些有必要保持唯一性的列或者列组合添加unique约束,也叫unique键。

添加这个属性和添加主键属性一样,如果只要对一个列进行添加,就直接在创建的表的时候在,那列的后面加一个unique,一样的可以把unique单独提取出来写成这样:
unique 【key】 【约束名称】 (列名1,列名2....)

对于约束名称其实就是相当于一个名字,给这个约束起一个名字的意思,主键的约束名字是primary,是MySQL自动默认了的,而unique约束是需要我们自定义它的名字的。同样如果我们给多个列定义unique属性的话我们就要单独声明的形式。

unique约束和主键的对比:unique和主键一样都能保证某个列或者列组合的唯一性,但是:

一个列只能有个一个主键,但是能有多个unique键。主键不能存放NULL,但是unique能存放NULL。NULL并不是代表一个具体的值,而是代表该列尚未填入值。如果我们给表定义的时候没有定义主键属性,那么在定义的时候就会自动把第一个定义了NOT NULL属性和unique属性的列自动定为主键属性。

外键:插入到学生成绩表中列number的值必须在学生基本信息表中的number列中找到。为了防止出现信息不统一的情况,MySQL提供了外键机制。语法如下:

constraint 外键名称 foreign key(列1,列2....) references 父表名(父列1,父列2....)

外键名称是可选的,如果我们自己不定义,MySQL也会帮我们定义。

如果a表中某个列或者某些列依赖于b表中的某个列或者某些列,那么就称a表为子表,b表为父表

*在MySQL中,父表中被子表所依赖的列或者列的组合必须建立索引。如果该列或者列的组合已经是主键或者有unique属性,那么他们也就默认建立了索引。

AUTO_INCREMENT:自增的意思,我们可以使用整数类型或者浮点型声明该属性,在之后插入新记录时,可以不显示指定该列的值,MySQL会自动帮该列生成自动增长的唯一值。语法:

列名 列的类型 auto_increment

比如我们想在first_table表中定义一个id的列,并把这个列设为主键,以唯一的标记一条记录然后让其拥有auto_increment属性。在使用insert语句的时候我们可以忽略掉这个列,该列的值将会自动递增。并且从自动从1开始递增。

如果之后再向里面显式的插入新纪录时,显式的指定了声明了auto_increment属性的列的值,该列的值以我们显式指定的值为准,但如果插入的是NULL或者0,将不会执行,会自动在当前id列的最大值的基础上加1。在为列定义auto_increment属性时,需要注意下面几点。

一个表中最多有一个具有auto_increment属性的列。

具有auto_increment属性的列必须建立索引。主键和具有unique属性的列会自动建立索引。

拥有auto_increment属性的列不能再通过指定default属性来指定默认值

在日常生活中,auto_increment一般作为主键的属性,来自动生成唯一标识一条记录的主键值。

列的注释:在创建表的时候我们说到了可以用一个comment来为表添加注释,其实同样可以在列的定义后面加上comment,这样可以增加数据库的可读性。

显示宽度与ZRROFILL:对整数的写法其实有两种,举个例子,一种是3,一种是0003;有朋友就要问了这有什么区别吗,区别肯定是有的,最基本外形就不相同呀。像这种0003这种左边补0的数是怎么显示的呢。这里就要提到zerofill属性了。

mysql> create table zerofill_table(
    -> i1 int unsigned zerofill,
    -> i2 int unsigned
    -> );

mysql> desc zerofill_table;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type                      | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| i1    | int(10) unsigned zerofill | YES  |     | NULL    |       |
| i2    | int unsigned              | YES  |     | NULL    |       |
+-------+---------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into zerofill_table(i1, i2) values(1, 1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from zerofill_table;
+------------+------+
| i1         | i2   |
+------------+------+
| 0000000001 |    1 |
+------------+------+
1 row in set (0.00 sec)

我们这里可以看到当我们创建了这个新表并且给i1设置了zerofill属性后,给他填入1后,1前会自动补上9个0.原因是因为zerofill属性自动让int类型变成了int(10);

我们也可以改变显示长度,改成int(x<=10)皆可。这里有些同学又要问了,int的默认长度不是11吗,怎么变成了10?其实这都是unsigned的功劳,如果加了unsigned的话不同的整数类型的默认显示宽度都要-1;

然后当在创建表的时候在声明zerofill属性的列没有声明unsigned属性,那么MySQL会为该列自动生成unsigned属性。也就i是说MySQL现在只支持对无符号整数进行自动补0的操作。

显示宽度并不会影响列所需的存储空间以及取值范围。也就是说如果你设置的是int(5);但你insert是12345678.一样的可以显示出来。显示宽度只是在输入长度不足的时候补零可以作为参照。其余时候只要没有超过本省数据类型长度,都是可以显示出来的。

查看表结构时的列属性:

比如我们来看一个student_info的表结构

mysql> desc student_info;
+-----------------+-----------------+------+-----+---------+-------+
| Field           | Type            | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| number          | int             | NO   | PRI | NULL    |       |
| name            | varchar(5)      | YES  |     | NULL    |       |
| sex             | enum('男','女') | YES  |     | NULL    |       |
| id_number       | char(18)        | YES  |     | NULL    |       |
| department      | varchar(30)     | YES  |     | NULL    |       |
| major           | varchar(30)     | YES  |     | NULL    |       |
| enrollment_time | date            | YES  |     | NULL    |       |
+-----------------+-----------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

这里我们需要看懂的就是每一栏的意思。

所谓的NULL列的yes或者no就是意思能不能填入NULL,然后key就是键值。主键等等。default就是有没有设置默认值。extra就是显示一些额外的信息。比如说如果某个设置了auto_increment那么就是显示在这一列。

标识符的命名:简单来说就是我们设置的那些名字,比如数据库名啊等等,这些统称为标识符,虽然MySQL对标识符没有特殊的限制,但还是有些不太好的标识符设置方式比如:

一串数字当标识符;名称中有空白符;名称使用了MySQL中的保留字。比如一些create什么的用了就会报错。如果硬要用其实也不是不行,但不过要加(' ')将定义的东西引起来比如'123456'这样就是合法的

你可能感兴趣的:(MySQL的学习,mysql,数据库,sql)