MySQL数据库基础入门

本文介绍MySQL数据库基础操作方法

MySQL 连接

命令行连接mysql服务器:

mysql -h 主机名 -u 用户名 -p
  • -h:指定要登录的MySQL主机名,登录本机可以省略
  • -u:用户名
  • -p:登录密码
C:\Users\10287>mysql -u root -p
Enter password: *********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

也可以通过数据库管理工具连接MySQL,可参考MySQL数据库安装配置详细教程

可使用exit 命令退出

mysql> exit
Bye

C:\Users\10287>

创建数据库

mysql> create database testdb;
Query OK, 1 row affected (0.13 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| sys                |
| testdb             |
+--------------------+
9 rows in set (0.37 sec)

mysql>

删除数据库

mysql> drop database testdb;
Query OK, 0 rows affected (0.35 sec)
mysql> create database testdb;
Query OK, 1 row affected (0.13 sec)

数据表操作

创建数据表

首先选择一个数据库

mysql> use testdb;
Database changed

进入testdb数据库后,创建一个名称为student的表

create table student(
    id int not null auto_increment primary key COMMENT 'ID',
    name varchar(10) not null COMMENT '姓名',
    sex char(10) not null COMMENT '性别',
    age tinyint(100) not null COMMENT '年龄',
    dept char(4) not null COMMENT '专业') ENGINE=InnoDB 
    DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
    comment = '学生';    

删除数据表

drop table 表名

查看表结构

mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10)  | NO   |     | NULL    |                |
| sex   | char(10)     | NO   |     | NULL    |                |
| age   | tinyint(100) | NO   |     | NULL    |                |
| dept  | char(4)      | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
5 rows in set (0.03 sec)

使用以下命令是一样的效果:

describe student;
show columns from student;

查看详细表结构

show full fields from student;

表结构修改

常用语法格式:
ALTER TABLE <表名> [修改选项]
修改选项的语法格式如下:

ADD COLUMN <列名> <类型> [after 插入位置]/*添加字段,或者在某列后插入列*/
CHANGE COLUMN <旧列名> <新列名> <新列类型> /*改变字段名*/
MODIFY COLUMN <列名> <类型> /*修改字段类型*/
DROP COLUMN <列名> /*删除字段*/
RENAME TO <新表名> /*修改表名*/

修改字段长度

alter table 表名 modify column 字段名 char(10);
alter table 表名 auto_increment = 201215121;

增删改查

插入数据

语法:

insert into 表名(字段1,字段2) values(字段值1,字段值2)

插入数据

mysql> insert into Student (name, sex, age, dept) values ('张三', '男', 20, '通信');
Query OK, 1 row affected (0.45 sec)
mysql> select * from student;
+----+------+-----+-----+------+
| id | name | sex | age | dept |
+----+------+-----+-----+------+
|  1 | 张三 | 男  |  20 | 通信 |
+----+------+-----+-----+------+
1 row in set (0.03 sec)

mysql>

删除数据

语法:

delete from 表名 where 字段名1= 字段值1
delete from 表名 /*删除表里所有数据*/

删除

mysql> delete from student;
Query OK, 1 row affected (0.09 sec)
mysql> select * from student;
Empty set (0.00 sec)

mysql> insert into Student (name, sex, age, dept) values ('张三', '男', 20, '通信');
Query OK, 1 row affected (0.07 sec)

mysql> insert into Student (name, sex, age, dept) values ('李四', '男', 22, '通信');
Query OK, 1 row affected (0.07 sec)

mysql> delete from student where name='张三';
Query OK, 1 row affected (0.17 sec)
mysql> select * from student;
+----+------+-----+-----+------+
| id | name | sex | age | dept |
+----+------+-----+-----+------+
|  3 | 李四 | 男  |  22 | 通信 |
+----+------+-----+-----+------+
1 row in set (0.00 sec)

mysql>

更新数据

语法:

update 表名 set 字段名1=字段值1 where 字段名2=字段值2
update 表名 set 字段名1=字段值1 /*修改表里所有数据*/

更新数据

mysql> update student set age=20 where name='李四';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+----+------+-----+-----+------+
| id | name | sex | age | dept |
+----+------+-----+-----+------+
|  3 | 李四 | 男  |  20 | 通信 |
+----+------+-----+-----+------+
1 row in set (0.00 sec)

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

