当前位置:网站首页>一个小时快速熟悉MySQL基本用法

一个小时快速熟悉MySQL基本用法

2022-08-11 05:35:00 Pr4da

0.数据库基本属性

表1 班级表

ID名称班主任
201二年级一班王老师
202二年级二班李老师

表2 学生表

ID姓名班级ID性别年龄
1小明201M9
2小红202F8
3小军202M8
4小白201F9

表3 班主任表

ID名称班主任ID
201二年级一班A1
202二年级二班A3
  • 一对多:例如一个学校的数据库,有班级表还可以有学生表,一个学校有很多个班级,一个班级有很多个学生,所以班级表与学生表是一对多的关系
  • 一对一:每个班级对应一个班主任,这样班级表与班主任表就是一对一的关系
  • 多对一:如果我们知道了班里某个学生的ID=1,我们想要知道它的班级信息,我们只需在学生表中找到他的班级ID,然后在班级表查看班级信息,这就是多对一
  • 主键:一个数据库主键是唯一的,我们能够通过主键唯一确定一条数据信息。但是身份证号码、手机号这种看似位移的信息却不能作为主键,主键最好使用与业务无关的字段。如自增数据类型(类似于excel前面的索引)、全局位移GUID类型。对于大部分应用,自增数据类型就能满足要求。
  • 外键:用于关联两个表

1.数据库操作

1.1查看数据库

show databases;:注意这里的databases是复数形式,并且结尾要以分号结尾。输出结果为:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

1.2创建数据库

create database Students;:创建一个名为Students的数据库。输出结果为:

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

1.3选中数据库

use Students;:进入创建的数据库,输出结果如下所示:

mysql> use students;
Database changed

1.4查看数据库中的数据表

show tables;:查看该数据库中有多少个数据表,数据表是一个二维的表格,就像excel表格一样,如下图就是一个数据表(图片来源于菜鸟联盟)。
数据表
由于刚刚我们创建了一个新的数据库,所以数据库是空的,如下图所示。

mysql> show tables;
Empty set (0.00 sec)

我们可以直接使用use database_name;来更改数据库,比如我们将数据库更改为use mysql;,然后再使用show tables;,得到如下输出:

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| component                 |
| db                        |
| default_roles             |
| engine_cost               |
| func                      |
| general_log               |
| global_grants             |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| password_history          |
| plugin                    |
| procs_priv                |
| proxies_priv              |
| role_edges                |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
33 rows in set (0.00 sec)

1.5删除数据库

drop database Students;:使用该命令删除数据库。输出如下:

mysql> drop database students;
Query OK, 0 rows affected (0.01 sec)

2.数据表操作

2.1创建数据表

创建表的通用语法CREATE TABLE tablename (column_name column_type)
我们待创建的数据信息如下所示:

idnamesexageaddress
441Jammale17Jinlin
442Tommale19Guizhou
372Alexmale15Beijing
426Amyfamle17Chongqing

则创建形式如下所示:

mysql> create table studentdata
    -> (
    -> id char(10) not null primary key,
    -> name char(16) not null,
    -> sex char(6) not null,
    -> age int not null,
    -> adress char(36) not null
    -> );
Query OK, 0 rows affected (0.05 sec)

我们使用show tables把所有数据表信息打印下来,studentdata这个数据表就已经建好:

mysql> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| studentdata        |
+--------------------+
1 row in set (0.00 sec)

下面我们来详细解释一下创建表格中这些符号是什么意思:

列声明语句解释
id char(10) not null primary key创建一列名为id,数据类型为char,最大长度为10个字符串,并且该列内容不允许为空;同时把这一列作为这张表的主键,用来区分表中不同行
name char(16) not null创建一列,名称为name;数据类型为char字符类型,字符的最大长度为16个字符;并且该列内容不允许为空。
类型相似,这里不再介绍

我们使用describe studentdata来查看数据表详细内容,也可以使用简写的desc studentdata

