1. 简介
1.1. 为什么要使用数据库?
- 能够提供大规模数据支持
- 能提供各种编程语言支持
- 提供数据之间的关联关系
1.2. MySQL的结构
- 由许多的数据库组成,数据库中有很多表,表中有很多数据
2. 语法
SQL语句分类:
-
DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等 -
DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update等 -
DQL(Data Query Language) 数据查询语言 (掌握)
DQL语言并不是属于MYSQL官方的分类,但是对数据库的操作最多就是查询,所以把查询语句的语句称作为DQL语言
-
DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE等
-
TCL(Transaction Control Language) 事务控制语言或TPL事务处理语言
用于控制数据库的事务操作,关键字; COMMIT,SAVEPOINT,ROLLBACK等
-
CCL(Cursor Control Language)指针控制语言(了解)
像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。多用于存储过程中对结果集的处理。
2.1 插入数据
- 插入单行数据
insert into 表名(列名,列名,列名,...) values(值,值,值,...);
- 插入多行数据
insert into 表名(列名,列名,列名,...) values(值,值,值,...),value(值,值,值,...);
2.2 修改数据
update 表名 set 列名=值;
2.3 删除数据
delete from 表名 where 列名=值;
2.4 查询数据
- 查询所有数据
select * from 表名;
- 查询多列数据
select 列名,列名,列名 from 表名;
2.5 条件语句
-
where
-
=,>=,<=,>,<,!=
-
and
-
or
-
like
- 姓王的人: ‘王%’
- 以王结尾:‘%王’
- 包含王:‘%王%’
-
in:在什么范围内
-
--查询id为1,2,3的人 select * from 表名 where id in (1,2,3)
-
not in:不在什么范围内
-
--查询id为1,2,3的人 select * from 表名 where id not in (1,2,3)
-
distinct:重复数据只显示一条
-
--查询不重复的地址 select distinct(address) from 表名
3. 聚合函数
- count:计数器
select count(列名) from 表名
- sum:求和(若列名为非数值型则输出0)
select sum(列名) from 表名
- max:最大值(若列名为非数值型则输出ASCII码最大值)
select max(列名) from 表名
- min:最小值(若列名为非数值型则输出ASCII码最小值)
select min(列名) from 表名
- avg:平均值(若列名为非数值型则输出0)
select avg(列名) from 表名
4. 分组函数
- group by:使用之后,聚合函数会作用在每个分组上,分组后相当于变成新的表
select 列名,count(列名) from 表名 GROUP BY 列名;
-
having:表示分组后过滤条件,和where类似。但having只能和group by一起使用,不能单独使用
-
where 和 having的区别:where是分组前过滤,having是分组后过滤。
-
注意:使用时需要保证select之后的列名需要在group by之后存在(聚合函数除外),否则会报错;另外,如果使用分组后得到的值不会发生改变,则可以未被上述规则。
-
例如:
id name 1 张三 1 张三 2 李四 2 李四 使用group by分组后:
id | name |
---|---|
1 | 张三 |
2 | 李四 |
这种情况下分组前后id所对应的name值都是固定的,可以违反上述规则。
这时sql语句可以写为:
select id,name from 表名 group by id;
-- name不存在于group by之后却可以执行查询语句得到结果
5. 分页及排序
- order by :排序:
asc:升序排列
desc:降序排列
select 列名 FROM 表名 ORDER BY 列名 asc
select 列名 FROM 表名 ORDER BY 列名 desc
- 分页
第一个数表示从那条开始查询(0开始)
第二个数表示每次查询出几条
--从0开始查询出2条数据
select 列名 FROM 表名 LIMIT 0,2
6. 嵌套查询
-
注意:子查询语句作为表或者列名使用时都必须有一个别名
-
把两个查询语句套在一起,把括号内的子语句看作一张新的表,并给他取别名。
select 列名 from (select 列名 from 表名 where 列名 = 值) 别名 where 别名.列名 = 值
- 把两个查询语句套在一起,把括号内的子语句看作一个值。
select 列名 from 表名 where 列名 = (select 列名 from 表名 where 列名 = 值)
- 把两个查询语句套在一起,把括号内的子语句看作一个列名。
select 列名,(select 列名 from 表名 where 列名 = 值) 别名 from 表名 where 列名 = 值
7. 关联查询
在做项目时,通常我们会分析现实中的业务有哪些实体,通常一个大的实体就需要创建一张表。例如班级和学生,我们会创建2张表,一张存储班级,一张存储学生。
左连接
以左表为主,左表全部记录都会查询出来,右表只会查询关联的数据
右连接
以右表为主,右表全部记录都会查询出来,左表只会查询关联的数据
内连接
只查询两表关联的数据。
左外连接
只查左表中与右表无关联的数据
右外连接
只查右表中与左表无关联的数据
全连接
两表数据全查出来
union与union all
union和union all可以用来连接两个不同的sql的结果。
区别在于,union会去重,union all会全部显示。