软件的构成?
应用部分(前端+服务器) + 数据存储(数据库)
数据库
SQL语句(Structured Query Language)结构化查询语言
数据库:MySQL、Oracle、SQLServer、PostgreSQL
- 数据定义语言(DDL):create 、 drop
- 数据操作语言(DML):insert 、 update 、 delete
- 数据查询语言(DQL):select 、 where【重点】
- 数据控制语言(DCL):grant (赋权)
- 事务控制语言(TCL):commit 、 rollback
重点关键词
select \ where
and \ or \ in
between and
inner join \ left right join
group by \ order by
limit
as
聚合函数 sum 、 avg 、 count
1.select
- and
select * from sys_dept where dept_id = 100 and status = 0;
- or
select * from sys_dept where dept_id = 100 or status = 0 or leader = "若依";
- in
select * from sys_dept where dept_id in (101,102,103);
- between and
select * from sys_dept where dept_id between 100 and 105;
select * from sys_dept where create_time between '2023-11-11 00:00:00' and '2023-11-11 23:59:59';
数据类型的隐式转换:'2023-11-11 00:00:00’字符串转时间
- group by 分组查询
select dept_name , count(*) from sys_dept group by dept_name;
select dept_name , dept_id ,count(*) from sys_dept group by dept_name ,dept_id;
count(*)<==>count(dept_name),其对象为dept_name
查询结果不同,第二条是将dept_name , dept_id两个字段同时相同的行进行合并
如果你使用了 GROUP BY 子句,那么 SELECT 中的字段必须是聚合函数(如 COUNT、SUM、AVG 等)或者在 GROUP BY 子句中列出的字段
select count(*) from sys_dept;
select count(1) from sys_dept;
分别对sys_dept表的所有列和主键进行统计
- having 对分组结果进一步筛选
select dept_name , count(1) from sys_dept group by dept_name having count(1)>1;
- order by 排序(倒/默认升)
select * from sys_dept order by dept_id asc;
select * from sys_dept order by dept_id desc;
- limit 获取指定条数
select * from sys_dept limit 3;
select * from sys_dept limit 3,5;
获取前三条数据
从第四条开始查5条
- like 模糊查询
select * from sys_dept where dept_name like '%科技';
select * from sys_dept where dept_name like '_科技';
以‘科技‘结尾,%占未知位置
第二三个字为’科技’,_占一个字位
- 去除重复数据
select distinct * from sys_dept
- as 取别名
select * from sys_dept as dept limit 2;
2.DQL高级查询
查询所用到的三个表
2.1连接查询
(数据多、少查询,可创建视图、存储过程)
2.1.1内连接
定义:内连接查询是一种查询操作,用于在关系型数据库中将两个或多个表中满足连接条件的行组合在一起,返回满足连接条件的行,并且只返回那些在两个表中都存在匹配行的数据。
SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.字段 = 表2.字段
INNER JOIN 表3 ON 表1.字段 = 表3.字段;
select * from a,b,c where a.id1=b.id2 and b.id2=c.id3;
注意:不带on后的条件,查询结果为笛卡尔积
注意:第一个表数据冗余,无法单表实现一个人两个身份
解决方法:通过第三表(关系表)实现,更好做扩展,表独立
2.1.2外连接
左外连接:一种数据连接方式,用于将左边表中的所有行与右边表中满足连接条件的行组合在一起。如果右表中没有匹配的行,则在结果集中显示为NULL值。
select * from tuser a left join trole b
on a.rid=b.rid;
右外连接:同上理
select * from tuser a right join trole b
on a.rid=b.rid;
2.2合并查询
合并查询指在关系型数据库中使用联合(Union)操作符将两个或多个查询的结果集合并在一起
2.2.1单表合并
函数 | 使用说明 |
---|---|
union | 出现相同行时,不保留重复行,进行去重处理 |
union all | 出现相同行时,保留重复行,不进行去重 |
select rid from tuser
union
select rid from trole;
2.2.2多表合并
- 列的数量和关系保持一致
2.3子查询
- 以查询结果作为筛选条件加入其他查询
- 位置:where后面、from后面、having的条件
角色为董事长的人的数据:
内连接实现:
select a.* , b.rname from tuser a
inner join trole b
on a.rid=b.rid and b.rname="董事长";
子查询实现:
select a.* from tuser a
where a.rid=(
select rid from trole where rname="董事长"
);