mysql> DESC studentdata;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id     | char(10) | NO   | PRI | NULL    |       |
| name   | char(16) | NO   |     | NULL    |       |
| sex    | char(6)  | NO   |     | NULL    |       |
| age    | int      | NO   |     | NULL    |       |
| adress | char(36) | NO   |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
5 rows in set (0.02 sec)

2.2删除表

drop table tablename:执行该命令对数据表进行删除

2.3向表中添加数据

insert into tablename (filed1, filed2, ...)
					  values
					  (value1, value2, ...);

创建好数据表之后就是将数据添加到数据表中,通用语句如上所示。下面我们将下表数据填入数据表中。

idnamesexageaddress
441Jammale17Jinlin
442Tommale19Guizhou
372Alexmale15Beijing
426Amyfamle17Chongqing
mysql> insert into studentdata values('441','Jam','male',17,'Jinlin');
Query OK, 1 row affected (0.04 sec)

mysql> insert into studentdata values('442','Tom','male',19,'Guizhoun');
Query OK, 1 row affected (0.02 sec)

mysql> insert into studentdata values('372','Alex','male',15,'Beijing');
Query OK, 1 row affected (0.00 sec)

mysql> insert into studentdata values('426','Amy','famale',17,'Chongqing');
Query OK, 1 row affected (0.01 sec)

2.4查询数据表中的数据

select * from tablename:如果是*的话表示数据表中的所有数据,也可以选择自己想要查询的对象如果name,sex等。

mysql> select * from studentdata;
+-----+------+--------+-----+-----------+
| id  | name | sex    | age | adress    |
+-----+------+--------+-----+-----------+
| 372 | Alex | male   |  15 | Beijing   |
| 426 | Amy  | famale |  17 | Chongqing |
| 441 | Jam  | male   |  17 | Jinlin    |
| 442 | Tom  | male   |  19 | Guizhoun  |
+-----+------+--------+-----+-----------+
4 rows in set (0.00 sec)
mysql> select name,sex from studentdata;
+------+--------+
| name | sex    |
+------+--------+
| Alex | male   |
| Amy  | famale |
| Jam  | male   |
| Tom  | male   |
+------+--------+
4 rows in set (0.00 sec)

2.5按特定条件查询

