这里写目录标题
1.数据库,到底是什么?
数据库是一个软件(一类软件) 这一类软件功能就是"管理数据",实现数据库软件的内部,会广泛的使用到各种数据结构
重点掌握:
1.内存和外存的区别:
1.内存的存储空间较小(8G,16G)外存的存储空间较大(512G,1T)
2.内存的访问速度快,外存的访问速度慢(大概要差3-4个数量级)
ps :特指的是机械键盘.受限于机械硬盘的物理结构,机械硬盘的存储速度,已经快10年没有发展了
SSD固态硬盘,访问速度很快,比机械硬盘快很多,最好的固态硬盘,快赶上垃圾的内存了
3.内存成本高,外存成本低
4.内存中的数据,断电后会消失.外存中的数据,断电还在.
2.基本操作
1.创建数据库
-- 语法
create database 数据库名;
-- 创建一个班级库
create database class;
2.查看创建好的数据库
-- 语法
show databases;
3.使用数据库
-- 语法
use 数据库名;
use class;
4.创建表
-- 语法
create table 表名;
-- 创建一个学生表
create table student;
5.查看创建的数据表
-- 语法
show tables;
6.查看数据表结构
--语法
desc 表名;
desc student;
7.删除数据表
-- 语法
drop table 数据表名;
drop table student;
8.删除数据库
-- 语法
drop database 数据库名;
drop database java102;
ps:删库属于危险操作,一定要慎用,慎用,慎用,删除了错了就真的"从删库到跑路".
2.进阶操作(CRUD)
1.增
-- 语法
-- 一次增加一个
insert into 表名 values(值1,值2,值3...);
-- 一次增加多个
insert into 表名 values(值1,值2,值3...),(值1,值2,值3...)...;
insert into student values(1,'张三',19,90);
insert into student values(1,'李四',19,80);
insert into student values(1,'王五',19,70),(3,'赵六',19,99);
ps:一次插入多条要比多次插入多条速度要快很多
2.查
语法:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
案例:
-- 创建考试成绩表
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);
2.1全列查找
-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。(索引待后面课程讲解)
SELECT * FROM exam_result;
ps:把一个表里面的所有的行和列都查到,查找的结果是一个临时表,之前说的数据库的表多是在硬盘上的,而此处这个查询结果临时表,不是在硬盘上,而是在内存中,随着进行了输出之后,数据也就被释放了.
ps2:select*from表名这个操作也是一个危险操作
如果直接在生产环境的服务器上,执行select*from表名,很可能带来灾难,生产环境保存的数据量可能是非常大的,几个TB级别的.此时就意味着mysql服务器就会疯狂的来读取硬盘数据,瞬间就会把硬盘的IO带宽吃满,硬盘的读取速度是有上限的,尤其是机械硬盘,同时mysql服务器又会立即返回数据,由于返回响应数据也很大,也会把网卡带宽吃满.一旦服务器的硬盘和网络被吃满,此时数据库服务器就难以对其他客户端的请求做出响应.
3.2指定列查找
-- 指定列的顺序不需要按定义表的顺序来
select id,name,english from exam_result;
3.3查询字段为表达式
-- 表达式不包含字段
select id,name,10 from exam_result;
-- 表达式包含一个字段
select id,name,english+10 from exam_result;
-- 表达式包含多个字段
select id,name,chinese+math+english from exam_result;
3.4别名
-- 结果集中,表头的列名=别名
select id,name,chinese +math+english 总分 from exam_result;
3.5去重
select distinct math from exam_result;
3.6排序
-- asc 为升序(从小到大)
-- desc 为降序(从大到小)
-- 默认为 asc
1.没有order by子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
2.NULL数据排序,视为比任何值小,升序出现在最上面,降序出现在最下面
-- 查询同学姓名和qq_mail,按qq_mail排序显示
select name,qq_mail from student order by qq_mail;
select name,qq_mail from student order by qq_mail desc;
3.使用表达式及别名排序
-- 查询同学及总分,由高到低
select name,chinese+math+english from exam_result order by chinese+math+english desc;
select name,chinese+math+english 总分 from exam_result order by 总分 desc;
ps:临时表中的结果是数据类型不一定和原始数据类型完全一致,临时表的数据类型自动会适应,保证结果的正确
4.可以多个字段进行排序,排序顺序优先级随书写顺序
-- 查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
select name,math,english,chinese from exam_result order by math desc, chinese,english;
3.7条件查询
注:
1.where条件可以使用表达式,但不能使用别名
2.and的优先级高于or,在同时使用时,需要使用小括号()包裹优先执行部分
案例
-
基本查询
-- 查询英语不及格的同学即英语成绩(<60) select name,english from exam_result where english <60; +--------+---------+ | name | english | +--------+---------+ | 唐三藏 | 56.0 | | 刘玄德 | 45.0 | | 宋公明 | 30.0 | +--------+---------+ -- 查询语文成绩好于英语成绩的同学; select name from exam_result where chinese>english; select name,chinese,english from exam_result where chinese>english; +--------+---------+---------+ | name | chinese | english | +--------+---------+---------+ | 唐三藏 | 67.0 | 56.0 | | 孙悟空 | 87.5 | 77.0 | | 曹孟德 | 82.0 | 67.0 | | 刘玄德 | 55.5 | 45.0 | | 宋公明 | 75.0 | 30.0 | +--------+---------+---------+ -- 查询总分在200分以下的同学 select name,chinese+math+english 总分 from exam_result where math+chinese+english<200; +--------+-------+ | name | 总分 | +--------+-------+ | 刘玄德 | 185.5 | | 宋公明 | 170.0 | +--------+-------+
-
AND于OR
-- 查询语文成绩大于80分,且英语成绩大于80分的同学 select * from exam_result where chinese > 80 and english > 80; +------+--------+---------+------+---------+ | id | name | chinese | math | english | +------+--------+---------+------+---------+ | 3 | 猪悟能 | 88.0 | 98.5 | 90.0 | +------+--------+---------+------+---------+ -- 查询语文成绩大于80分,或英语成绩大于80分的同学 select name,chinese,english from exam_result where chinese > 80 or english > 80; +--------+---------+---------+ | name | chinese | english | +--------+---------+---------+ | 孙悟空 | 87.5 | 77.0 | | 猪悟能 | 88.0 | 90.0 | | 曹孟德 | 82.0 | 67.0 | +--------+---------+---------+ -- 观察and和or的优先级: select *from exam_result where chinese >80 or math>70 and english > 70; +------+--------+---------+------+---------+ | id | name | chinese | math | english | +------+--------+---------+------+---------+ | 2 | 孙悟空 | 87.5 | 78.0 | 77.0 | | 3 | 猪悟能 | 88.0 | 98.5 | 90.0 | | 4 | 曹孟德 | 82.0 | 84.0 | 67.0 | | 6 | 孙权 | 70.0 | 73.0 | 78.5 | +------+--------+---------+------+---------+ select *from exam_result where (chinese >80 or math >70) and english >70; +------+--------+---------+------+---------+ | id | name | chinese | math | english | +------+--------+---------+------+---------+ | 2 | 孙悟空 | 87.5 | 78.0 | 77.0 | | 3 | 猪悟能 | 88.0 | 98.5 | 90.0 | | 6 | 孙权 | 70.0 | 73.0 | 78.5 | +------+--------+---------+------+---------+
-
范围查找
1.between…and…
-- 查询语文成绩[80,90]分同学及语文成绩 select name,chinese from exam_result where chinese between 80 and 90; +--------+---------+ | name | chinese | +--------+---------+ | 孙悟空 | 87.5 | | 猪悟能 | 88.0 | | 曹孟德 | 82.0 | +--------+---------+
2.in
-- 查询数学成绩是58或者59或者98或者99分的同学及数据成绩 select name,math from exam_result where math in(58,59,98,99); +--------+------+ | name | math | +--------+------+ | 唐三藏 | 98.0 | +--------+------+
-
模糊查询like
-- %匹配任意多个(包括0个)字符 select name from exam_result where name like '孙%'; +--------+ | name | +--------+ | 孙悟空 | | 孙权 | +--------+ -- _匹配严格的一个任意字符 select name from exam_result where name like '孙_'; +------+ | name | +------+ | 孙权 | +------+ select name from exam_result where name like '_三_'; +--------+ | name | +--------+ | 唐三藏 | +--------+
-
null的查询:is null
-- 查询qq_mail已知(不为空)的同学姓名 select name,qq_mail from student where qq_mail is not null; +------+---------+ | name | qq_mail | +------+---------+ | 李四 | 23293 | | 王五 | 237987 | +------+---------+ -- 查询qq_mail未知(为空)的同学姓名 select name,qq_mail from student where qq_mail is null; +------+---------+ | name | qq_mail | +------+---------+ | 张三 | NULL | +------+---------+
3.8分页查询:limit
语法:
-- 起始下标为 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;
案例:按id进行分页,每页3条记录,分别显示第1,2,3页
-- 第1页
select *from exam_result order by id limit 3; -- ==limit id 3 offset 0;
+------+--------+---------+------+---------+
| id | name | chinese | math | english |
+------+--------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
+------+--------+---------+------+---------+
-- 第2页
select *from exam_result order by id limit 3 offset 3;
+------+--------+---------+------+---------+
| id | name | chinese | math | english |
+------+--------+---------+------+---------+
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
+------+--------+---------+------+---------+
-- 第3页
select *from exam_result order by id limit 3 offset 6;
+------+--------+---------+------+---------+
| id | name | chinese | math | english |
+------+--------+---------+------+---------+
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 8 | 张无忌 | NULL | NULL | NULL |
+------+--------+---------+------+---------+
4.修改(Update)
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
案例:
-- 将孙悟空同学的数学成绩变更为80分
update exam_result set math = 80 where name = '孙悟空';
+------+--------+---------+------+---------+
| id | name | chinese | math | english |
+------+--------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 80.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 8 | 张无忌 | NULL | NULL | NULL |
+------+--------+---------+------+---------+
-- 将曹孟德同学的数学成绩变更为60分,语文成绩变更为70分
update exam_result set math = 60 ,chinese = 70 where name='曹孟德';
-- 将总成绩的倒数前3位的同学语文成绩加上10分;
update exam_result set chinese=chinese+10 order by math+chinese+english limit 3 ;
5.删除(delete)
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
案例
-- 删除孙悟空同学的考试成绩
delete from exam_reult where name='孙悟空';
+------+--------+---------+------+---------+
| id | name | chinese | math | english |
+------+--------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 65.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 85.0 | 65.0 | 30.0 |
| 8 | 张无忌 | NULL | NULL | NULL |
+------+--------+---------+------+---------+
-- 删除整张表数据
-- 准备测试表
drop table if exists for_delete;
create table for_delete(
id int,
name varchar(20)
);
-- 插入测试数据
insert into for_delete(name)values('A'),('b'),('C');
-- 删除整张表数据
学习数据库在于多练