赞
踩
目录
经过前面一段时间数据结构基础的学习,现在我们终于来到了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分别代表有效长度和小数点后最大长度
接下来我们看到表结构所代表的含义:
前面铺垫了那么久,我们终于可以进入正片了,接下来我们看到关于表的增删查改操作。
在向表中插入数据之前我们先创建一张表
注意:如果我们创建表时变量名使用了sql中的关键字,那么我们需要用反引号`来把他引起来
- -- 创建一张学生表
- 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 = '孙悟空';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。