Cuuube / blog

blog on Mirror
1 stars 0 forks source link

[mysql]从零开始的MYSQL(之一) — 增改删查 #58

Open Cuuube opened 6 years ago

Cuuube commented 6 years ago

从零开始的MYSQL(之一) — 增改删查

序言

最近工作中用到了mysql,作为一个兼职后端,发现自己居然还不会用大名鼎鼎的mysql!当然就要恶补了!所以,在下就以一个小白,来一步一步记录下学习笔记。与各位同样的小白共勉!还望大神轻喷,有错误也希望多多指教!谢谢!

Mysql是什么

讲人话来说,mysql是一种关系型数据库。就算你是绝对的外行,你也知道数据库是存数据的。

对于mysql来说,数据以来组织,以来区分每条数据,以来分类数据的类型。

和excel表格类似。

表、行、列是最重要的概念。

当然为什么叫关系型数据库,是因为有主键外键的存在。先不用在意这些是什么。其他概念需要的话将在后面提到。

安装

警告:本章内容window用户请自行跳过。可移步其他教程

$ brew install mysql
$ sudo apt install mysql
# 或者
$ sudo apt install mysql-server

之后设置一下mysql root的密码,就可以进入mysql了。

进入mysql命令:

$ mysql -u root -p

之后会让你验证root密码。输入你设置的root密码,就可以进入mysql环境了。

进入之后,命令行显示如下:

mysql>

此时就可以输入sql语句来操作mysql数据库了。

使用的几点注意

  1. 每句sql命令后都已分号; 结尾。mysql检测到分号才会执行命令。不然会进入多行模式。退出多行命令的方式是,输入分号并回车,会执行之前输入的多行命令。输入\c,会终止输入,并不运行命令。
  2. 生产服务器请慎用dropdelete命令。不然请自行阅读《MySql —— 从删库到跑路》

创建 create

安装成功之后,那我们就来做个小例子吧。

我们需要建一个武器表,来存储我们的武器。每个武器都有如下字段:

现在我们来一步一步构建我们的”武器库“

1、在进入mysql中之后,我们先看一下已经存在的数据库 show

mysql> show databases;
# 注,sql语句之后,以下都是输出:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

我的输出如上。是一些安装mysql后自动生成的数据库。我们不需要管它们。

2、我们需要创建一个游戏(game)数据库,供我们玩耍 create database

mysql> create database game;
Query OK, 1 row affected (0.01 sec)

3、选择game数据库 use

mysql> use game;
Database changed

4、创建一张武器(weapons)表,供我们存放各种武器 create table

mysql> create table weapons (name varchar(20), demage int, width int, distance int);
Query OK, 0 rows affected (0.02 sec)

5、检查下当前数据库有哪些表 show tables

mysql> show tables;
+----------------+
| Tables_in_game |
+----------------+
| weapons        |
+----------------+
1 rows in set (0.00 sec)

6、检查一下我们的weapons表结构 describe

mysql> describe weapons;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | varchar(20) | YES  |     | NULL    |       |
| demage   | int(11)     | YES  |     | NULL    |       |
| width    | int(11)     | YES  |     | NULL    |       |
| distance | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

好,现在我们已经创建了一个非常简单的数据表了。然后我们就可以往武器库中添加武器了!

对数据的增、改、删、查

对数据的增改删查是数据库中最重要的操作,也是最频繁的操作。

现在我们开始添加武器!

查 select

先来查一下表中有没有武器:

mysql> select * from weapons;

Empty set (0.01 sec)

现在并没有数据。

轻微讲解语句含义:

其实sql语句含义很明确,稍微懂几个英语单词,就可以翻译:

选择 * (内容,)从 weapons (表中)

增 insert

好,我们现在比如要创造一件武器:铁剑(iron_sword)。我们有如下设定:

{
    name: 'iron_sword',
    demage: 10,
    width: 2,
    distance: 2
}

可以用以下命令插入表:

