MySql学习之路
第一章 数据库入门介绍
数据库的好处
- 持久化数据到本地
- 实现结构化查询
数据库相关概念
- DB(data base)保存一组有组织的数据的容器
- DBMS(database management system) 用于管理DB中的数据
- SQL(structure query language) 用于和DBMS通信的语言
数据库的特点
- 数据放到表中,表再放到库中(表有唯一表名标识自己)
- 字段–列
- 对象–行
- 类
第二章 MySql 介绍
MySql 启动与停止
- 方式一:计算机管理-服务
- 方式二:通过命令行
net start mysql
net stop mysql
MySql登陆与退出
- 方式一:通过MySql自带的客户端(仅限root用户)
- 方式二:通过命令行
登陆 :MySQL 【-h 主机名 -p 端口号】-u 用户名 -p密码
退出:exit 或 ctrl +c
MySql常见命令
-
查看当前所有数据库
show databases; -
打开指定的库
use 库名; -
查看当前库的所有表
show tables; -
查看其他库的所有表
show tables from 库名; -
查看表结构
desc 表名; -
查看服务器版本
select version();
MySql 的语法规范
- 不区分大小写,但建议关键字大写,表名、列名小写
- 最好用分号结尾
- 缩进与换行
- 注释
单行注释:#注释文字 – 注释文字(一定要空格)
多行注释:/*注释文字*/
第三章 DQL(数据查询)语言
1. 基础查询
语法
select 查询列表 from 表名;
特点
- 查询列表可以是:表中字段、常量值、表达式、函数;
- 查询的结果是一个虚拟表格;
ps:
- 加着重号`是为了区分关键字和字段;
- sql不区分字符和字符串
- 起别名时注意特殊字符,可以用双引号引起来
- 如果是字符型和日期型的常量值必须用单引号引起来,数值型不需要
- 去重时选择多列则去掉共同值
- +号的作用:运算符
- select 100+90; 两个操作数均为数值型,做加法运算
- select ‘123’+90; 其中一方为字符型,试图将字符型数值转换为数值型。如果转换成功,则继续做加法运算;否则,则将字符型视为0.。
- select null + 90; 只要其中一方为NULL,则结果一定为null。
- 字符的连接用concat函数
- NULL的处理
函数ifnull:判断某字段是否为null,是则返回指定值,否则返回原本值
函数isnull:判断某字段是否为null,是则1,否则0
2. 条件查询
语法
select 查询列表 from 表名 where 筛选条件;
分类
- 条件运算符:> < = <> != >= <=
- 逻辑运算符:and && or || not !
- 模糊查询:like\ between and \ in \ is null is not null
3. 排序查询
语法
select 查询列表
from 表名
where 筛选条件
order by 排序列表 【asc/desc】;
特点
- asc 升序(默认) desc 降序
- order by 可以支持单个字段、多个字段、表达式、函数、别名
- order by一般是放在查询语句最后面,limit除外
- order by 后面直接加数字1,2,3…n,表示第1,2,3…n列
4. 常见函数
概念
将一组逻辑语句封装在方法体中,对外暴露方法名
调用
select 函数名(实参列表)
好处
隐藏了实现细节/提高代码效率、可读性、重用性
特点
叫什么(函数名)/干什么(函数功能)
分类
-
单行函数 (如concat length ifnull 等)
(1) 字符函数 length concat substr instr trim upper lower lpad rpad replace
(2) 数学函数 round ceil floor truncate mod rand(获取随机数)
(3) 日期函数 now curdate curtime year month monthname day hour minute second str_to_date date_format daydiff(返回相差天数)
%Y %y
%m %c(不带0的月份)
%d
%H(24小时) %h(12小时)
%i(分钟) %s
str_to_date:将字符转换成日期
date_format将日期转换为字符
(4) 其他函数 version database user password/md5(自动加密)
(5) 流程控制函数
if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
case
1)case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
…
else 值 n
end
2) case
when 条件1 then 值1
when 条件2 then 值2
…
else 值 n
end -
分组函数 (统计/聚合/组函数) 做统计使用
如 sum avg max min count
- 语法
select max(字段) from 表名;
- 支持类型
sum和avg一般用于处理数值型
max min count 可以处理任何数据类型 - 以上分组函数均忽略NULL值
- 都可以与distinct搭配实现去重
select sum(distinct 字段) from 表名; - count (*)、count(1)、count(字段)统计结果集的行数
count(字段)统计该字段非空值的个数
1)count的存储效率问题
MYISAM引擎下 count(*) 效率最高 因为内部有计数器
INNODB引擎下 count(*)和count(1)效率差不多,但都比count(‘字段’)更高 - 和分组函数一同查询的字段,要求是group by 后出现的字段
补充
cast函数 1
作用
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。
语法
cast(expression AS data_type)
可转换的数据类型
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
5. 分组查询
语法(按执行顺序标号)
select 分组函数,group by 后面的字段「5」
from 表名 「1」
【where 分组前的筛选】 「2」
group by 分组字段 「3」
【having 分组后的筛选】「4」
【order by 排序列表 【asc/desc】】「6」;
特点
- 分组查询中的筛选条件分为两类,一类为分组前筛选(放于group by前,where),另一类为分组后筛选(放于group by后,having)
ps: 分组函数做条件一定放于having子句中
能用分组前的优先考虑分组前(出于性能的考虑) - group by 字句支持单个字段分组,多个字段分组(用逗号隔开,没有顺序要求),表达式或函数(比较少用)
- 也可以添加排序,排序放在整个分组查询最后
6. 连接查询
含义及语法
当查询中涉及到了多个字段,需要用多表连接
select 字段1,字段2
from 表1,表2......
where 连接条件
一些现象
笛卡尔乘积现象:表1 m行 表2 n行 结果m*n行
- 发生原因:没有有效的连接条件
- 如何避免:添加有效的连接条件
分类
- 按年代分类:mq92(仅支持内连接)
mq99(推荐,在mysql中不支持全外连接) - 按功能分类
内连接:等值、非等值、自连接
外连接:左外连接、右外连接、全外连接
交叉连接
mq92语法
- 等值连接
select 查询字段
from 表1 别名1,表2 别名2......
where 别名1.key=别名2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
- 多表等值查询结果为多表交集部分
- n表连接至少需要n-1个连接条件
- 多表顺序没有要求
- 一般为表起别名
ps:为表其别名的好处
1)提高语句简介度
2)区分多个重名字段
tips:如果为表起了别名,则查询字段无法再使用原来的表名 - 可以搭配之前介绍的所有字句进行使用
- 非等值连接
select 查询字段
from 表1 别名1,表2 别名2......
where 别名1.key 非等值连接条件 别名2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
- 自连接
select 查询字段
from 表 别名1,表 别名2......
where 别名1.key=别名2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
mq99语法
- 内连接
- 特点
1)可以搭配之前介绍的所有字句进行使用
2)inner可以省略
3)筛选条件放在where后面,连接条件放在on后面,提高可读性
4)与92语法实现效果一样
select 查询列表 「7」
from 表1 「1」
【inner 】join 表2 「2」
on 连接条件 「3」
【where 分组前的筛选 「4」
group by 分组字段 「5」
having 分组后的筛选 「6」
order by 排序字段】 「8」
limit offset, size; 「9」
- 外连接
select 查询列表 「7」
from 表1 「1」
left/right/full 【outer】 join 表2 「2」
on 连接条件 「3」
【where 分组前的筛选 「4」
group by 分组字段 「5