1.为什么需要数据库?
(1)持久保存数据(数组、集合)(2)完整的管理系统,便于查询(文件)
2.DB、DBMS、SQL
数据库DB: database 存储数据的仓库,保存了一系列有组织的数据。
数据库管理系统DBMS: database management system 通过数据库管理系统创建和操作数据库
结构化查询语言SQL: structure query language 专门用来与数据库通信的语言
3.MySQL服务启动/停止
cmd管理员身份运行--->启动:net start MySQL80--->停止:net stop MySQL80
4.MySQL服务的登录和退出
cmd管理员身份运行--->mysql [-h localhost(主机名) -p3306(端口号)] -u root(用户名) -pxxxxx(密码)
5.MySQL常用命令
(1)查看当前所有的数据库:show databases;
(2)打开指定数据库:use 库名;
(3)查看当前库的所有表:show tables;
(4)查看其它库的所有表:show tables from 库名;
(5)创建表:create table 表名(
列名 列类型,
列名 列类型,
......
);
(6)查看表结构:desc 表名;
6.MySQL语法规范
(1)不区分大小写,建议关键词大写,表名、列名小写
(2)以分号结尾
(3)可缩进,换行
(4)注释 单行:#注释 或 -- 注释
多行:/*注释*/
7.条件查询
语法:select 查询列表 from 表名 where 筛选条件;
筛选条件:(1)>,<,=,!=,<>,>=,<= (2)&&,||,~,and,or,not (3)模糊查询 like,between and,in,is null,is not null
8.排序查询
语法:select 查询列表 from 表名 where 筛选条件 order by 排序列表 asc|desc;
order by 后排序列表可支持 单个字段、多个字段、表达式、函数、别名
9.常用函数
格式:select 函数名(实参列表)[from 表]
分类:(1)单行函数 concat、length、isnull (2)分组/组/聚合/统计函数(用于统计)
1.1字符函数
select length、concat、upper/lower、substr/substring(索引从1开始)、instr(返回字串第一次出现的索引,找不到返回0)、trim(去前后空格)、lpad/rpad(用指定的字符实现左/右填充指定长度)、replace(替换)
1.2数学函数
select round、ceil、floor、truncate(截断)、mod(取余)mod(a,b)=a-a/b*b
1.3日期函数
select now(日期+时间)、curdate(日期)、curtime(时间)、year、month......
select str_to_date:将日期格式的字符转换为指定格式的日期
e.g. str_to_date('9-13-1999','%m-%d-%Y') ---> 1999-09-13
select date_format:将日期转换为字符
e.g. date_format('2018/6/6','%Y年%m月%d日') ---> 2018年06月06日
1.4流程控制函数
if函数:if else效果 e.g.select if(10<5,'大','小')
case函数:(1)switch case效果 (2)类似于多重if
(1)格式:case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
......
else 要显示的值n或语句n
end
(2)格式:case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
......
else 要显示的值n或语句n
end
2.分组/聚合、统计函数
sum、avg:一般用于处理数值型
max、min、count(计算个数):可以处理任意类型
所有分组函数都忽略null值,可以和distinct搭配使用
count(*)/count(1)/count(字段):统计行数
10.分组查询
语法:
select 分组函数,列(要出现在group by 后面)
from 表
[where 筛选条件]
group by 分组列表
[order by 子句]
数据源 | 位置 | 关键字 | |
分组前筛选 | 原始表 | group by句前 | where |
分组后筛选 | 分组后的结果集 | group by句前 | having |
(1)分组函数做条件一定放在having子句中
(2)group by 支持多个字段分组,用逗号隔开
11.连接/多表查询(查询字段来自多个表)
1.sql92标准
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行 发生原因:没有有效的连接条件
分类:(1)内连接:等值连接、非等值连接、自连接
(2)外连接:左外连接、右外连接、全外连接
(3)交叉连接
为表起别名:(1)提高语句的简洁度(2)区分多个重名的字段
注意:如果为表起了别名,则查询字段就不能用原来的表名去限定
2.sql99标准
sql99可实现连接条件和筛选条件的分离,可读性较高
语法:
select 查询列表
from 表1 别名
[连接类型] join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
分类:
(1)内连接:inner (可省略) 等值连接、非等值连接、自连接
(2)外连接 :左外:left 右外:right 全外:full
外连接应用场景:用于查询一个表中有,另一个表没有的记录
外连接特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和他匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接:left join 左边的是主表
右外连接:right join 右边的是主表
(3)交叉连接:cross 笛卡尔乘积
内连接 左外连接 右外连接
12.子查询
含义:出现在其他语句中的select语句,称为子查询或内查询,外部的查询语句,称为主查询或外查询
子查询放在小括号内,一般放在条件的右侧
分类:
按子查询出现的位置:
select 后面:标量子查询
from后面:表子查询 将子查询结果充当一张表,要求必须起别名
where或having后面*:
标量子查询(单行)*:一般搭配单行操作符使用>,<,>=,<=,=,<>
列子查询(多行)*:一般搭配多行操作符使用 in/not_in、any/some、all
行子查询
exists后面:表子查询(相关子查询) 语法:exists(完整的查询语句) 结果:1或0
按结果集的行列数:标量子查询(结果集只有一行一列)、列子查询(结果集只有一列多行)、行子查询(结果集只有一行多列或多行多列)、表子查询(结果集一般为多行多列)
13.分页查询
select 查询列表
from 表1 别名
[连接类型] join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
limit [offset],size
offset:要显示条目的起始索引(起始索引从0开始) size:要显示的条目个数
14.联合查询
union联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
......
应用场景:要查询的结果来自于多个数,且多个表没有直接的连接关系,但查询的信息一致时
特点:
1.要求多条查询语句的查询列数是一致的;
2.要求多条查询语句的查询的每一列的类型和顺序最好一致;
3.union关键字默认去重,如果使用union all可以包含重复项