MySQL入门:数据库和表的基本操作

MySQL使用表来存放数据,表的每一列都需要存放特定格式的数据,所以MySQL为不同的格式的数据定义了不同的类型,我们介绍了各种数值、字符串、时间和二进制类型的含义以及要求的存储空间。本集来看一下在MySQL中关于数据库和表的各种操作。

命令使用注意事项

我们知道MySQL的基本运行过程就是:通过客户端程序发送命令给服务器程序,服务器程序按照接收的命令去操作实际的数据。在我们使用黑框框启动了MySQL客户端程序之后,界面上会一直显示一行mysql>的提示符,你可以在它后边输入我们的命令然后按一下回车键,在书写命令的时候需要注意下边这几点:

  • 命令结束符号。在书写完一个命令之后需要以下边这几个符号之一结尾:
    • ;
  • \g
  • \G
  • 命令可以随意换行。并不是按了回车键就提交命令了,只要按回车键的时候输入的语句里没有;\g或者\G就算是语句没结束。比如上边查询当前时间的命令还可以这么写:
    mysql> SELECT
        -> NOW()
        -> ;
    +---------------------+
    | NOW()               |
    +---------------------+
    | 2018-02-06 17:57:15 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql>
    复制代码
  • 可以一次提交多个命令我们可以在一条语句里写多个命令(命令之间用上面说的结束符分隔),比如这样:
    mysql> SELECT NOW(); SELECT NOW(); SELECT NOW();
    +---------------------+
    | NOW()               |
    +---------------------+
    | 2018-02-06 18:00:05 |
    +---------------------+
    1 row in set (0.00 sec)
    
    +---------------------+
    | NOW()               |
    +---------------------+
    | 2018-02-06 18:00:05 |
    +---------------------+
    1 row in set (0.00 sec)
    
    +---------------------+
    | NOW()               |
    +---------------------+
    | 2018-02-06 18:00:05 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql>
    复制代码

    连着输入了3个查询当前时间的命令,只要没按回车键,就不会提交命令。

    小贴士: 后边我们还会介绍把命令都写在文件里,然后再批量执行文件中的命令,那个感觉更爽!

  • 使用\c清除本次操作。如果你想放弃本次编写的命令,可以使用\c来清除,比如这样:
    mysql> SELECT NOW()\c
    mysql>
    复制代码

    如果不使用\c,那客户端会以为这是一个多行命令,还在一直傻傻的等你输入命令~

  • 大小写问题。MySQL默认对命令的大小写并没有限制,也就是说我们这样查询当前时间也是可以的:
    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2018-02-06 18:23:01 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql>
    复制代码

    不过按照习俗,这些命令、函数什么的都是要大写的,而一些名称类的东西,比如数据库名,表名、列名啥的都是要小写的,更多具体的书写规范等我们遇着再详细介绍。

  • 字符串的表示。在命令里有时会使用到字符串,我们可以使用单引号''或者双引号""把字符串内容引起来,比如这样:
    mysql> SELECT 'aaa';
    +-----+
    | aaa |
    +-----+
    | aaa |
    +-----+
    1 row in set (0.00 sec)
    
    mysql>
    复制代码

    这个语句只是简单的把字符串'aaa'又输出来了而已。但是一定要在字符串内容上加上引号,不然的话MySQL服务器会把它当作列名,比如这样就会返回一个错误:

    mysql> SELECT aaa;
    ERROR 1054 (42S22): Unknown column 'aaa' in 'field list'
    mysql>
    复制代码

    但是MySQL中有一种叫ANSI_QUOTES的模式,如果开启了这种模式,双引号就有其他特殊的用途了,可能你并不能看懂我在说什么,但是这都不重要,重要的是建议你最好使用单引号来表示字符串~

  • 当一条命令发送给了MySQL服务器之后,服务器处理完后就会给你发送回来响应的结果,然后显示到界面上。然后你就可以接着输入下一条命令了。

    数据库相关操作

    MySQL中把某种类型的表的集合称为一个数据库MySQL服务器管理着若干个数据库,每个数据库下都可以有若干个表,画个图就是这样:

    MySQL入门:数据库和表的基本操作

    展示数据库

    在我们刚刚安装好MySQL的时候,它已经内建了许多数据库和表了,我们可以使用下边这个命令来看一下都有哪些数据库:

    SHOW DATABASES;
    复制代码

    我自己的电脑上安装的MySQL版本是5.7.21,看一下在这个版本里内建了哪些数据库(启动客户端软件,用你的用户名和密码登录后输入命令):

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)
    
    mysql>
    复制代码

    可以看到,这一版本的MySQL已经为我们内建了4个数据库,这些数据库都是给MySQL自己使用的,如果我们想使用MySQL存放自己的数据的话,首先需要创建一个属于自己的数据库。

    创建数据库

    创建数据库的语法贼简单:

    CREATE DATABASE 数据库名;
    复制代码

    来实际操作一下:

    mysql> CREATE DATABASE xiaohaizi;
    Query OK, 1 row affected (0.00 sec)
    
    mysql>
    复制代码

    我把我的名字xiaohaizi作为了数据库名称,敲完命令回车之后提示了一个Query OK, 1 row affected (0.00 sec)说明数据库创建成功了。然后我们再用SHOW DATABASES的命令查看一下现在有哪些数据库:

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | xiaohaizi          |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql>
    复制代码

    看到我们自己创建的数据库xiaohaizi就已经在列表里了。

    IF NOT EXISTS

    我们在一个数据库已经存在的情况下再使用CREATE DATABASE去创建这个数据库会产生错误:

    mysql> CREATE DATABASE xiaohaizi;
    ERROR 1007 (HY000): Can't create database 'xiaohaizi'; database exists
    mysql>
    复制代码

    执行结果提示了一个ERROR,意思是数据库xiaohaizi已经存在!所以如果我们并不清楚数据库是否存在,可以使用下边的语句来创建数据库:

    CREATE DATABASE IF NOT EXISTS 数据库名;
    复制代码

    这个命令的意思是如果指定的数据库不存在的话就创建它,否则什么都不做。我们试一试:

    mysql> CREATE DATABASE IF NOT EXISTS xiaohaizi;
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    mysql>
    复制代码

    可以看到语句执行成功了,报的ERROR错误也没有了,只是结果中有1个warning而已。这个warning只是MySQL善意的提醒我们数据库xiaohaizi不存在而已,并不会影响语句的执行。

    小贴士: 前边说过MySQL的命令可以多条一起执行,可以在黑框框中一次输入多个命令,也可以把好多命令放到一个文件中执行。如果某一条命令的执行结果是产生了一个`ERROR`,MySQL会停止执行该命令之后的命令,但是如果仅仅是在执行结果中有`warning`的话,是不会中断执行的。

    切换当前数据库

    对于每一个连接到MySQL服务器的客户端,都有一个当前数据库的概念,我们创建的表默认都会被放到当前数据库中,切换当前数据库的命令也贼简单:

    USE 数据库名称;
    复制代码

    所以在介绍创建表之前,我们应该把当前数据库切换到刚刚创建的数据库xiaohaizi上:

    mysql> USE xiaohaizi;
    Database changed
    mysql>
    复制代码

    看到显示了Database changed说明当前数据库已经切换成功了。需要注意的是,在退出当前客户端之后,也就是你输入了exit或者quit命令之后或者直接把当前的黑框框页面关掉,当你再次调用mysql -h 主机名 -u 用户名 -p 密码的时候,相当于重新开启了一个客户端,需要重新调用USE 数据库名称的命令来选择一下当前数据库。

    删除数据库

    如果你创建的数据库没用了,我们还可以把它删掉,语法如下:

    DROP DATABASE 数据库名;
    复制代码

    在真实的工作环境里,在删除数据库之前你需要先拿体温计量量是不是发高烧了,然后再找至少两个人核实一下自己是不是发烧了,然后你才敢执行删除数据库的命令。删除数据库意味着里边的表就都被删除了,也就意味着你的数据都没了,所以是个极其危险的操作,使用时需要极其谨慎。不过我们这是学习环境,而且刚刚创建了xiaohaizi数据库,什么表都没往里头放,删了就删了吧:

    mysql> DROP DATABASE xiaohaizi;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql>
    复制代码

    然后看一下现在还有哪些数据库:

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.01 sec)
    
    mysql>
    复制代码

    可以看到我们前边创建的xiaohaizi数据库就没有啦。

    IF EXISTS

    如果某个数据库并不存在,我们仍旧调用DROP TABLE语句去删除它,会报错的:

    mysql> DROP DATABASE xiaohaizi;
    ERROR 1008 (HY000): Can't drop database 'xiaohaizi'; database doesn't exist
    mysql>
    复制代码

    如果想避免这种报错,可以使用这种形式的语句来删除数据库:

    DROP DATABASE IF EXISTS 表名;
    复制代码

    再次删除一下xiaohaizi

    mysql> DROP DATABASE IF EXISTS xiaohaizi;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql>
    复制代码

    这回就不会报错啦!演示完删除数据库的流程之后还是把xiaohaizi数据库创建出来并且切换到当前数据库吧,毕竟我们之后还要在这个数据库里创建各种表呢~

    表的操作

    数据库建好之后,我们就可以接着创建真正存储数据的表了。创建表的时候首先需要描述清楚这个表长什么样,它有哪些列,这些列都是用来存什么类型的数据等等,这个对表的描述称为表的模式(scheme)。有了表的模式之后,我们就可以着手把数据塞到这个表里了。表中的每一行也叫做一条记录,每一列也叫做一个字段

    创建表

    基本语法

    创建一个表需要至少要完成下列事情:

  • 给表起个名。
  • 给表定义一些列,并且给这些列都起个名。
  • 每一个列都需要定义一种数据类型,来规范它能存储的数据。
  • 如果有需要的话,可以给这些列定义一些列的属性,比如不许为空,设置默认值等等,这些属性也叫做列的约束性条件,具体有哪些列的属性我们稍后会详细唠叨。
  • MySQL中创建表的基本语法就是这样的:

    CREATE TABLE 表名 (
        列名1    列的类型    [列的属性],
        列名2    列的类型    [列的属性],
        ...
        列名n    列的类型    [列的属性]
    );
    复制代码

    也就是说,我们在CREATE TABLE后写清楚我们定义的表的表名,然后在小括号()中定义上这个表的各个列的信息,包括列的列名、类型,如果有需要的话也可以定义这个列的属性,其中列的属性用中括号[]引起来的意思是可选的,也就是说可以有也可以没有,列名、列的类型、列的属性之间用空白字符分开就好,然后各个列的信息之间用逗号,分隔开。

    小贴士: 我们也可以把这个创建表的语句都放在一行里(把换行删掉),分成多行并且加上缩进仅仅是为了美观而已~

    废话不多说,赶紧创建一个超级简单的表瞅瞅:

    CREATE TABLE first_table (
        first_column INT,
        second_column VARCHAR(100)
    );
    复制代码

    我们新创建的这个表的名字叫做first_table,它有两个列,第一个列的列名是first_column,列的类型是INT,意味着只能存放整数型数据,第二个列的列名是second_column,列的类型是VARCHAR(100),意味着这个列可以存放长度不超过100个字符的字符串。我们在客户端执行一下这个语句(当前数据库是xiaohaizi):

    mysql> CREATE TABLE first_table (
        ->     first_column INT,
        ->     second_column VARCHAR(100)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql>
    复制代码

    输出Query OK, 0 rows affected (0.02 sec)意味着创建成功了,并且耗时0.02秒。

    有了创建first_table的经验,我们就可以着手用MySQL把之前提到的学生基本信息表和成绩表给创建出来了,先把学生信息表搬下来看看: