第二周学习日志
写在前面:2020年9月20日,星期日,今天是打卡的一天,也是我来到深圳的第一天。当我离开学校的时候,我知道,我离开了一个最安逸的地方,面对的将是这个现实的世界。不管结果是好是坏,我迈出了这一步。出发吧,该去远方了。
对于SQL的学习,有点陌生,也有点熟悉。大概是大学的时候学过,但是有没有好好学吧。这周要恶补一下。由于时间的关系,这次学的不是很多,什么时候才有时间好好学呢,要自己挤时间吧…
1.SQL : 结构化查询语言
启动服务net start mysql
停止服务net stop mysql
登录 mysql -h 主机名 -P 端口号 -u 用户名 -p密码
退出exit
show databases;
use 库名;
show tables;
show tables from 库名;不换库
select database();
create table 表名(字段1 字段类型,字段2 字段类型);
desc 表名;
select * from 表名;
select version();查看版本
说明:SQL 语法不区分大小写,关键字大写,表名字段名小写
命令以分号结尾
-- 注释
/* 多行注释*/
2.DQL查询语句
1)基础查询
select distinct 字段1 as 别名1,字段2 as 别名2 ... from 表名; -- as可省略
select concat(字段1,字段2,字段3) as 别名 from 库名;
select ifnull(字段名, 返回值) as 别名;
2)条件查询
条件运算符 > < = >= <=<>
逻辑运算符and or not
3)模糊查询
like -- 配合通配符
% -- 任意个字符
_ -- 单个字符
\ -- 转义
escape -- 指定转义
[not] between 区间头 and 区间尾 -- (含首尾,不可交换区间首尾)
in (值1,值2...)
is [not] null
<=> -- 安全等于
4)排序查询
order by 排序字段1(可以是表达式,别名) asc | desc (默认asc),排序字段2 [desc]
5)单行函数
A.字符类
concate() -- 拼接
length() -- 字节长度
upper() -- 转大写
lower() -- 转小写
substr(原字符串,初始索引,截取长度) -- 截子串
instr(原字符串,子串) -- 子串第一次出现索引,无则0
trim() -- 去前后空格
trim(指定字符 from 原字符串) -- 去前后指定字符
lpad(原字符串,总长度,指定填充符) -- 左填充
rpad() -- 右填充
replace(原字符串,要换字符串,替换字符串) -- 替换
B.数学类
round(值,精度) -- 四舍五入
ceil() -- 向上取整
floor() -- 向下取整
truncate() -- 截断
mod() -- 模
rand() (0,1] -- 随机数
C.日期类
now() -- 当前系统日期+时间
curdate() -- 当前系统日期
curtime() -- 当前系统时间
year() month() monthname() day() hour()minute() second()
-- 年月英文月日时分秒
str_to_date() -- 日期转换
date_format() -- 日期格式化
datediff(被减数日期,减数日期) -- 日期差天数
D.系统类
version() -- 当前版本
database() -- 当前库
user() -- 当前用户
password('字符') -- 加密
md5('字符') -- md5加密
E.条件分支
if(真值表达式,真执行,假执行) 条件执行
case 条件表达式
when 常量1 then 返回值1
when 常量2 then 返回值2
...
else 返回值n+1
end
case
when 条件1 then 返回值1
when 条件2 then 返回值2
...
else 返回值n+1
end
6)分组函数(聚合函数)
sum([distinct] 数值) -- 非空和
avg(数值) -- 非空均值
max(字段) -- 非空最大值
min(字段) -- 非空最小值
count([distinct] 字段) -- 非空计数
count(*|1) -- 快速统计总行数
7)分组查询
select 分组函数,分组字段...
where 分组前筛选条件,数据源和字段为原始表
group by 分组字段...
having 分组后筛选条件,数据源为分组后的结果集,字段为select后的字段
order by 排序字段[desc];
8)连接查询(多表查询)
笛卡尔积 : 多表直接查询结果行数为行1 * 行2 * ...
内连接
A.等值连接
select 别名1.字段1,别名2字段2
from 表1 别名1,表2 别名2(表改了别名,select若带表名则必须用别名)...
where 别名1.字段1=别名2.字段2
and ...
and 筛选条件
group by 分组字段
having 筛选条件
order by 排序字段;
B.非等值连接
select 字段1,字段2
from 表1 别名1,表2 别名2
where 别名1.字段11 between 别名2.字段21 and 别名2.字段22
and ...;
C.自连接
select 别名1.字段1,别名1.字段2...,别名2.字段1,别名2.字段2...
from 表名别名1,表名别名2;
D.内连接 inner join (表交集)
select 字段1,字段2...
from 表1 别名1
[inner] join 表2 别名2
on 连接条件1(等值条件|不等值条件)
[inner] join 表3 别名3
on 连接条件2
...
where 筛选条件
group by 分组字段
having 筛选条件
order by 排序字段
...;
外连接(主表并集)
A.左连接left [outer] join
select 字段1,字段2...
from 主表别名1
left join 从表别名2
on 连接条件
where 别名2.id is null
...;
B.右连接 right [outer] join (交换连接表顺序等同于左连接)
select 字段1,字段2...
from 从表别名1
right join 主表别名2
on 连接条件
where 别名1.id is null
...;
C.全外连接 full [outer] join (全表并集)
select 字段1,字段2
from 表1 别名1
full join 表2 别名2
on 连接条件
where 别名1.字段1 is null or 别名2.字段2 is null
...;
D.交叉连接 cross join (笛卡尔积)
select 字段1,字段2
from 表1 别名1
cross join 表2 别名2;
9)子查询
select 仅标量子查询(单行单列)
from 仅表子查询(多行多列)
where | having 标量子查询
列子查询(单列)
行子查询(单行)
exists 表子查询
A.where或having后的子查询_标量子查询(搭配> < = >= <= <>)
select 字段
from 表名
where 字段> < = >= <= <>(
select字段 from 表 where 字段=值
)
group by 字段
having 字段> < = >= <= <> (标量子查询);
B. where或having后的子查询_列子查询(搭配in,not in,any,some,all)
select 字段
from 表名
where 字段[not] in(
select [distinct]字段
from表名
where条件
)
...;
in() 等价于=any()
not in() 等价于<>all()
>any() 等价于>min()
>all() 等价于>max()
<any() 等价于
<all() 等价于
C. where或having后的子查询_行子查询
select 字段
from 表名
where (字段1,字段2...) = > < >= <= <> (
select min(字段1),max(字段2)...
from表名
...
)
...;
D.select后的子查询
select 字段2,(
select字段1 from 表1 where 筛选条件
)
from 表2;
E.from后的子查询
select 别名1.*,别名2.字段
from (
select字段1,字段2
from表1
group by分组字段
) 别名1
inner join 表2 别名2
on 表1.字段1 between 字段3 and 字段4
...;
F.exists后的子查询(相关子查询)
select exists(select...);
-- 子查询结果存在,查询结果为1
-- 子查询结果不存在,查询结果为0
select 字段
from 表
where exists(select...);
10)分页查询
select ...
...
limit offset(起始索引从0开始,0可省略),size(条目个数);
limit (page-1)*size size --分页公式
11)联合查询
select ...
...
union [all] --带all不去重
select ... --每个查询列数必须相同,以第一个select字段命名
...
union
...;