###终端命令操作数据库

####如何在终端打开Mysql?

1
mysql -uroot -p123456

其中,“root"是打开哪一个数据库,“123456"是密码

如何查询数据库服务器中所有的数据库?

启动Mysql程序后,输入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.03 sec)

注意:一定要以英文分号(;)结尾。

如何在数据库服务器中,创建数据库?

1
2
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
  • 如何选中某一个数据库进行操作?

    1
    2
    
    mysql> use test
    Database changed
    
  • 如何查看某个数据库中所有的数据表?(先选中)

    1
    2
    
    mysql> show tables;
    Empty set (0.00 sec)
    
  • 如何创建一个数据表?

    1
    
    mysql> CREATE TABLE table_name (column_name column_type);
    

    注:创建一个新的数据表,要给定一个名字,而且数据表中的列名,要指定相应的数据类型。如,一个student数据表中,age的数据类型为:整数型。

    有关Mysql的数据介绍可以查看:MySQL 数据类型

    1
    2
    3
    4
    5
    
    mysql> CREATE TABLE student (
        -> name VARCHAR(20),
        -> sex CHAR(1),
        -> birth DATE);
    Query OK, 0 rows affected (0.10 sec)
    
  • 如何查看一个数据表结构?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    mysql> describe student;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | name  | varchar(20) | YES  |     | NULL    |       |
    | sex   | char(1)     | YES  |     | NULL    |       |
    | birth | date        | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.03 sec)
    
  • 如何查看一个数据表中的数据记录呢?

    1
    2
    
    mysql> select * from student;
    Empty set (0.00 sec)
    

    注:因为刚刚创建,所以为Empty。

  • 如何往数据表中添加数据记录?

    MySQL 表中使用 INSERT INTO SQL语句来插入数据。

    1
    2
    3
    
    INSERT INTO table_name ( field1, field2,...fieldN )
                           VALUES
                           ( value1, value2,...valueN );
    

    例子:

    1
    2
    3
    
    mysql> INSERT INTO student
        -> VALUES ("Allon","F","1995-03-13");
    Query OK, 1 row affected (0.01 sec)
    

    再次读取:

    1
    2
    3
    4
    5
    6
    7
    
    mysql> select * from student;
    +-------+------+------------+
    | name  | sex  | birth      |
    +-------+------+------------+
    | Allon | f    | 1995-03-13 |
    +-------+------+------------+
    1 row in set (0.01 sec)
    

    注意:插入的数据一定要满足前面设置的数据类型极其长度。

  • 如何删除数据表中的数据?

    语法:

    1
    
    delete from table_name where name='field_name';
    

    例子:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    mysql> select * from student;
    +-------+------+------------+
    | name  | sex  | birth      |
    +-------+------+------------+
    | Allon | f    | 1995-03-13 |
    | yuhan | m    | 1995-08-13 |
    | mohan | m    | 1995-05-31 |
    +-------+------+------------+
    3 rows in set (0.00 sec)
      
    #删除操作
    mysql> delete from student where name='mohan';
    Query OK, 1 row affected (0.02 sec)
      
    ##
    mysql> select * from student
        -> ;
    +-------+------+------------+
    | name  | sex  | birth      |
    +-------+------+------------+
    | Allon | f    | 1995-03-13 |
    | yuhan | m    | 1995-08-13 |
    +-------+------+------------+
    2 rows in set (0.00 sec)
    
  • 如何修改数据?

    语法:

    1
    
    update table_name set name='field_name' where name='field_name';
    

    例子:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    ###原始数据
    mysql> select * from student
        -> ;
    +-------+------+------------+
    | name  | sex  | birth      |
    +-------+------+------------+
    | Allon | f    | 1995-03-13 |
    | yuhan | m    | 1995-08-13 |
    +-------+------+------------+
    2 rows in set (0.00 sec)
      
    #修改数据
    mysql> update student set name='Yuallon' where name='Allon';
      
    ##修改结果
    mysql> select * from student;
    +---------+------+------------+
    | name    | sex  | birth      |
    +---------+------+------------+
    | Yuallon | f    | 1995-03-13 |
    | yuhan   | m    | 1995-08-13 |
    +---------+------+------------+
    2 rows in set (0.00 sec)
    
  • 总结

    • 增:INSERT
    • 删:DELETE
    • 改:UPDATE
    • 查:SELECT

Mysql建表约束类型及其含义

通过前面的学习,我们已经可以对Mysql数据进行 增删改查 的操作。但是,在数据的记录中,如何保证某一条记录的唯一性呢,即:如何区分A班的张三与D班的张三 or A班的李四与A班的张三呢?

主键约束

通过添加主键约束(primary key),它能够唯一确定一张表中的一条记录,可以使得该字段不重复且不为空(NULL)

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
###创建一个primary key约束的数据表
mysql> create table user ( id int primary key, name varchar(20));
Query OK, 0 rows affected (0.05 sec)

###查看,在数据表ID的KEY下有PRI
mysql> describe user;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