mysql> insert into weapons (name, demage, width, distance) values ('iron_sword', 10, 2, 2);

Query OK, 1 row affected (0.00 sec)

(轻微讲解语句含义:插入 到 weapons(表中) (啥啥字段,啥啥字段...) 值为 (啥啥字段的值,啥啥字段的值...))

现在再查一次表试试?

mysql> select * from weapons;

+------------+--------+-------+----------+
| name       | demage | width | distance |
+------------+--------+-------+----------+
| iron_sword |     10 |     2 |        2 |
+------------+--------+-------+----------+
1 row in set (0.00 sec)

我们就看到我们的铁剑了。

改 update 和 where

那么有一天,我们决定更改铁剑的数值,比如要把demage进行buff,增加到15。那么怎么办呢?

mysql> update weapons set demage=15 where name='iron_sword';

Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

(轻微讲解语句含义:更新 weapons(表) 设置 demage等于15 更新哪个呢 (字段)name为15(的那些数据)。可以此类推强化记忆。下面的就不再搞了。。。)

再检查一次看看?

mysql> select * from weapons where name='iron_sword';

+------------+--------+-------+----------+
| name       | demage | width | distance |
+------------+--------+-------+----------+
| iron_sword |     15 |     2 |        2 |
+------------+--------+-------+----------+
1 row in set (0.00 sec)

知识点:我们这次用到了where语句。where语句可以指定具有某种特征的行来执行操作。

比如上面我使用了where name='iron_sword'来指定,只有name为”iron_sword“的项才执行update语句。

所以,无论此时你weapons表中有多少项,只要name='iron_sword'只有一项,你修改就只有这一项,不会影响其他。所以我们通常update的时候,都会用唯一标识符id来找到目标。where id=1(我们此例子没有建id列,但一般生产中用到的表都铁定有一列id的。)

删 delete

删掉一条语句,也很简单:

mysql> delete from weapons where name='iron_sword';

Query OK, 1 row affected (0.00 sec)

表中此时已经没有”iron_sword“项了。大家可以自行查一下。

weapons表的升级版

因为之前的表太过简单,没有主键。现在我们删掉weapons表重新建。

删除表可以用drop命令:(警告:drop命令很危险!若一不小心删了公司中不该删的数据,可能使你面临被辞退甚至被起诉的危险!新手请勿在生产服务器中使用drop!)

mysql> drop table weapons;

Query OK, 0 rows affected (0.00 sec)

新建表:

mysql> create table weapons (id int auto_increment, name varchar(20) not null, demage int not null, width int not null, distance int not null, primary key (id));

Query OK, 0 rows affected (0.02 sec)

看一眼结构:

mysql> describe weapons;

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(20) | NO   |     | NULL    |                |
| demage   | int(11)     | NO   |     | NULL    |                |
| width    | int(11)     | NO   |     | NULL    |                |
| distance | int(11)     | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

我们看到多了很多内容。该语句中新内容是:

插数据还是差不多,用insert语句:

这次我们插入铁枪的数据:

mysql> insert into weapons (id, name, demage, width, distance) values (1, 'iron_lance', 10, 1, 3);

Query OK, 1 row affected (0.01 sec)

接着,再插入一条大枪的数据:

mysql> insert into weapons (name, demage, width, distance) values ('big_lance', 20, 2, 10);
Query OK, 1 row affected (0.01 sec)

看一下:

mysql> select * from weapons;                                                   
+----+------------+--------+-------+----------+
| id | name       | demage | width | distance |
+----+------------+--------+-------+----------+
|  1 | iron_lance |     10 |     1 |        3 |
|  2 | big_lance  |     20 |     2 |       10 |
+----+------------+--------+-------+----------+
2 rows in set (0.00 sec)

我们插入大枪时,没有插入id列。但mysql自动生成了id为2。这就是我们在创建表的时候,id后面加了auto_increment的作用。意思是,该列增加数据时,自动按顺序往后自增一并添加。因此以后再增加数据就不需要再指定id了。