目录
1 数据库和SQL简介
1.1 数据库
数据库指的是长期存储在计算机中、有组织、可共享的、大量数据的集合。数据是按照特定的数据模型来组织、存储在数据库中的。
1.2 数据库的好处
将数据保存到本地,避免数据的丢失,使数据更好的保存以便以后的使用。并且还能实现结构化查询,方便管理
1.3 数据库相关概念
1.3.1 数据库与数据库管理系统
DB(database):数据库,保存一组有组织的数据的一个“仓库”
DBMS(Database Management System):数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
常见的DBMS:MySQL、Oracle、DB2、SqlServer等
SQL:结构化查询语言,用于和数据库通信的语言
1.3.2 数据库与数据库管理系统的关系
1.4 SQL的语言分类
DML(Data Manipulate Language):数据操作语言,用于添加、修改、删除数据库记录,并检查数据完整性。关键字:insert、pudate、delete等
DDL(Data Define Languge):数据定义语言,用于库和表的创建、修改、删除。关键字:create、drop、alter等
TCL(Data Control Language):数据事务语言
DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。关键字:select、where等
2 MySQl概述
2.1 MySQL介绍
SQL(Structured Queery Language)是一款安全、跨平台、高效的、具有数据操作和数据定义等多功能的数据库语言,SQL语言可与其他程序语言一起优化程序功能。
2.2 MySQL的语言规范
关键字、函数名大写
数据库名、表名、表别名、字段名、字段别名都小写
每条命令以英文分号结尾
适当的对语句进行缩进
注释
单行注释:#注释文字 或 --注释文字
多行注释:/*注释文字*/
注意,MySQL在windows环境下是大小写不敏感的
MySQL在Linux环境下是大小写敏感
所以建议采用规范模式进行命名
2.2.3 命名规则
命名不易过长,或过于复杂
只能用A-Z、a-z、_、0-9进行命名
数据库名、字段名、表名中间不要有空格
同一个MySQL软件中,数据库不能同名;同一个数据库中,表名不能重名;同一个表格中,字段名不能重名
3 基础查询语言(DQL)
3.1 简单查询
语法:SELECT 字段名 FROM 表名;
如果要查询表中的所有字段,可用“ * ”代替
如:SELECT * FROM 表名;
对表名、字段名起别名
as关键字,可省略
在需要添加别名的表名、表达式、字段等后加 as 跟上所起的名称
一些简单的查询语句
查看当前所有数据库: SHOW databases;
进去数据库:use 库名;
查看当前所在数据库: SELECT DATABASE();
查看数据库中的表: SHOW TABLES;
查看指定数据库中的表(不在表所在的数据库中也能查询):show TABLES FROM 数据库名;
查询语句中常用的函数
去重
SELECT DISTINCT 字段名 FROM 表名;"+"在MySQL中的含义
作用:做加法运算
SELECT 数值+数值; 直接运算
SELECT 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
SELECT NULL+值;只要其中一个为null,结果都为nullconcat函数
功能:拼接字符
SELECT CONCAT(字符1,字符2,字符3,...);ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
SELECT IFNULL(rich,0) FROM employees;isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
3.2 条件查询
条件运算符:>、>、=、!=、>=、<=、<=>(安全等于)、 <>(不等于)
逻辑运算符:&&--AND、||--OR、!--NOT
模糊查询
LIKE:一般搭配通配符使用,可以判断字符型或数值型
通配符:‘%’ 任意多个字符,‘_’任意单个字符
ESCAPE'$':指明$这个符号为通配符
between and(从什么到什么)
如:从1到10 between 1 and 10
3.3 排序查询
语法:
SELECT 查询列表 FROM 表名 WHERE 筛选条件 ORDER BY 排序条件【ASC/DESC】
ACS:升序,如果不写则MySQL默认升序排序
DESC:降序
排序查询一般放在最后,除了LIMIT语句外
3.4 分组函数
语法:SELECT 查询列表 FROM 表名 GROUP BY 分组字段 【HAVING 筛选条件】分组后的筛选条件
组函数类型:
count:计算个数
一般选择非空的列:主键
count(*)
max:计算最大值 min:计算最小值 sum:计算和 avg:计算平均值
特点:
1、以上五个分组函数都忽略null值,除了 count(*)
2、sum和avg一般用于处理数值型,max、min、count可以处理任何数据类型
3、都可以搭配distinct使用,用于统计去重后的结果
4、count的参数可以支持:
字段、*、常量值,一般放1
注意:聚合函数的计算,排除null值。
解决方案:
选择不包含非空的列进行计算
IFNULL函数
3.5 连接查询
语法:SELECT 查询列表 FROM 表1 别名 【连接类型 JOIN 表2 别名 ON 连接条件
3.5.1 内连接
- 等值连接:连接条件为一个等式;
- 非等值连接:连接条件为一个范围;
- 自连接:连接条件来自同一个表中;
3.5.2 外连接
外连接的查询结果为主表中的所有记录
- 如果从表中有和它匹配的,则显示匹配的值
- 如果从表中没有和它匹配的,则显示NULL
- 外连接查询结果 = 内连接查询结果 + 主表中有而从表中没有的记录
左外连接(LEFT JOIN):左边的表是主表
右外连接(RIGHT JOIN):右边的表是主表
交叉连接(CROSS JOIN):实现笛卡尔乘积
3.6 子查询
在查询中(或其他语句中)嵌套查询,嵌套的查询称为子查询
特点:
1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询(标量子查询)
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询(列子查询)
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
各个关键字所支持的子查询
select 标量子查询
from 表子查询:将子查询的结果充当一张表,要求必须起别名
where / having 标量子查询、列子查询 ※
3.7 分页查询
放在查询语句的最后
LIMIT offset,size;
offset:显示条目的起始索引(起始索引从0开始)
size:显示的条目个数
公式:llimit (page-1)*size,size
3.8 联合查询
union 联合 合并:将多条查询语句的结果合并为一个结果
语法: 查询语句1 union 查询语句2 union ....
应用场景:要查询的结果来自多个表,且多个表没有直接关系,但查询的信息一致时
特点:
- 查询的列数一致;
- 查询的类型和顺序一致
- 使用union自动去重(取消去重 union all)
SQL语句的执行顺序