###添加数据
mysql> insert into user values (1,'Zhang3');
Query OK, 1 row affected (0.01 sec)

####重复添加则报错
mysql> insert into user values (1,'Zhang3');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

####不给定id值也报错
mysql> insert into user values (NULL,'Li4');
ERROR 1048 (23000): Column 'id' cannot be null

联合主键约束:只要是多个主键约束的参数,不完全一样,就不冲突。

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
##创建联合主键约束
mysql> create table user2 ( id int, name varchar(20), sex varchar(20), primary key (id,name));
Query OK, 0 rows affected (0.05 sec)

##添加
mysql> insert into user2 values(1,'Zhang3','femal');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user2 values(2,'Zhang3','femal');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user2 values(1,'Li3','femal');                            
Query OK, 1 row affected (0.00 sec)

##查询
mysql> select * from user2;
+----+--------+-------+
| id | name   | sex   |
+----+--------+-------+
|  1 | Li3    | femal |
|  1 | Zhang3 | femal |
|  2 | Zhang3 | femal |
+----+--------+-------+
3 rows in set (0.00 sec)

注:联合主键任何一个参数都不能为空(NULL)。

自增约束:auto_increment,自动增加某个参数的数值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
###创建自增约束数据表
mysql> create table user3(
    -> id int primary key auto_increment,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.03 sec)

###添加数据,没有对ID进行操作
mysql> insert into user3 (name) values ('Zhang3');
Query OK, 1 row affected (0.01 sec)

##查看数据,ID会自动添加数值
mysql> select * from user3
    -> ;
+----+--------+
| id | name   |
+----+--------+
|  1 | Zhang3 |
+----+--------+
1 row in set (0.00 sec)

如果创建数据表的时候,忘记添加主键约束了,怎么办?

1
alter table table_name add primary key(field_name)

如何删除主键约束呢?

1
alter table table_name drop primary key

如何修改?

1
alter table table_name modify field_name field_type primary key

唯一约束

约束修饰字段的值,不能重复。

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
###创建数据表
mysql> create table user5 (
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.05 sec)

###数据表
mysql> describe user5
    -> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

###创建唯一约束
mysql> alter table user5 add unique(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

####再次查看
mysql> desc user5
    -> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

注:唯一约束,即,name后面的(UNI)表示,name属性不可以重复。

1
2
3
4
5
6
7
##添加数据
mysql> insert into user5 values(1,"Zhang3");
Query OK, 1 row affected (0.00 sec)

##重复添加报错
mysql> insert into user5 values(1,"Zhang3");
ERROR 1062 (23000): Duplicate entry 'Zhang3' for key 'name'

也可以创建数据列表的时候添加约束,跟前面的主键约束一样。

如何删除唯一约束?

1
2
3
4
alter table table_name drop index field_name;

##Example
alter table user5 drop index name;

modify方式添加唯一约束

1
alter table user5 modify name varchar(20) unique;

非空约束

修饰的字段不能为空(NULL)

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
###创建非空约束数据表
mysql> create table user6 (
    -> id int,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.05 sec)

###查看
mysql> desc user6;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

注:name属性的NULL一栏中,null=NO,表示name的数据不能为空。

默认约束

当我们插入字段值的时候,如果没有传值,使用默认约束。

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
###创建默认约束数据表
mysql>  create table user7 (
    -> id int,
    -> name varchar(20),
    -> age int default 10);
Query OK, 0 rows affected (0.04 sec)

###查看表格特征
mysql> desc user7
    -> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | 10      |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

###添加数据
mysql> insert into user7 (id,name) values (1,"zhang3");
Query OK, 1 row affected (0.00 sec)

###提取表格数据
mysql> select * from user7;
+------+--------+------+
| id   | name   | age  |
+------+--------+------+
|    1 | zhang3 |   10 |
+------+--------+------+
1 row in set (0.01 sec)

注:上面添加数据的时候没有给age传值,则默认为10。

外键约束

涉及到两个表格:父表,子表。

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
##创建一个班级表
mysql> create table classes(
    -> id int primary key,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.04 sec)

##查看classes表格属性
mysql> desc classes;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

##创建一个学生表
mysql> create table students(
    -> id int primary key,
    -> name varchar(20),
    -> class_id int,
    -> foreign key(class_id) references classes(id)
    -> );
Query OK, 0 rows affected (0.04 sec)

##查看students表格属性,Key值有MUL
mysql> desc students;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| class_id | int(11)     | YES  | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

注:这就像是文件夹跟文件的关系一样,在班级的文件夹中,有各个班级的文件,每个班级里面又有相应该班级的学生信息。数据的增删改查跟前面一样,只是连个表格有了class_id联系起来了。

  • 主表 classes 中没有的数据值,在副表里面不能被引用。
  • 主表里面的信息被副表引用,则不可以被直接删除。

###如何退出数据库服务器?

1
2
mysql> exit;
Bye

参考

一天学会 MySQL 数据库