数据库
一个数据库服务器上,可以把很多有业务上联系的表放到一起,构成一个逻辑上的数据·集合·称为数据库,数据库中的内容持久化存储
数据库操作
- 创建数据库: create database 数据库名 charset utf8;
- 查看数据库: show databases;
- 选中指定数据库: use 数据库名
- 删除数据库: drop database 数据库名;(操作不可逆)
数据类型
我们只需要掌握的是:
- 整数: int long
- 小数: double decimal
- 字符串: varchar
- 时间日期: datetime
mysql提供了无符号类型(unsigned)但是官方文档明确写了不建议使用
因为两个无符号类型相减,可能会产生溢出
表操作!
- 创建表: create table 表名(列名 类型,列名 类型…)
- 查看选中的数据库的表: (一定要先选中数据库) show tables
- 查看指定表的结构: desc 表名; desc->describe (描述)
- 删除表: drop table 表名;删除表的同时会把表里的数据一起删除掉
删表和删库
如果是删库操作,你的程序一定第一时间报错,赶紧进行处理
如果是删表操作,你的程序不一定第一时间报错,发现的时间会更晚,程序以错误的状态在生产环境运行很长时间
增删改查(CRUD)
CRUD对表结构进行操作,是数据库非常基础的部分,也是后端开发日常工作中最主要要做的一项工作。
新增
-
insert into 表名 values (值,值,…)
-
insert into 表名(列名, 列名…) values (值,值,… )
-
insert into 表名 values (值, 值…),(值,值…)
一次插入多行记录,比一次插一条要快不少,因为后者涉及到多次网络交互,虽然体积变大,但是相比于网络交互的影响还是少些的,就好比丢垃圾,满了再一起丢了。
一些基础问题
这条语句出错的原因是 孙悟空 被 MySQL 识别为一个列名,而不是一个字符串值,但是这种的存储应该是一个字符串,应该使用"孙悟空"或’孙悟空’,前面的表名不需要使用引号括起来
由于我的表中只有name和age属性(没有性别这个属性),因此报错了
我们可以得出的结论是:
新增时值的个数不超过表结构里面定义的属性个数。
那么datetime类型该如何插入呢?
可以通过一个固定格式字符串来表示时间日期
例如:insert into student values(“2000-01-01 12:00:00”);
插入完成后,就可以通过select来查询到表中的数据。
查询
全列查询
select * from 表名; 查询所有行和所以列
客户端这里进行的操作都会通过请求发送给服务器,服务器查询的结果也会通过响应返回给客户端。
注意:如果数据库当前表的数据特别多,可能会造成拥堵
指定列查询
某些场景下,只需要关注其中的几个列
语法:select 列名, 列名… from 表名;
去重查询
只保留一个值相同的行
select distinct 列名,列名… from 表名
需要注意的是,如果指定多个列,那么这几个列必须都相同
查询时排序
查询时把行进行排序
a. 使用哪个列作为比较规则?
b. 排序时时升序还是降序?
select 列名,列名 from 表名 order by 列名 asc/desc;
其中asc为升序,desc为将序,如果不指定默认为升序;
order by 列 表示针对某一个列进行排序。
如果不指定列(不使用order by),那么排序出来的数据是不确定的
mysql把请求发送给服务器后,服务器进行查询数据,并把查询到的结果进行排序后在组织成响应数据返回给客户端。
同样的,排序操作不会改变数据库中的数据。
条件查询
select 列名,列名… from 表名 where 条件判断;
- 指定具体的条件,按照条件针对数据进行筛选
- 遍历表中每一行的记录,把每一行的数据分别带入条件中
- 如果条件成立,这个数据就会被计入结果中
- 如果条件不成立,这个就不会被记录。
和表达式类似,针对一个或多个列进行判断,如果条件为真则返回1,反之返回0。
运算符
-
>, >= , <, <= 大于(等于)小于(等于)
-
= 等于,但NULL不安全,NULL=NULL的结果是NULL
-
<==> 等于, NULL安全,NULL<==>NULL返回的是TRUE(1)
-
!=, <>不等于
-
BETWEEN a0 AND a1 区间范围匹配 [a0, a1] 如果 a0<=value<=a1, 返回TRUE(1)
-
IN(option,…)如果是option中的任意一个,返回TRUE(1)
-
IS NULL 是NULL
-
IS NOT NULL 不是NULL
-
LIKE 模糊匹配,%表示任意多个字符, _表示任意一个字符。
模糊匹配时:
%表示任意多个字符, 表示任意一个字符
例如:“孙权”,”孙悟空“
我们可以用“孙%”查询到“孙权”和“孙悟空”,用“孙”查出“孙权”,用”孙__“查出“孙悟空”
分页查询
使用select * 这种方式(全列)查询是比较危险的,可以通过limit可以限制这次查询出来多少的结果。
select * from 表名 limit M offset N;
没有使用分页查询的结果
使用分页查询
也可以不指定offset,使用limit显示M个结果
修改
update 表名 set 列名 = 值 where (筛选)条件;
如果筛选出多行,那么对多行进行修改,使用update, 可以一次修改多个列。
update 表名 set 列=值, 列=值… (这里的“=”是赋值)
删除.
如果不指定条件,就会把表里的记录全删了(将表置为空),相对于把盒子里的饼干全吃了。
delete from 表名 where 过滤条件
update和delete的操作很危险,如果条件写错了。
update和delete的操作都会影响服务器中存储的实际数据。
数据约束
有时候,数据库中数据是要有一定要求的,有些数据认为是合法的数据,有些是不合法数据,靠人工检测很难。
在创建新表时,我们可以指定对某列进行约束(一个或多个),这样在进行增删改时MySQL会检测数据是否合法。因此,引入约束后,执行效率可能会降低。
MySQL提供了以下约束
- NOT NULL -指示某列不能存储NULL
- UNIQUE - 保证某列的每行必须有唯一的值。
- DEFAULT - 规定没有给列赋值时的默认值
- PRIMARY KEY - 唯一标识
- FOREIGN KEY 保证一个表中的数据匹配另一个表中的值
- CHECK 保证列中的值符号指定条件。(但是MySQL不支持,使用时会直接忽略)
聚合函数
- count 返回查询到的数据的数量
- sum 返回查询到的数据的总和
- avg 返回查询到的数据的平均值
- max 返回查询到的数据的最大值
- min 返回查询到的数据的最小值