1、工具准备
1.1mysql下载
mysql官网:MySQL
点击下载
下滑选择社区版
选择版本和想要的方式下载
我下的是压缩包哈哈,压缩包不用安装,下载后解压到指定位置然后就好了
配置环境变量
(win11)打开我的电脑->右键属性->选择高级系统设置
在系统变量里面创建一个新的变量MYSQL_HOME
变量名:MYSQL_HOME
变量值:MySQL的安装路径
然后在系统变量Path中加入刚刚我们写的变量值就是MySQL的安装路径
欧了咱们MySQL安装和配置完啦
用windows自带的输入框输入“服务”
服务启动成功会显示正在运行
1.2图形界面化工具
(直接上链接~~)
navicat12.1
链接:pan.baidu.com/s/1bE3agoa3…
提取码:aabb
sqlyog(貌似不是很兼容win11)
链接:pan.baidu.com/s/1ZtU-luDt…
提取码:ccss
dbeaver
链接:pan.baidu.com/s/1pKN_C8Xr…
提取码:63ee
(上面三个都是图形界面化工具,我用的是navicat主要是因为navicat图形界面好看哈哈,用着顺手)
打开就是这个样子
1.3链接数据库
创建成功后就会显示出来
(数据库链接就ok啦~)
2、数据库介绍
2.1数据库发展
(这给东东就了解一下就行)
人工管理阶段:结绳、甲骨文、纸(很难管理和查询)
文件系统阶段:就是像我们电脑上点文件夹和文件(还是不方便查询)
数据库阶段:有组织的数据集合(起飞,方便管理和查询)
数据库:计算机内有组织的数据集合,存储数据的地方
2.2数据库分类
关系型数据库RDMS:
数据之间的关系用数据表(表格)的形式展现,好查询
常见的关系型:
Oracle:大型项目数据库:银行干、电信
MySQL:web项目常用数据库
Microsoft SQL Server:微软自研数据库
SQLite:轻量级数据库,移动平台
非关系型NoSQl:
Redis:开源,可做数据库、缓存、消息中间件和列队(键值对)
Mongodb:面向文档开源数据库,以文档的形式存储数据
Hbase:大型数据库
2.3关系型数据库组成
数据行(一条记录)、数据列(字段)、数据表(结构+数据)、数据库(数据表的集合)
2.4SQL介绍
SQL:结构化查询语言,通过SQL语言对数据库进行操作
SQL语言分类:
DQL:数据查询语言,用于对数据进行查询,例如:select
DML:数据操作语言,对数据进行增加、修改、删除,例如:insert、update、delete
TPL:事务处理语言,对事务进行处理,例如:begin transaction、commit、rollback
DCL:数据控制语言,进行授权与权限回收,例如:grant、revoke
DDL:数据定义语言,进行数据库、表的管理等,例如:create、drop
CCL:指针控制语言,通过控制指针完成表的操作,例如:declare cursor
(滴滴大部分数据库都支持SQL语言操作,mysql不区分大小写喔)
2.5MySQL介绍
mysql特点:
1.可移植性
2.支持多系统
3.支持多编程语言(就是项目的编程语言可以和sql一起结合使用)
4.开源、社区免费
5.支持多线程
6.优化sql算法
7.多种数据库链接方式
8.支持多语言编码格式
(了解就行不用记,不知道也没得关系)
3、数据类型与约束
(宝子们,用工具创建表,对数据进行增删改查呀这些我就不说啦,这就跟操作excel表一样滴,我直接说用sql语句进行操作啦)
3.1常用数据类型
整型(int):就是整数,有符号有正有负,无符号只有正
字符串(varchar):一个或多个字符
小数(decimal):格式->decimal(5,2),表示总共5位数,其中有2位是小数,剩下三位整数
时间日期(datetime):2023-01-01 24:59:59
3.2数据约束
主键(primary key):物理上存储的顺序(就是让你查起来更方便)
非空(not null):此字段下的数据不能为空
唯一(unique):此字段下的数据不能重复
默认值(default):此字段下的数据如果没有填写就会默认显示默认值,如果写了就是写了的新的值
外键(foreign key):维护两个表之间的关系(一个表的外键就是另一个表中的主键)
4、SQL语句操作数据库和表
常用数据库操作命令:
(在这我们先准备创建一个数据库,准备几张表,插入数据为我们后面的学习做准备)
-- 创建一个数据库名为practice,字符集设置为utf8(代表支持中文输入不会乱码)
CREATE DATABASE practice CHARSET=utf8;
-- 使用这个数据库
USE practice;
-- 创建一个学生表
-- 注释的快捷键是ctrl+/
create table students(
uid int unsigned primary key auto_increment, -- 学生id,这个unsigned意思是不管正负,没必要加这个约束
uname VARCHAR(20),-- 学生姓名
uage INT(2),-- 学生年龄
ucalss VARCHAR(20)-- 学生班级
);
-- 创建一个学生分数表,有两个方法创建不要重复创建会报错(两个只是写法上的差异而已)
-- 方法1
create table score(
sid int unsigned primary key auto_increment,-- 成绩id
snum DECIMAL(5,2), -- 成绩
students_uid INT unsigned REFERENCES students(uid),-- 与学生id关联
course_cid int unsigned REFERENCES course(cid),-- 与课程id关联
FOREIGN KEY(students_uid,course_cid)-- 设置外键
);
-- 方法2
-- create table score(
-- sid int unsigned primary key auto_increment,
-- snum DECIMAL(5,2),
-- students_uid INT unsigned ,
-- course_cid int unsigned ,
-- FOREIGN KEY(students_uid) REFERENCES students(uid),
-- FOREIGN KEY(course_cid) REFERENCES course(cid)
-- );
-- 创建课程表
create table course(
cid int unsigned primary key auto_increment,-- 课程id
cname VARCHAR(20)-- 课程名
);
-- 学生表插入数据
INSERT INTO students VALUES
(0,'小王',18,'1班'),
(0,'小徐',20,'3班'),
(0,'小方',18,'3班'),
(0,'小陈',15,'2班'),
(0,'小李',19,'2班'),
(0,'小汪',19,'1班'),
(0,'小刘',21,'3班'),
(0,'小杜',18,'1班');
-- 成绩表插入数据
INSERT INTO score VALUES
(0,88.22,1,1),
(0,97.43,1,2),
(0,55.90,2,1),
(0,67.97,2,3),
(0,32.12,3,1),
(0,78,4,2),
(0,99.99,6,3),
(0,0,8,3);
-- 课程表插入数据
INSERT INTO course VALUES
(0,'语文'),
(0,'数学'),
(0,'英语');
执行完后会显示三个表打开表可以看到对应信息
(这是我把截图放在桌面上再截的,哈哈哈)
(有个点很重要,就是建议之后写查询语句练习的时候重新创建一个查询页面,因为你在新创建过表的页面写语句的话,不会有那个新表的提示,没提示写起来就很痛苦,别踩坑啦嘿嘿)
4.1操作数据库
查看所有数据库:show databases;
show databases;
使用数据库:use 数据库名称;
use 数据库名称;
如果忘记用use的话,每次操作的时候提前选中要操作的数据库
查询当前使用数据库:select database();
select database();
创建数据库:create database 数据库名 charset=utf8;
create database 数据库名 charset=utf8;
删除数据库:drop database 数据库名称;
drop database 数据库名;
4.2操作数据表
查看当前数据库所有的表:show tables;
show tables;
查看表结构:desc 表名;
desc 表名;
查看表的创建语句:
show create table 表名;
5、数据表操作
5.1创建数据表
create table 表名 (
字段名1 类型 约束,
字段名2 类型 约束,
…… …. ….
);
5.2删除数据表
drop 表名;
drop 表名;
drop if exists 表名;
drop if exists 表名;
(if exists 意思是如果存在这个表就进行删除,如果不存在就不进行操作)
6、数据库增删差
6.1简单查询
select * from 表名;
6.2插入数据
插入完整的一条数据
insert into 表名 values(…);
(我们在进行插入数据的时候通常情况下主键会设置自增长的约束(auto_increment),所以不需要特意自己去输入对应的值可以直接用0或者null代替滴)
插入指定字段的数据(这个字段有先后顺序的,比如说有4个字段,你不想输入第2个字段的值,输入就是字段1、字段3、字段4的顺序,哪个字段不输无所谓,顺序不变)
insert into 表名 (字段1, 字段2, …) value(值1, 值2, …);
插入多行数据
完整数据
insert into 表名 values (...), (...) ...;
指定字段数据
insert into 表名(字段名1,...) value(值1,...),(值1,...)...;
6.3修改数据
update 表名 set 字段名1=值1,字段名2=值2... where 条件;
(where是我们后面的条件查询)
6.4删除数据
delete from 表名 where 条件;
(dd,这里的删除是物理删除,工作中一般都是逻辑删除,意思是加一个字段,用这个字段的状态来表示这个这条数据有没有被删除,比如:is_delete字段来标识,1代表删除,0表示未删除)
其他删除方法(这个了解就好,我们测试一般没这个权限哇QAQ):
删除数据(保留表结构):
truncate table 表名;
drop删除表:
drop table 表名;
三种删除的区别:
delete:
1.delete可以通过where子句删除部分记录
- delete删除所有数据时,自增长字段不会从1开始
truncate:
truncate删除数据时,表结构保留,自增长字段从1开始,执行效率低于drop命令
drop:
删除效率高
7.数据查询操作(重要)
7.1查询基本语法
select 字段1,字段2,... from 表名;
·起别名 as(如果起的别名是字符串可以不用加引号滴,给表名起别名的时候as可以省略)
select 字段1 as 别名1,字段2 as 别名2,... from 表名 表别名;
·去重distinct(sql语句其实很神奇,把很多方法融化贯通,有时候需要解决一个sql查询需求的时候可能会楞1、2秒,哈哈哈哈哈因为查询方法太多啦一下子不知道用啥好喽哈哈哈哈哈)
select distinct 字段1,... from 表名;
7.2条件查询
条件查询:根据一定的条件查询数据的结果
select 字段1,字段2... from 表名 where 条件;
(条件查询通常和运算符一起使用)
7.2.1条件查询--比较运算符
等于:=
小于:<
大于:>
小于等于:<=
大于等于:>=
不等于:!=或者<>(!=方便理解,但是<>书写更方便)
举几个例子:
1.查询学号为3的学生姓名
select uname from students where uid=3;
2.查询学号大于3的学生姓名
select uname from students where uid>3;
3.查询学号不为3的学生信息
select * from students where uid<>3;
7.2.2条件查询--逻辑运算符
and:并且
or:或
not:非
1.查询1班年龄大于18岁的学生信息
SELECT * from students WHERE uage>18 and ucalss='1班';
2.查询1班或二班的学生信息
SELECT * from students WHERE ucalss='2班' or ucalss='1班';
3.查询不是1班的学生信息
SELECT * from students WHERE not ucalss='1班';
7.2.3模糊查询
关键字:like
%:匹配任意数量字符
_:匹配任意一个字符
1.查询年龄尾数是8的学生
SELECT * FROM students where uage LIKE '%8';
SELECT * FROM students where uage LIKE '_8';
7.2.3范围查询
in():一个非连续的范围
查询年龄是18或19的学生
SELECT * FROM students WHERE uage IN(18,19);
7.2.4空判断
is null:判断空
is not null:判断不为空
(注意喽,null和' '(空)是不样的)
SELECT * FROM students WHERE uage is not null;
7.3排序
select * from 表名 order by 字段名1 asc|desc,字段名2 asc|desc,...;
asc:从上往下越来越大,升序
desc:从上往下越来越小,降序
查询按年龄降序,如果年龄相同按学号降序的学生信息
SELECT * from students ORDER BY uage DESC,uid DESC;
7.4聚合函数
count():总记录条数
max():最大值
min():最小值
sum():求和
avg():平均数
(max()不能和其他字段一起查询,不能作为where条件,只能做having条件)
-- 查询总记录条数
SELECT count(*) FROM students;
-- 查询平均年龄
SELECT avg(uage) FROM students;
-- 最大年龄
SELECT max(uage) FROM students;
-- 最小年龄
SELECT min(uage) FROM students;
-- 年龄总和
SELECT sum(uage) FROM students;
7.5分组查询
select 字段1,字段2,聚合函数... from 表名 group by 字段1,字段2...;
(按照字段分组,同一组分数据显示在一起,同常和聚合函数一起用)
(这里涉及到一个非聚合列问题,mysql5.7.5版本以上非聚合列是抓取不了的,要用到ANY_VALUE() 函数把非聚合列给框起来,这里ucalss是非聚合列,很尴尬class单词打错了,俺现在才发现嘿嘿)
(非聚合列有兴趣的小伙伴可以去搜一下,他不是通过常规的方式索引)
查询每个班的平均年龄
SELECT avg(uage) FROM students GROUP BY ANY_VALUE(ucalss);
7.6分组后筛选--having
(where后面不能跟聚合函数,having可以)
select 字段1,字段2,聚合... from 表名 group by 字段1,字段2,字段3...having 条件;
-查询人数大于2的班级
SELECT ANY_VALUE(ucalss) FROM students
GROUP BY ANY_VALUE(ucalss) HAVING count(*)>2;
7.7分页--获取部分数据
select * from 表名 limit start,count
(获取一部分数据或者分页,从start开始,获取count条数据)
获取前三行学生信息
select * from students limit 0,3;
select * from students limit 3;
分页:
select * from students limit (n-1)*m, m
n:显示第几页数据
m:每页显示多少条数据
7.8链接查询
内链接(inner join):两个表通过相同字段匹配的数据的交集
外连接⬇
左连接(left join):两个表通过相同字段匹配的数据,左表显示全部,右表没有的数据用null填充
有链接(right join):两个表通过相同字段匹配的数据,右表显示全部,左表没有的数据用null填充
内连接:
select * from 表1,表2 where 表1.列=表2.列
将学生表和成绩表连在一起,成绩表(子表)的外键和学生表(主表)的主键关联
SELECT * FROM students stu
INNER JOIN score sco ON stu.uid=sco.students_uid;
左连接:
SELECT * FROM students stu
LEFT JOIN score sco ON stu.uid=sco.students_uid
右链接:(两个表的书写顺序换了一下罢了)
SELECT * FROM score sco
right JOIN students stu ON stu.uid=sco.students_uid
三个表连在一起
SELECT * FROM students stu
LEFT JOIN score sco ON stu.uid=sco.students_uid
LEFT JOIN course cou ON sco.course_cid=cou.cid;
(宝子们注意啦,有个点非常重要,就是不管几个表关联,怎么关联,关联之后可以把关联后的查询结果当成一个表,’坨‘的思想,我们可以对这个结果用之前学的查询方法进行查询)
sql最基础的格式:
select 字段 from 表1
inner join 表2 on 表1,关联字段=表2.关联字段
...
inner ....
where 条件
group by 分组条件1,分组条件2
having 条件
order by 字段1 排序,字段2 排序
limit 显示条数;
7.9自关联
(宝子们,自关联其实就是内/外关联,只不过是自己和自己关联,意思就是一个表他有两个相同字段,这里要明白一个概念,就是关联一段的意义对应)
(当你发现一个表有两个字段数据对应,且有一个字段存在包含关系就可以用子关联)
自关联数据:
-- 创建表
drop table if exists areas;
create table areas(aid int primary key, atitle varchar(20),pid int);
-- 插入数据
insert into areas values ('130000', '河北省', NULL), ('130100', '石家庄市', '130000'),
('130400', '邯郸市', '130000'), ('130600', '保定市', '130000'),('130700', '张家口市', '130000'),
('130800', '承德市', '130000'),('410000', '河南省', NULL), ('410100', '郑州市', '410000'),
('410300', '洛阳市', '410000'),('410500', '安阳市', '410000'),('410700', '新乡市', '410000'),
('410800', '焦作市', '410000'),('410101', '中原区', '410100'),('410102', '二七区', '410100'),
('410301', '洛龙区', '410300');
查询河南省有多少个市:
7.10子查询
(这个就是’坨‘的思想,把一个select语句的查询结果看成一坨)
这个结果(这一坨)可以是一个值,一个范围,一个表嘿嘿(可以是同一个表的select,也可以是不同表的select)
这一坨是一个值(标量子查询):
查询小徐的成绩
SELECT sco.snum FROM score sco
where sco.students_uid=(
SELECT stu.uid from students stu
where stu.uname='小徐'
);
这一坨是多个值(行子查询):
查询和小王一个班且同龄的学生
SELECT * FROM students
where (ucalss,uage)=(
SELECT ucalss,uage FROM students
where uname='小王'
);
这一坨是个范围(列自查寻):
查询年龄18的学生成绩
这一坨是个表(充当数据源):
(这个就是把select查询学出来的结果和另一个表关联,然后进行查询操作,挺简单的,就偷懒不敲啦哈哈哈哈哈哈)