select field1, field2,...fieldN from table_name1, table_name2...
[where condition1 [and [or]] condition2.....

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。例如查询表中年龄大于15的记录:

mysql> select * from studentdata where age>15;
+-----+------+--------+-----+-----------+
| id  | name | sex    | age | adress    |
+-----+------+--------+-----+-----------+
| 426 | Amy  | famale |  17 | Chongqing |
| 441 | Jam  | male   |  17 | Jinlin    |
| 442 | Tom  | male   |  19 | Guizhoun  |
+-----+------+--------+-----+-----------+
3 rows in set (0.00 sec)

如果要查询年龄大于15且为女性的记录(female打错了(。^▽^)):

mysql> select * from studentdata where age>15 and sex='famale';
+-----+------+--------+-----+-----------+
| id  | name | sex    | age | adress    |
+-----+------+--------+-----+-----------+
| 426 | Amy  | famale |  17 | Chongqing |
+-----+------+--------+-----+-----------+
1 row in set (0.00 sec)

2.6更新数据表

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

刚刚发现我们把female这个单词打错了,所以我们需要对数据表进行更新:

mysql> update studentdata set sex='female' where id='426';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

我们将修改后的记录打印出来,female这个单词已经被更正过来。

mysql> select * from studentdata;
+-----+------+--------+-----+-----------+
| id  | name | sex    | age | adress    |
+-----+------+--------+-----+-----------+
| 372 | Alex | male   |  15 | Beijing   |
| 426 | Amy  | female |  17 | Chongqing |
| 441 | Jam  | male   |  17 | Jinlin    |
| 442 | Tom  | male   |  19 | Guizhoun  |
+-----+------+--------+-----+-----------+
4 rows in set (0.00 sec)

还可以对所有人的属性进行操作,例如对所有人的年龄加1:

mysql> update studentdata set age=age+1;
Query OK, 4 rows affected (0.02 sec)
Rows matched: 4  Changed: 4  Warnings: 0

2.7修改数据表

ALTER TABLE tablename CHANGE <旧字段名> <新字段名> <新字段属性>

例如我们需要将sex改为gender:

mysql> ALTER TABLE studentdata CHANGE sex gender char(10) not null;
Query OK, 4 rows affected (0.04 sec)
Records: 4  Duplicates: 0  Warnings: 0

如果我们需要修改数据的数据类型可以用下面的方法:

ALTER TABLE  <表名> MODIFY <字段名> <数据类型>

例如我们要将地址char(36)改变为char(16):

mysql> ALTER TABLE studentdata MODIFY adress char(16);
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

如果我们要将数据表中的某一个属性删除,则可以用如下命令:

ALTER TABLE <表名> DROP <字段名>;

这里就不进行演示了。
我们也可以添加字段,如我们想在表格后面加上班级信息,则可以用如下命令:

ALTER TABLE <表名> ADD <字段名> <字段属性>;

添加班级信息:

mysql> ALTER TABLE studentdata ADD class INT;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

把数据表信息打印下来:

mysql> DESC studentdata;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id     | char(10) | NO   | PRI | NULL    |       |
| name   | char(16) | NO   |     | NULL    |       |
| gender | char(10) | NO   |     | NULL    |       |
| age    | int      | NO   |     | NULL    |       |
| adress | char(16) | YES  |     | NULL    |       |
| class  | int      | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
6 rows in set (0.01 sec)

2.8删除数据表

DELETE FROM <表名> [WHERE clause];

如果不指明where,则会将整个表都删除。如我们要把班级信息删掉:

mysql> DELETE FROM studentdata where class;
Query OK, 0 rows affected (0.00 sec)

2.9LIKE模糊查询

有时我们想选择某一属性中的具有相似类型的数据,比我我们要把手机号以136开头的用户选出来,就用如下命令

SELECT * FROM studentdata WHERE phone LIKE '136%';

2.10排序查询

SELECT * FROM studentdata ORDER BY <字段名> [ASC|DESC];

ASC是按升序拍了,是默认情况;DESC是降序排列。我们按年龄降序排列进行查询:

mysql> SELECT * FROM studentdata ORDER BY age DESC;
+-----+------+--------+-----+-----------+-------+
| id  | name | gender | age | adress    | class |
+-----+------+--------+-----+-----------+-------+
| 442 | Tom  | male   |  20 | Guizhoun  |  NULL |
| 426 | Amy  | female |  18 | Chongqing |  NULL |
| 441 | Jam  | male   |  18 | Jinlin    |  NULL |
| 372 | Alex | male   |  16 | Beijing   |  NULL |
+-----+------+--------+-----+-----------+-------+
4 rows in set (0.00 sec)

2.11COUNT计数

我们先新建一个新的数据表:

mysql> select * from employee;
+----+----------+---------------------+--------+
| id | name     | date                | singin |
+----+----------+---------------------+--------+
|  1 | xiaoming | 2016-04-22 15:25:33 |      1 |
|  2 | xiaowang | 2016-04-20 15:25:47 |      3 |
|  3 | xiaoli   | 2016-04-19 15:26:02 |      2 |
|  4 | xiaowang | 2016-04-07 15:26:14 |      4 |
|  5 | xiaoming | 2016-04-11 15:26:40 |      4 |
|  6 | xiaoming | 2016-04-04 15:26:54 |      2 |
+----+----------+---------------------+--------+
6 rows in set (0.00 sec)

如果我们要统计表里有多少条数据,一个一个数显然是不可能的,所以使用COUNT函数进行计数,一般形式如下SELECT COUNT(*) FROM tablename

mysql> SELECT COUNT(*) FROM employee;
+----------+
| COUNT(*) |
+----------+
|        6 |
+----------+
1 row in set (0.02 sec)

使用COUNT(name)是一样的效果:

mysql> SELECT COUNT(name) FROM employee;
+-------------+
| COUNT(name) |
+-------------+
|           6 |
+-------------+
1 row in set (0.03 sec)

这里显示的是COUNT(*),我们可以给它命个名好看一些:

mysql> SELECT COUNT(*) num FROM employee;
+-----+
| num |
+-----+
|   6 |
+-----+
1 row in set (0.02 sec)

同样我们可以使用WHERE条件查询:

mysql> SELECT COUNT(*) num FROM employee WHERE singin>2;
+-----+
| num |
+-----+
|   3 |
+-----+
1 row in set (0.00 sec)

除了COUNT函数外,SQL还内置了如下函数:

函数说明
AVG计算某列的平均值,该列必须为数值型
SUM计算某列的和,该列必须为数值型
MAX计算某列的最大值
MIN计算某列的最小值

例如我们要统计singin的总和:

mysql> SELECT SUM(singin) sum FROM employee;
+------+
| sum  |
+------+
|   16 |
+------+
1 row in set (0.00 sec)

表中有些名字出现了很多次,我们如果想知道每个人都出现了几次,如果我们用SELECT COUNT(*) FROM employee WHERE name='xiaowang',则需要每次都重新输入名字,我们可以用GROUP BY聚合方法:

mysql> SELECT COUNT(*) num from employee GROUP BY name;
+-----+
| num |
+-----+
|   3 |
|   2 |
|   1 |
+-----+
3 rows in set (0.00 sec)

虽然我们成功统计了各个名字出现的次数,但是我们不知道他们与名字的对应关系。因此,我们需要把名字也加上:

mysql> SELECT name, COUNT(*) num from employee GROUP BY name;
+----------+-----+
| name     | num |
+----------+-----+
| xiaoming |   3 |
| xiaowang |   2 |
| xiaoli   |   1 |
+----------+-----+
3 rows in set (0.00 sec)

2.12HAVING子句

WHERE一样,HAVING也可进行过滤,例如:

mysql> SELECT * FROM employee HAVING singin>2;
+----+----------+---------------------+--------+
| id | name     | date                | singin |
+----+----------+---------------------+--------+
|  2 | xiaowang | 2016-04-20 15:25:47 |      3 |
|  4 | xiaowang | 2016-04-07 15:26:14 |      4 |
|  5 | xiaoming | 2016-04-11 15:26:40 |      4 |
+----+----------+---------------------+--------+
3 rows in set (0.01 sec)

WHERE函数无法与聚合函数GROUP BY一起使用,所以增加了HAVING函数。例如我们要选出名字出现次数超过2次的纪录:

mysql> SELECT name,COUNT(*) FROM employee GROUP BY name HAVING COUNT(name)>2;
+----------+----------+
| name     | COUNT(*) |
+----------+----------+
| xiaoming |        3 |
+----------+----------+
1 row in set (0.01 sec)

2.13CASE…WHEN…条件语句

CASE <对象>
	WHEN <判别式> THEN <表达式>
	WHEN <判别式> THEN <表达式>
	ELSE <表达式>
END

例如我们有下面一张表格,要将male改为female,female就可以用CASE ... WHEN ...语句
在这里插入图片描述

UPDATE salary
SET sex=(CASE sex
			WHEN 'm' THEN 'f'
			ELSE 'm'
			END);

参考:
MySQL快速入门(上)
廖雪峰SQL教程
30分钟带你入门MySQL
MySQL教程
MySQL菜鸟教程

原网站

版权声明
本文为[Pr4da]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_40210586/article/details/107582140