mysql> select * from student;
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  1 | 李四 | 男  |  21 | 通信   |
|  2 | 张三 | 男  |  21 | 通信   |
|  3 | 王二 | 男  |  23 | 计算机 |
|  4 | 小花 | 女  |  23 | 计算机 |
+----+------+-----+-----+--------+
4 rows in set (0.04 sec)

mysql>

查询数据

再创建一个名称为score的表,记录成绩

create table score(
    sid int not null auto_increment primary key COMMENT 'score ID',
    student_id int(10) not null COMMENT '学号',
    name varchar(10) not null COMMENT '姓名',
    course char(10) not null COMMENT '课程',
    grade tinyint(100) not null COMMENT '分数') ENGINE=InnoDB 
    DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
    comment = '成绩';

student和score两个表显示如下:

mysql> select * from student;
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  1 | 李四 | 男  |  20 | 通信   |
|  2 | 张三 | 男  |  20 | 通信   |
|  3 | 王二 | 男  |  22 | 计算机 |
|  4 | 小花 | 女  |  22 | 计算机 |
+----+------+-----+-----+--------+
4 rows in set (0.00 sec)

mysql> select * from score;
+-----+------------+------+------------+-------+
| sid | student_id | name | course     | grade |
+-----+------------+------+------------+-------+
|   1 |          1 | 李四 | 高数       |    90 |
|   2 |          1 | 李四 | 英语       |    92 |
|   3 |          1 | 李四 | 经济学基础 |    88 |
|   4 |          2 | 张三 | 高数       |    80 |
|   5 |          2 | 张三 | 英语       |    85 |
|   6 |          2 | 张三 | 经济学基础 |    93 |
|   7 |          3 | 王二 | 高数       |    82 |
|   8 |          3 | 王二 | 英语       |    98 |
|   9 |          3 | 王二 | 经济学基础 |    80 |
+-----+------------+------+------------+-------+
9 rows in set (0.00 sec)

mysql>

查询语法:

select * from 表名
mysql> select * from student;
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  1 | 李四 | 男  |  20 | 通信   |
|  2 | 张三 | 男  |  20 | 通信   |
|  3 | 王二 | 男  |  22 | 计算机 |
|  4 | 小花 | 女  |  22 | 计算机 |
+----+------+-----+-----+--------+
4 rows in set (0.00 sec)

mysql>

where 关键词查询:select 列名称 from 表名称 where 条件;
where关键词支持如下运算:

  • =、>、<、>=、<>、!=
  • is [not] null、in、like
  • 支持 or 和 and 组合查询
mysql> select * from student where age > 20;
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  3 | 王二 | 男  |  22 | 计算机 |
|  4 | 小花 | 女  |  22 | 计算机 |
+----+------+-----+-----+--------+
2 rows in set (0.71 sec)

mysql> select * from student where age > 20 and sex = '女';
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  4 | 小花 | 女  |  22 | 计算机 |
+----+------+-----+-----+--------+
1 row in set (0.03 sec)

mysql> select * from student where dept like '计算%';
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  3 | 王二 | 男  |  22 | 计算机 |
|  4 | 小花 | 女  |  22 | 计算机 |
+----+------+-----+-----+--------+
2 rows in set (0.00 sec)

mysql> select * from student where dept like '计算_';
+----+------+-----+-----+--------+
| id | name | sex | age | dept   |
+----+------+-----+-----+--------+
|  3 | 王二 | 男  |  22 | 计算机 |
|  4 | 小花 | 女  |  22 | 计算机 |
+----+------+-----+-----+--------+
2 rows in set (0.00 sec)

mysql>

嵌套查询:查询李四同学的高数成绩(注意可能存在同名的,所以可以添加学号来组合查询)

mysql> select student_id, name, course, grade from score where student_id in (select id from student where name='李四') and course='高数';
+------------+------+--------+-------+
| student_id | name | course | grade |
+------------+------+--------+-------+
|          1 | 李四 | 高数   |    90 |
+------------+------+--------+-------+
1 row in set (0.00 sec)

连接查询

join多表查询

insert into Student (name, sex, age, dept) values ('小花', '女', 22, '计算机');

右连接 right join

right join 是 right outer join的简写,全称右外连接,是外连接中的一种。
语句:

SELECT * FROM student a right outer join b on a.a_id = b.b_id;

连接student和score:

