一、数据库(DataBase)概述
概念和作用:数据库是用来存储和管理数据的系统
数据库分类:
- 关系型数据库(SQL):必须遵循SQL规范,强调以二维表格的形式存储数据
举例:MySQL ORACLE DB2 - 非关系型数据库(NoSQL):NoSQL不仅仅是SQL,强调以key—value形式存储数据
举例:HBase Redis MongoDB
二 、MySQL数据库连接
1、命令连接
winter+r 输入cmd打开命令行
登录:
方式1:mysql -u用户名 -p密码
方式2:mysql -u用户名 -p 回车后再输入密码
方式3:mysql -h主机地址 -p回车后再输入密码
注意:localhost默认代表本地主机,或者127.0.0.1也代表本机
登出:
方式1:exit
方式2:quit
方式3:\q
注意:在mac/linux中使用ctrl+d/ctrl+c也能退出
查看ip地址
Windows:ipconfig
mac/linux:ifconfig
2.开发工具连接(这里使用PyCharm连接数据库)
PS:关联驱动
三、SQL规范
1.SQL简介
SQL:结构化查询语言,是所有关系型数据库都要遵循的规范
2.SQL分类
- DDL:数据定义语言
作用:用来定义数据库对象:数据库,表,列/字段等
关键字:create,drop,alter等 - DML:数据操作语言
作用:用来对数据库中表的记录进行更新
关键字:insert,delete,update等 - DQL:数据查询语言
作用:用来查询数据库中表的记录
关键字:select,from,where等 - DCL:数据控制语言
作用:用来定义数据库的访问权限和安全级别,以及创建用户
3.DDL数据定义语言
3.1库的增删改查
- #一.数据库的增删改查
- #1.创建数据库:
- create database db1;
- #if not exists:如果库不存在就创建,存在就忽略
- create database db2;
- create database IF NOT EXISTS db2;#存在忽略
- create database IF NOT EXISTS db3;#不存在就创建
- #character set utf8: 设置编码为utf8(mysql大多数版本已经都默认utf8)
- create database db3 character set utf8;
- #2.删除数据库
- drop database db1;
- #if exists:如果库存在就删除,不存在就忽略
- drop database if exists db1;
- #3.切换数据库
- use db2;
- use db3;
- #4.1查看所有库:
- show databases;
- #4.2查看当前库:
- select database();
- #4.3查看建库语句:
- show create database db1;
复制代码
3.2数据类型
字符串类型:varchar(字符长度)
整型类型:int 注意:默认长度是11,如果int不够用就用bigint
浮点类型:float(Python默认)或者double(Java默认) decimal(默认有效位数是10,小数后位位是0)
日期时间:date datetime year
3.3数据库中表的增删改查操作
创建表:
create table [if not exists] 表名
(
字段1名 字段1类型 [字段1约束],
字段2名 字段2类型 [字段2约束],
字段3名 字段3类型 [字段3约束]
);
删除表:
drop table [if exists] 表名;
修改表名:
rename table 旧表名 to 新表名;
注意:修改表中字段本质都是修改表
查看所有表:
show tables;
查看指定表的建表语句:
show create table 表名;
- #创建day01_db数据库
- create database day01_db;
- #使用day01_db库
- use day01_db;
- #操作表的前提:先创建库,并使用它
- #需求:创建学生表,用于存储学生的姓名,年龄,身高,生日信息
- create table student(
- id int,
- name varchar(100),
- age int,
- height float,
- birthday date
- );
- create table test1(
- id int
- );
- creat table if not exists test1(
- id int
- );
- #删除表
- drop table [if exists] test1;
- #修改表名
- rename table student to stu;
- #查看所有表
- show tables;
- #查看建表语句
- show create table stu;
复制代码
3.4表中字段的增删改
注意:操作字段本质就是在修改表
添加字段:
alter table 表名 add [column] 字段名 字段类型 [字段约束];
删除字段:
alter table 表名 drop 字段名;
修改字段名和字段类型:
alter table 表名 change 旧字段名 新字段名 字段类型 [字段约束];
modify只修改字段类型:
alter table 表名 modify 字段名 字段类型 [字段约束];
查看字段信息:
desc 表名;
- #添加字段
- alter table stu add weight double;
- #注意:如果字段名是关键字,需要用反引号引起来
- alter table stu add `desc` varchar(100);
- #删除字段
- alter table stu drop weight;
- alter table stu drop `decs`;
- #修改字段
- alter table stu change birthday bir datetime;#修改字段名
- alter table stu change birthday birthday date;#修改字段类型
- #modify:只能修改字段类型
- alter table stu modify height double;
- #查看字段信息
- desc stu;
复制代码
4.DML数据操作语言
4.1表中记录操作
插入数据记录:
insert into 表名(字段名...) values (具体值...) , (具体值...);
注意1:具体值要和前面的字段名以及顺序一一对应上
注意2:如果要插入的是所有字段,那么字段名可以省略
注意3:如果要插入多条记录,values后多条数据用逗号(,)分隔
修改数据记录:
update 表名 set 字段名=值 [where 条件];
注意:如果没有加条件就是修改对应字段的所有数据
删除数据记录:
delete from 表名 [where 条件];
注意:如果没有加条件就是删除所有数据
清空所有数据:
方式1:delete from 表名;
方式2:truncate [table] 表名; #能清除主键自增
- /*
- 操作库的前提:先启动mysql服务,并连接它
- 操作表的前提:先有库,并使用它
- 操作数据的前提:先有表,并有对应字段
- */
- #创建库
- create database test2;
- #使用库
- use test2;
- #创建表
- create table student(
- id int,
- name varchar(100),
- age int
- );
- #插入数据
- #指定字段插入一条数据
- insert into student (name) values ('顾清寒');
- #指定字段插入多条数据
- insert into student (name) values ('宁红夜'),('沈妙'),('迦南');
- #注意:不指定字段本质代表指定所有字段
- #不指定字段插入多条数据
- insert into student values (1,'顾清寒',20),(2,'宁红夜',21),(3,'沈妙',20);
- #修改数据
- #修改顾清寒年龄为21
- update student set age = 21 where name = '顾清寒';
- #修改宁红夜和沈妙的年龄为23
- update student set age=23 where name = '宁红夜' or name = '沈妙';
- #注意:如果没有加条件,修改的是所有数据
- update student set age = 23;# 报黄警告!然后弹窗警告,如果非要执行选择execute
- #删除数据
- #删除id为1的记录
- delete from student where id = 1;
- #删除id为1,以及id为3的记录
- delete from student where id = 2 or id = 3;
- #注意:如果不加条件删除的就是所有数据
- delete from student;# 报黄警告!然后弹窗警告,如果非要执行,选择execute
复制代码
5.表中约束
约束作用:限制数据的插入和删除
主键约束:primary key 特点:修饰列对应的值非空唯一
主键自增:auto_increment 特点:修饰主键对应的值不指定主键字段或者用0和null占位代表自动使用自增
非空约束:not null 特点:修饰列对应的值不能为空
唯一约束:unique 特点:修饰列对应的值不能重复
默认约束:default 特点:修饰列对应的值提前设置默认值
6.DQL数据查询语言——单表查询
数据准备
# 创建数据库
CREATE DATABASE IF NOT EXISTS day02_db CHARSET=utf8;
# 使用数据库
USE day02_db;
# 建测试表
drop table if EXISTS products;
CREATE TABLE IF NOT EXISTS products
(
id INT PRIMARY KEY AUTO_INCREMENT, -- 商品ID
name VARCHAR(24) NOT NULL, -- 商品名称
price DECIMAL(10, 2) NOT NULL, -- 商品价格
score DECIMAL(5, 2), -- 商品评分,可以为空
is_self VARCHAR(8), -- 是否自营
category_id INT -- 商品类别ID
);
drop table if EXISTS category;
CREATE TABLE IF NOT EXISTS category
(
id INT PRIMARY KEY AUTO_INCREMENT, -- 商品类别ID
name VARCHAR(24) NOT NULL -- 类别名称
);
# 插入数据
# 添加测试数据
INSERT INTO category
VALUES (1, '手机'),
(2, '电脑'),
(3, '美妆'),
(4, '家居');
INSERT INTO products
VALUES (1, '华为Mate50', 5499.00, 9.70, '自营', 1),
(2, '荣耀80', 2399.00, 9.50, '自营', 1),
(3, '荣耀80', 2199.00, 9.30, '非自营', 1),
(4, '红米note 11', 999.00, 9.00, '非自营', 1),
(5, '联想小新14', 4199.00, 9.20, '自营', 2),
(6, '惠普战66', 4499.90, 9.30, '自营', 2),
(7, '苹果Air13', 6198.00, 9.10, '非自营', 2),
(8, '华为MateBook14', 5599.00, 9.30, '非自营', 2),
(9, '兰蔻小黑瓶', 1100.00, 9.60, '自营', 3),
(10, '雅诗兰黛粉底液', 920.00, 9.40, '自营', 3),
(11, '阿玛尼红管405', 350.00, NULL, '非自营', 3),
(12, '迪奥996', 330.00, 9.70, '非自营', 3);
6.1基础查询
基础查询关键字:select:查什么 from:从哪儿查
基础查询格式:
select [distinct] 字段名 | * from 表名;
[]:可以省略
|:或者
*:对应表的所有字段名
distinct:去除重复
as:可以给表或者字段起别名
- -- 需求1:查看所有商品
- select * from products;
- -- 需求2:查看所有商品的名称和价格
- select name,price from products;
- -- 需求3:看所有商品的名称和价格,要求给字段名起别名展示
- select name n,price p from products;
- -- 需求4:查看所有商品的名称和价格,要求给表名起别名并使用
- select p2.name,p2.price from products as p2;
- -- 如果给表起了表名,必须用别名调用字段
- --需求5:查看所有的分类编号,要求去重展示
- select distinct category_id from products;
复制代码
6.2条件查询
条件查询关键字:where
条件查询基础格式:
select 字段名 from 表名 where 条件;
比较运算符:> < >= <= != <>
逻辑运算符:and or not
范围 查询:连续范围:between x and y
非连续范围:in(x,y)
模糊 查询:关键字:like %:0个或者多个字符 _:一个字符
非空 判断:为空:is null 不为空:is not null
6.2.1比较查询
- #1.比较运算符:> < >= <= != <>
- -- 需求1:查询所有'自营'的商品
- select * from products where is_self = '自营';
- -- 需求2:查询评分在'9.50'(不含)以上的商品
- select * from products where score > 9.50;
- -- 需求3:查询评分在'9.50'(含)以上的商品
- select * from products where score >= 9.50;
- -- 需求4:查询价格在999(不含)以下的商品
- select * from products where price < 999;
- -- 需求5:查询价格在999(含)以下的商品
- select * from products where price <= 999;
- -- 需求6:查询评分不等于9.30的商品
- select * from products where price != 9.30;
复制代码
6.2.2逻辑查询
- -- and:并且 or:或者 not:取反
- -- 需求1:询自营商品中所有价格大于2000的商品信息
- select * from products where price > 2000 and is_self = '自营';
- -- 需求2:查询商品评分在9.0(含)-9.5(含)之间的商品信息
- select * from products where score >= 9 and score <= 9.5;
- -- 需求3:查询商品价格在1000(含)到3000(含)之间的商品信息
- select * from products where price >= 1000 and price <= 3000;
- -- 需求4:查询价格是999或者2199或者2399的商品
- select * from products where price=999 or price=2199 or price=2399;
- -- 需求5:查询商品是'华为Mate50'或者'荣耀80'的商品
- select * from products where name='华为Mate50' or name='荣耀80';
- -- 需求6:查询商品不是自营的商品
- select * from products where not is_self = '自营';
- -- 需求7:查询商品不在1000到3000之间的商品
- select * from products where not (price >= 1000 and price <= 3000);
复制代码
6.2.3范围查询
- -- 需求1:查询商品价格在1000(含)到3000(含)之间的商品信息
- select * from products where price between 1000 and 3000;
- -- 需求2:查询商品不在1000到3000之间的商品
- select * from products where price not between 1000 and 3000;
- -- 需求3:查询价格是999或者2199或者2399的商品
- select * from products where price in (999,2199,2399);
- -- 需求4:查询商品是'华为Mate50'或者'荣耀80'的商品
- select * from products where name in ('华为Mate50','荣耀80');
复制代码
6.2.4模糊查询
- -- 关键字:like 符号 %:任意多个字符 _:任意1个字符
- -- 需求1:查询商品名称以'华'开头的商品信息
- select * from products where name like '华%';
- -- 需求2:查询商品名称以'华'开头并且8个字符的商品信息
- select * from products where name like '华_______';
- -- 需求3:查询商品名称以'66'结尾商品信息
- select * from products where name like '%66';
- -- 需求4:查询商品名称中包含'兰'字的商品信息
- select * from products where name '%兰%';
- -- 需求5:查询商品名称中第3个字是'兰'字的商品信息
- select * from products where name '__兰%';
复制代码
6.2.5非空判断
- /*
- null在sql中代表空的,没有任何意义的意思
- 如果数据中有空字符串'',字符串'null',一定要注意,他们和sql中的null不是一回事!!!
- */
- -- 需求1:查询未评分的商品信息
- select * from products where score is null;
- -- 需求2:查询商品名称是'null'的商品信息
- select * from products where name = 'null';
- -- 需求3:查询商品名称是''的商品信息
- select * from products where name = '';
复制代码
6.3排序查询
排序查询关键字: order by
排序查询基础格式:
select 字段名 from 表名 order by 排序字段名 asc | desc;
asc:升序(默认)
desc:降序
排序查询进阶格式:
select 字段名 from 表名 order by 排序字段1名 asc | desc,排序字段2名 asc|desc;
注意: 如果order by后跟多个排序字段,先按照前面的字段排序,如果有相同值的情况再按照后面的排序规则排序
- -- 示例1:查询所有商品,并按照评分从高到低进行排序
- SELECT * FROM products ORDER BY score DESC;
- -- 示例2:查询所有商品,先按照评分从高到低进行排序,评分相同的再按照价格从低到高排序
- SELECT * FROM products ORDER BY score DESC, price;
复制代码
6.4聚合函数
聚合函数: 又叫统计函数,也叫分组函数
常用聚合函数: sum() count() avg() max() min()
聚合查询基础格式:
select 聚合函数(字段名) from 表名;
注意: 此处没有分组默认整个表就是一个大的分组
注意: 聚合函数(字段名)会自动忽略null值,以后统计个数一般用count(*)统计因为它不会忽略null值
- -- 示例1:统计当前商品一共有多少件
- SELECT count(id) FROM products;
- SELECT count(*) FROM products;
- -- 示例2:对商品评分列进行计数、求最大、求最小、求和、求平均
- SELECT
- COUNT(score) AS cnt,
- MAX(score) AS max_score,
- MIN(score) AS min_score,
- SUM(score) AS total_score,
- AVG(score) AS avg_score
- FROM products;
- -- 示例3:统计所有非自营商品评分的平均值
- SELECT
- is_self,
- AVG(score)
- FROM
- products
- WHERE
- is_self = '非自营';
-
- -- 练习: 统计有评分的商品个数
- select count(*) from products where score is not null;
- select count(score) from products;
复制代码
6.5分组查询
分组查询关键字: group by
分组查询基础格式:
select 分组字段名,聚合函数(字段名) from 表名 group by 分组字段名;
注意: select后的字段名要么在group by后面出现过,要么写到聚合函数中,否则报错...sql_mode=only_full_group_by
分组查询进阶格式:
select 分组字段名,聚合函数(字段名) from 表名 [where 非聚合条件] group by 分组字段名 [having 聚合条件];
where和having的区别:
书写顺序: where在group by 前,having在group by后
执行顺序: where在group by 前,having在group by后
分组函数: where后不能跟聚合条件,只能跟非聚合条件,having后可以使用聚合条件,也可以使用非聚合条件(不建议)
应用场景: 建议大多数过滤数据都采用where,只有当遇到聚合条件的时候再使用having
使用别名: where后不能使用别名,having后可以使用别名
- -- 示例1:统计每个分类的商品数量
- SELECT
- category_id,
- COUNT(id) AS cnt
- FROM products
- GROUP BY category_id;
- -- 示例2:统计每个分类中自营和非自营商品的数量
- SELECT
- category_id,
- is_self,
- COUNT(id) AS cnt
- FROM products
- GROUP BY category_id, is_self;
- -- 示例3:统计每个分类商品的平均价格,并筛选出平均价格低于1000的分类
- SELECT category_id,
- AVG(price)
- FROM products
- GROUP BY category_id
- HAVING AVG(price) < 1000;
- -- 示例4:统计自营商品中,每个分类的商品的平均价格,并筛选出平均价格高于2000的分类
- SELECT category_id,
- AVG(price) AS avg_price
- FROM products
- WHERE is_self = '自营' -- where在分组之前对数据进行过滤
- GROUP BY category_id
- HAVING AVG(price) > 2000; -- having在分组聚合之后对数据进行过滤
- SELECT category_id,
- AVG(price) AS avg_price
- FROM products
- WHERE is_self = '自营'
- GROUP BY category_id
- HAVING avg_price > 2000; -- MySQL在HAVING中可以使用聚合函数结果的别名!
复制代码
6.6limit查询
分页查询关键字: limit
分页查询基础格式:
select 字段名 from 表名 limit x,y;
x: 起始索引,默认从0开始 x = (页数-1)*y
y: 本次查询的条数
- - 示例1:获取所有商品中,价格最高的商品信息
- SELECT
- *
- FROM products
- ORDER BY price DESC
- LIMIT 1;
- -- LIMIT 0, 1;
- -- 示例2:将商品数据按照价格从低到高排序,然后获取第2页内容(每页3条)
- SELECT
- *
- FROM products
- ORDER BY price
- LIMIT 3, 3;
- -- 示例3:当分页展示的数据不存在时,不报错,只不过查询不到任何数据
- SELECT * FROM products LIMIT 20, 10;
复制代码
6.7SQL顺序
书写顺序: SELECT -> DISTINCT -> 聚合函数 -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
执行顺序: FROM -> WHERE -> GROUP BY -> 聚合函数 -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
7.DQL数据查询语言——多表查询
本质:把多个表通过主外键关联关系连接(join)合并成一个大表,再去查询
7.1多表关系
一对一:一个人一个身份证号
一对多:一个分类下有多个商品
多对多:课程和学生 一般要借助中间表,把多对多变成一对多
7.2外键
外键概念:
在从表(多方)创建一个字段,引用主表(一方)的主键,对应的这个字段就是外键。
外键特点:
1.从表外键的值是对主表主键的引用
2.从表外键类型,必须与主表主键类型一致