目录
1.前言
2.铺垫
3.正片
经过前面一段时间数据结构基础的学习,现在我们终于来到了MySQL的学习。我们先简单介绍一下什么是数据库。
为了解决海量文件的存储与管理问题,专家们设计出更加利于管理数据的软件——数据库,它能更有效的管理数据。数据 库可以提供远程服务,即通过远程连接来使用数据库,因此也称为数据库服务器。
数据库大体可以分为关系型数据库和非关系型数据库 。
而本次我们要学习的MySQL属于是关系型数据库。
关系型数据库是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就是二维表格模型,而一个 关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
当然这里我们已经默认大家配置好了MySQL的环境了,如果大家对于该部分还有别的疑问,还请自行查阅网上资料解决。(其实是我懒不想写了)
在正式进入我们增删查改的操作之前,我们先了解一下数据库的基本结构。
我们可以看到我们每个数据库之间是相对独立的,并且每个数据库之间又有若干个数据表。
所以我们接下来我们看到有关数据库的一些基本操作:
-- 显示当前数据库
show databases;
-- 创建数据库
create database xxx;
-- 使用
use xxx;
-- 删除数据库(危险操作)
drop database xxx;
首先我们注意到的是“-- “这个其实就是我们MySQL中的注释的意思,别忘了--后面的空格
然后可能会有细心的读者注意到好像网上一些MySQL教程好像用的都是大写字母,这里给大家说明一下,在MySQL中我们大小写均可以
其次当我们需要操作某个数据库的表时,我们要先对其进行use操作。
之后我们看到有关表的相关操作:
-- 查看当前数据库的所有表
show tables;
-- 查看表结构
desc 表名;
-- 创建表
create table 表名(
field1 datatype,
field2 datatype,
field3 datatype
);
-- 删除表(危险操作)
drop table 表名;
其中当我们创建表时格式是 类型名+数据类型,和我们以往接触的编程语言不太相同。
既然提到了数据类型,那我们接下来看到在MySQL中常用数据类型:
INT:整型
DECIMAL(M, D):浮点数类型(更加精确)
FLOAT(M,D): 浮点数类型
VARCHAR(SIZE):字符串类型
TIMESTAMP:日期类型
其中varchar是一个可变长度字符串数组,size参数代表了最长字符长度,decimal以及float的参数M和D分别代表有效长度和小数点后最大长度
接下来我们看到表结构所代表的含义:
前面铺垫了那么久,我们终于可以进入正片了,接下来我们看到关于表的增删查改操作。
在向表中插入数据之前我们先创建一张表
-- 创建一张学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT,
sn INT,
name VARCHAR(20),
qq_mail VARCHAR(20)
);
-- 插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
insert into student values (100, 10000, '唐三藏', NULL);
insert into student values (101, 10001, '孙悟空', '11111');
其格式为 insert into 表名 values(数据1,数据2,数据3,数据4) ;
-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致
insert into student (id, sn, name) values
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');
其格式为 insert into 表名(变量1名字,变量2名字,变量3名字)vs
(变量1,变量2,变量3),
(变量1,变量2,变量3);
同样在查询前我们先创建一张表
-- 创建考试成绩表
DROP TABLE IF EXISTS exam_result;
CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);
-- 插入测试数据
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98.5, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。
SELECT * FROM exam_result;
顾名思义他会返回表中的全部数据,但是这个操作在面对大量数据时可能会导致服务器直接死机
注意:我们这里实际上只是从服务器返回了一张虚拟的表到客户端上,并没有对实际的服务器端上的数据进行操作,接下来的操作无特殊说明均是如此
-- 指定列的顺序不需要按定义表的顺序来
SELECT id, name, english FROM exam_result;
格式为select 查询列1,查询列2,查询列3 from 表名;
-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result;
我们查询的结果就是表达式的运算结果,但是要注意表达式左右两边必须是相同类型的数据类型
比如我们执行上面第三个表达式就会得到以下结果。
注意:
1.此时原表的数据依旧不会被改变
2.运算得出的数据会尽可能显示出来,不受原来数据类型的限制
当然我们发现查询得到的列名字也变成了我们的表达式,但是我们可以使用as来为其指定别名
SELECT id, name, chinese + math + english as total FROM exam_result;
比如像上面这样,当然as可以省略(不推荐)。得到的结果如下图。
有时我们发现数据库中存在一些重复数据,我们如何筛选出那些不重复的数据呢?这时我们需要用到DISTINCT这个关键字。
SELECT DISTINCT math FROM exam_result;
比如我们要对数学成绩去重就是以上SQL语句。
其格式为 select distinct 查询列1,查询列2 from 表名;
只有当所有查询列的信息都相同时数据才会被去重
语法:
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
1. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
2. NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面
比如我们对之前创建的表格执行以下语句可以得到:
select name,chinese+math+english as total from exam_result order by total asc;
当然它也可以对多个字段进行排序,排序优先级随书写顺序
-- 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese;
顾名思义在我们数据库查询的过程中可以对查询的数据进行限制,只有满足条件的数据才会被筛选出来显示。我们会用到关键字where,这个类似于我们其他语言的if语句
在此之前我们先了解一下MySQL的比较运算符:
逻辑运算符:
注意:
1. WHERE条件可以使用表达式,但不能使用别名。
2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
3.MySQL中 ”=“就是等于的意思,这点和其他语言有所不同
4.SQL默认情况下对WHERE XX!=NULL和WHERE XX=NULL的判断会永远返回0,却不会提示语法错误。所以我们需要使用”<=>“来或者 is null来判断是否为null。
下面我们简单看一下几个例子:
-- 查询英语不及格的同学及英语成绩 ( < 60 )
SELECT name, english FROM exam_result WHERE english < 60;
-- 查询语文成绩好于英语成绩的同学
SELECT name, chinese, english FROM exam_result WHERE chinese > english;
-- 查询总分在 200 分以下的同学
SELECT name, chinese + math + english 总分 FROM exam_result
WHERE chinese + math + english < 200;
当然我们需要注意一下like在执行模糊查询时:
-- % 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE '孙%';-- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';-- 匹配到孙权
类似于我们平时使用搜索引擎时的翻页,我们在MySQL进行查询时也可以指定查询的条目数量,其语法格式如下:
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
主要有limit和offset两个关键字,其中limit决定查询数目上限,offest决定从何处开始查询
顾名思义就是修改表中的数据,该操作会对实际的数据库产生影响。其语法如下:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
这样看可能会比较抽象,我们结合实例来看,还是之前创建的成绩表。
-- 将孙悟空同学的数学成绩变更为 80 分
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT
3;
-- 将所有同学的语文成绩更新为原来的 2 倍
UPDATE exam_result SET chinese = chinese * 2;
其实修改的语法并不难,主要要将我们之前学的比较运算符和逻辑控制符灵活运用即可 。
WRRNING:该操作相比删库更加危险,不要随意在生产环境中执行!
其语法如下:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
比如我们要删除一名同学的成绩:
-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = '孙悟空';