数据库
库 database
表 table
每个库中可以包含多张表, 必须在库中建表
每个表中,一行数据,称为 记录
每一列数据,称为字段, 每个字段都有自己的类型
数据库本质是一种文件, 有一种专门的工具软件帮助管理数据库,
这种软件被称为RDBMS(关系型数据库管理系统)
关系型数据库: MYSQL、 Oracle 、MS SQL server、sqlite3
- MySQL(免费)、Oracle(商业版) 属于同一个公司(Oracle)
- MS SQL server 针对Windows平台,属于微软
- Sqlite3 用在 嵌入式设备中, 如 手机、平板等
关系型数据库所用的语言都是 SQL语言
非关系型数据库
MongoDB
Redis
:内存型数据库,一般用来做缓存
库操作
-
创建数据库
create database school charset=utf8; # 创建数据库school, 指定编码方式为utf8, 防止中文乱码
-
查看数据库
show databases;
-
删除数据库
drop database 库名;
-
入库
use 库名;
单表结构操作
-
建表
ID name age gender is_vip 1 小红 23 女 true 2 小绿 20 男 false 3 小黑 22 男 true create table users( # 字段名 字段类型 字段属性 id int unsigned primary key auto_increment, name varchar(10) not null, age int unsigned, gender enum("男", "女") default "男", is_vip bool default false )charset=utf8;
-
查看当前库的所有表
show tables;
-
查看表结构
desc students; # 查看表students的结构
-
删除表
drop table 表名;
-
简单查询
SELECT * FROM student; # 指定 查询结果有哪些字段 SELECT NAME,age FROM student;
- 起别名
我们可以给 字段 或者 表 起别名,使用as语句
当然 as是可以省略的
SELECT NAME 姓名,age 年龄 FROM student; SELECT NAME AS 姓名,age AS 年龄 FROM student;
- 去重(DISTINCT)
对查询的结果去重,如果有完全一样的 就去掉重复的
SELECT DISTINCT NAME FROM student;
-
聚合函数
SELECT COUNT(*) 总计 FROM student
聚合函数 是对结果进行操作
sum:求和
count:统计记录数
max:求最大值
min:求最小值
avg:求平均值
- 起别名
字段类型
- 数字
- 整数
int
: 整数, 0 -1 1int unsigned
:无符号整数, 0 1 2 3 4bit
: 只能存0
或1
, 代表真或假bool
,实际是tinyint(1)
, 插入true
, 实际就是1
, 插入false
, 实际就是0
- 小数
float
: 一般的浮点数decimal(n,m)
: 存金钱有关的数字, 总共n位数字, m位小数, 正或负都可以
- 整数
- 字符串
varchar(n)
: 创建大小为n的变长字符串, 如varchar(10)
, 只存"hello"
, 剩余空间可以被别人使用char(10)
: 创建大小为n定长字符串,如char(10)
, 只存"hello"
, 剩余空间用空格补够10个长度
- 枚举
enum(A, B)
:在列举的所有情况中,选择一个, 如enum("男", "女")
- 时间
date
:年月日, 如2020-8-13
time
: 时分秒, 如13:54:00
datetime
: 年月日 时分秒, 如20202-8-13 13:55:30
字段属性
- 主键: 唯一标识一条记录,
primary key
- 自增:
auto_increment
, 一般都是对主键自增 - 非空:
not null
- 默认:
default
- 唯一:
unique
- 外键:
foreign key
唯一约束 与 主键
- 两者都不能重复
- 主键不能为空, 唯一约束可以为空
一对多表结构操作
分类表
ID | cate_name |
---|---|
1 | 手机 |
2 | 电脑 |
3 | 家居 |
商品表
id | goods_name | Price | Cate_id |
---|---|---|---|
1 | Apple Iphone 11 | 5899.00 | 1 |
2 | 联想 小新 Air14 | 4599.00 | 2 |
3 | 荣耀 4Tpro | 1489.00 | 1 |
-- 创建分类表, 先创建被关联的表
create table cate(
id int unsigned primary key auto_increment,
cate_name varchar(10) not null
);
-- 创建商品表, 后创建关联表
create table goods(
id int unsigned primary key auto_increment,
goods_name varchar(128) not null,
price decimal(6,2),
cate_id int unsigned,
foreign key(cate_id) references cate(id) -- 外键关联: 外键 需要关联 另一表的主键, 强制约束
);
数据操作
- 插入数据(
insert into
)
insert into cate values(0, "手机"); -- 插入表中所有字段的数据,只有主键中插入0,代表自增
insert into cate values(0, "电脑");
insert into cate values(0, "家居");
insert into cate values(0, "家具"),(0, "厨具"),(0, "餐具");
-- 指定字段插入
insert into goods(goods_name, price, cate_id) values("Apple Iphone 11",5899.00,1);
insert into goods(goods_name, price, cate_id) values("联想 小新 Air14",4599.00,2),("荣耀 4Tpro", 1489.00, 1);
- 查询数据(
select
)
select * from cate; -- * 代表所有字段
select * from goods;
- 删除数据(
delete
)
delete from goods where id=3; -- 删除id为3的记录
- 修改数据(
update
)
update cate set cate_name='家具' where id=3;
查
条件查询
比较运算符
-- 等于=、大于>、小于<、不等于!=、大于等于>=、小于等于<=
select * from goods where price > 2000; -- 查询价格大于2000的商品
select * from goods where id>=3; -- 查询id不小于3的商品信息
select * from goods where price < 2000; -- 查询价格小于2000的商品
select * from goods where id<=3; -- 查询id不大于3的商品信息
select * from goods where id=2; -- 查询id为2的商品信息
select * from goods where id!=2; -- 查询id不为2的商品信息
select * from goods where id<>2; -- 查询id不为2的商品信息
逻辑运算符
select * from goods where price>2000 and id>=2; -- 查询价格大于2000 且 id不小于2 的商品信息
select name, price from goods where id=1 or id=3; -- 查询id为1 或 id为3 的商品名称和价格
范围查询
-- 查询id在5到50之间的商品信息
select * from goods where id>=5 and id<=50; -- 使用比较运算符 (and)并且
-- 连续范围、一段数据 可以使用 between ... and ...表示在一个连续的范围内
select * from goods where id between 5 and 50; -- 用来判断连续的范围
-- 查询id为1 或3 或 5 的商品信息
select * from goods where id=1 or id=3 or id=5; -- 使用比较运算符 (or)或者
-- 类似于枚举,列举出具体的值 in 表达式 表示 是否在这些选项中
select * from goods where id in (1,3,5); -- 用来判断不连续的范围
NULL判断
-- 注意:null与''是不同的
-- 判空is null
select * from goods where price is null; -- 查询价格为空的商品信息
select * from goods where price is not null; -- 查询价格不为空的商品信息
select * from goods where goods_name=""; -- 判断是有内容,只不过内容为空字符串
模糊查询
-- %任意个任意字符
select * from goods where goods_name like "%电脑%"; -- 查询名称含有“电脑”的商品信息
select * from goods where goods_name like "电脑%"; -- 查询名称以"电脑"开头的商品信息
select * from goods where goods_name like "%电脑"; -- 查询名称以"电脑"结尾的商品信息
-- _一个任意字符
select * from person where name like "李_"; -- 查询姓李且名为1个字的 人的信息
排序
select * from goods order by price; -- 默认升序排序
select * from goods order by price asc; -- asc确定升序
select * from goods order by price desc; -- desc 降序排序
select * from goods order by price desc, id desc; -- 多个字段排序,先按照前面的字段排序;只有前面字段值相等,才会按照下一个字段排序
分页
-- 查询一条语句,从 哪里offset开始查 查几条num
select * from 表名 limit offset,num;
-- 省略offset写法
select * from goods limit 0,10; -- 代表每页10条数据,第1页
select * from goods limit 10,10; -- 代表每页10条数据,第2页
select * from goods limit 20,10; -- 代表每页10条数据,第3页
select * from goods limit (n-1)*m, m; -- n代表第几页,m代表每页多少条数据
select * from goods limit 10 offset 0; -- 代表每页10条数据,第1页
select * from goods limit 10 offset 10; -- 代表每页10条数据,第2页
select * from goods limit 10 offset 20; -- 代表每页10条数据,第3页
select * from goods limit m offset (n-1)*m; -- n代表第几页,m代表每页多少条数据
分组
我们使用分组可以做一些集合类的相关业务
-- 对应第一张表
-- 统计出 每个年龄的 学生数
SELECT COUNT(NAME),age FROM student GROUP BY age;
-- 查看 每个年龄的具体姓名
SELECT GROUP_CONCAT(NAME),age FROM student GROUP BY age;
-
分组中使用 having
having 条件表达式:用来过滤分组结果。
having作用和where类似,但having只能用于group by 而where是用来过滤表数据
-- 筛选出 年龄 大于30的记录
SELECT GROUP_CONCAT(NAME),age FROM student GROUP BY age HAVING age>30;
从分组结果中 在筛选出 年龄 大于30的记录
子查询
在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句
外部那个select语句则称为主查询。
子查询 先执行,查询的结果 作为 主查询的条件
-- 条件平均年龄
SELECT * FROM student WHERE age > (SELECT AVG(age) FROM student);