mysql> SELECT * FROM student a right outer join score b on a.name = b.name;
+------+------+------+------+--------+-----+------------+------+------------+-------+
| id   | name | sex  | age  | dept   | sid | student_id | name | course     | grade |
+------+------+------+------+--------+-----+------------+------+------------+-------+
|    1 | 李四 | 男   |   21 | 通信   |   1 |          1 | 李四 | 高数       |    90 |
|    1 | 李四 | 男   |   21 | 通信   |   2 |          1 | 李四 | 英语       |    92 |
|    1 | 李四 | 男   |   21 | 通信   |   3 |          1 | 李四 | 经济学基础 |    88 |
|    2 | 张三 | 男   |   21 | 通信   |   4 |          2 | 张三 | 高数       |    80 |
|    2 | 张三 | 男   |   21 | 通信   |   5 |          2 | 张三 | 英语       |    85 |
|    2 | 张三 | 男   |   21 | 通信   |   6 |          2 | 张三 | 经济学基础 |    93 |
|    3 | 王二 | 男   |   23 | 计算机 |   7 |          3 | 王二 | 高数       |    82 |
|    3 | 王二 | 男   |   23 | 计算机 |   8 |          3 | 王二 | 英语       |    98 |
|    3 | 王二 | 男   |   23 | 计算机 |   9 |          3 | 王二 | 经济学基础 |    80 |
+------+------+------+------+--------+-----+------------+------+------------+-------+
9 rows in set (0.09 sec)

注意:与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL

示例sql:

mysql> SELECT student.id, student.name, score.course, score.grade FROM student RIGHT JOIN score ON student.id = score.sid;
+------+------+------------+-------+
| id   | name | course     | grade |
+------+------+------------+-------+
|    1 | 李四 | 高数       |    90 |
|    2 | 张三 | 英语       |    92 |
|    3 | 王二 | 经济学基础 |    88 |
|    4 | 小花 | 高数       |    80 |
| NULL | NULL | 英语       |    85 |
| NULL | NULL | 经济学基础 |    93 |
| NULL | NULL | 高数       |    82 |
| NULL | NULL | 英语       |    98 |
| NULL | NULL | 经济学基础 |    80 |
+------+------+------------+-------+
9 rows in set (0.00 sec)

mysql>

内连接查询 inner join

语句:

select * from a_table a inner join b_table b on a.a_id=b.b_id;

说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集部分;

内连接查询,示例sql:

mysql> SELECT student.id, student.name, score.course, score.grade FROM student INNER JOIN score ON student.id = score.sid;
+----+------+------------+-------+
| id | name | course     | grade |
+----+------+------------+-------+
|  1 | 李四 | 高数       |    90 |
|  2 | 张三 | 英语       |    92 |
|  3 | 王二 | 经济学基础 |    88 |
|  4 | 小花 | 高数       |    80 |
+----+------+------------+-------+
4 rows in set (0.00 sec)

mysql>

左连接查询 left join

left join是 left outer join的简写,它的全称是左外连接,是外连接中的一种。
语句:

SELECT * FROM a_table a left join b_table b ON a.a_id = b.b_id

说明:左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

示例sql:

mysql> SELECT student.id, student.name, score.course, score.grade FROM student LEFT JOIN score ON student.id = score.sid;
+----+------+------------+-------+
| id | name | course     | grade |
+----+------+------------+-------+
|  1 | 李四 | 高数       |    90 |
|  2 | 张三 | 英语       |    92 |
|  3 | 王二 | 经济学基础 |    88 |
|  4 | 小花 | 高数       |    80 |
+----+------+------------+-------+
4 rows in set (0.00 sec)

mysql> SELECT student.id, student.name, score.course, score.grade FROM student LEFT JOIN score ON student.name = score.name;
+----+------+------------+-------+
| id | name | course     | grade |
+----+------+------------+-------+
|  1 | 李四 | 高数       |    90 |
|  1 | 李四 | 英语       |    92 |
|  1 | 李四 | 经济学基础 |    88 |
|  2 | 张三 | 高数       |    80 |
|  2 | 张三 | 英语       |    85 |
|  2 | 张三 | 经济学基础 |    93 |
|  3 | 王二 | 高数       |    82 |
|  3 | 王二 | 英语       |    98 |
|  3 | 王二 | 经济学基础 |    80 |
|  4 | 小花 | NULL       |  NULL |
+----+------+------------+-------+
10 rows in set (0.00 sec)

mysql>
--THE END--

文章标题:MySQL数据库基础入门
本文作者:hiyo
本文链接:https://www.cnblogs.com/hiyong/p/14552753.html
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

posted @ 2021-03-17 23:07  测试开发小记  阅读(89)  评论(0编辑  收藏  举报