跳过正文
  1. Blogs/

MySQL基础

·4 分钟· loading · loading · · ·
Morethan
MySQL
Morethan
作者
Morethan
计算机、物理与AI理工男
目录
技术杂项 - 这篇文章属于一个选集。
§ 4: 本文
MySQL 安装部署流程 + 简明语法 CookBook + 学习笔记

信息源
#

  • SQL教程 - 廖雪峰的官方网站 非常非常亲民的 MySQL 教程网站,内置了一个网页版的数据库,方便新手同志们直观了解 MySQL数据库的操作,对于 SQL 的整个背景也有简洁但必要的表述。

安装 MySQL
#

安装 MySQL 最简单的方法就是通过 Docker Desktop 来操作;只需要两步就能够完成

命令行中运行:

docker pull mysql

初始化 SQL 并运行:

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -v /Users/liaoxuefeng/mysql-data:/var/lib/mysql mysql

参数解释:

参数 含义
-d 表示后台运行
--name 表示容器的名字,不输入 Docker 会自动选择一个名字
-p 3306:3306 表示把容器的端口 3306 映射到本机,这样可以在本机通过 3306 端口连接 MySQL
-e MYSQL_ROOT_PASSWORD=password 表示传入一个环境变量,作为root的口令,这里设置的口令是 password,不输入此项则会自动生成一个口令,需要查看日志才能知道口令,建议设置
-v /path:/var/lib/mysql 表示将本地目录映射到容器目录 /var/lib/mysql 作为 MySQL 数据库存放的位置,需要将 /path 改为你的电脑上的实际目录
mysql 告诉 Docker 你要运行的镜像的名称
使用 Docker 运行 MySQL 时,任何时候都可以删除 MySQL 容器并重新运行;如果删除了本地映射的目录,重新运行就相当于一个全新的 MySQL ;

MySQL 基础语法
#

查询
#

注释语法

-- 这是一条注释

基本查询语法

SELECT * FROM <表名>;

条件查询

SELECT * FROM <表名> WHERE <条件表达式>;

其中条件表达式内部还可以使用各种逻辑运算关键词,如:ANDNOTOR

投影查询

SELECT <1>, <2>, <3> FROM <表名>;
SELECT <1> 别名1, <2> 别名2, <3> 别名3 FROM <表名>;

排序

-- 按score从低到高:
SELECT id, name, gender, score FROM students ORDER BY score;

-- 按score从高到低:
SELECT id, name, gender, score FROM students ORDER BY score DESC;

-- 按score, gender排序:
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

-- 带WHERE条件的ORDER BY:
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;

分页查询

-- 查询第1页:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0; -- 从第0条记录开始查,往后查最多3条,也可以不足3条

聚合查询,利用 MySQL 中的聚合函数来查询:

-- 使用聚合查询, 查询记录的总条数:
SELECT COUNT(*) FROM students;

-- 使用聚合查询并设置结果集的列名为num:
SELECT COUNT(*) num FROM students;

-- 使用聚合查询并设置WHERE条件:
SELECT COUNT(*) boys FROM students WHERE gender = 'M';

虽然 COUNT(*) 的结果是一个标量,但是返回仍然是一个二维表格,只是表格只有一行一列
另外还有一些常用的聚合函数:MAX()MIN()AVG()SUM() 等,与 COUNT() 类似

分组聚合查询

-- 按class_id分组进行聚合查询, 类似于for循环:
SELECT COUNT(*) num FROM students GROUP BY class_id;
-- 注意这里没有选中class_id因此最后的结果表格没有id

-- 按class_id分组, 并显示class_id:
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;

-- 多个分组标准, 例如按class_id, gender分组:
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;

多表查询(笛卡尔查询):

-- FROM students, classes:
SELECT * FROM students, classes;

-- 设置别名,同名列通过.操作服进行区分:
SELECT
    students.id sid,
    students.name,
    students.gender,
    students.score,
    classes.id cid,
    classes.name cname
FROM students, classes;

-- 设置报个别名, 更清爽一点点:
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c;

多表查询的返回依然是一个二维数据表,但是这个数据表是通过笛卡尔积的形式组织的,因此也叫笛卡尔查询

连接查询,类似于多表查询,但是两个表之间的组织关系不是通过笛卡尔积进行,而是选取一个为主表,将附表的内容进行连接:

  • 内连接,只有一种,修饰语为 INNER
-- 选出所有学生,同时返回班级名称:
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
  • 外连接,有三种,修饰语为 RIGHTLEFTFULL
-- 使用RIGHT OUTER JOIN:
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;

理解方法:通过集合的方式来理解

-- 这里面tableA是主表, 也叫左表; tableB同理
SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;

JoinQuery.png

修改
#

  • 插入语法
-- 添加一条新记录:
INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);

-- 一次性添加多条新记录:
INSERT INTO students (class_id, name, gender, score) VALUES
  (1, '大宝', 'M', 87),
  (2, '二宝', 'M', 81),
  (3, '三宝', 'M', 83);
  • 更新
-- 更新id=1的记录:
UPDATE students SET name='大牛', score=66 WHERE id=1;

-- 更新score<80的记录:
UPDATE students SET score=score+10 WHERE score<80;

-- 更新id=999的记录, 没有匹配的记录所以什么都不会做:
UPDATE students SET score=100 WHERE id=999;

-- 不带WHERE语句的更新会作用在整张表上
UPDATE students SET score=60;
  • 删除
-- 删除id=1的记录:
DELETE FROM students WHERE id=1;

-- 不带WHERE的删除操作会作用于整张表
DELETE FROM students;
技术杂项 - 这篇文章属于一个选集。
§ 4: 本文

相关文章

Hugo博客搭建
·5 分钟· loading · loading
Morethan
Hugo 博客
Python小技巧
··4 分钟· loading · loading
Morethan
Python
本地 OverLeaf 部署
··4 分钟· loading · loading
Morethan
Overleaf LaTeX