贵阳市观山湖区网站建设,黄骅贴吧新鲜事,怎么写wordpress插件,做网站现在用什么语言目录通用语法及分类DQL#xff08;数据查询语言#xff09;基础查询条件查询聚合查询#xff08;聚合函数#xff09;分组查询排序查询分页查询内连接查询外连接查询自连接查询联合查询子查询列子查询行子查询表子查询总结通用语法及分类
● DDL: 数据定义语言#xff0c…
目录通用语法及分类DQL数据查询语言基础查询条件查询聚合查询聚合函数分组查询排序查询分页查询内连接查询外连接查询自连接查询联合查询子查询列子查询行子查询表子查询总结通用语法及分类
● DDL: 数据定义语言用来定义数据库对象数据库、表、字段 ● DML: 数据操作语言用来对数据库表中的数据进行增删改 ● DQL: 数据查询语言用来查询数据库中表的记录 ● DCL: 数据控制语言用来创建数据库用户、控制数据库的控制权限
DQL数据查询语言
语法
SELECT字段列表
FROM表名字段
WHERE条件列表
GROUP BY分组字段列表
HAVING分组后的条件列表
ORDER BY排序字段列表
LIMIT分页参数基础查询
查询多个字段 SELECT 字段1, 字段2, 字段3, ... FROM 表名; SELECT * FROM 表名;
设置别名 SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名; SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;
去除重复记录 SELECT DISTINCT 字段列表 FROM 表名;
转义 SELECT * FROM 表名 WHERE name LIKE /_张三 ESCAPE / / 之后的_不作为通配符
条件查询
语法 SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件 比较运算符 功能 大于大于等于小于小于等于等于或 ! 不等于
BETWEEN ... AND ... 在某个范围内含最小、最大值
IN(...) 在in之后的列表中的值多选一
LIKE 占位符 模糊匹配_匹配单个字符%匹配任意个字符
IS NULL 是NULL
逻辑运算符 功能
AND 或 并且多个条件同时成立
OR 或 || 或者多个条件任意一个成立
NOT 或 ! 非不是例子
-- 年龄等于30
select * from employee where age 30;-- 年龄小于30
select * from employee where age 30;-- 小于等于
select * from employee where age 30;-- 没有身份证
select * from employee where idcard is null or idcard ;-- 有身份证
select * from employee where idcard;
select * from employee where idcard is not null;-- 不等于
select * from employee where age ! 30;-- 年龄在20到30之间
select * from employee where age between 20 and 30;
select * from employee where age 20 and age 30;-- 下面语句不报错但查不到任何信息
select * from employee where age between 30 and 20;-- 性别为女且年龄小于30
select * from employee where age 30 and gender 女;-- 年龄等于25或30或35
select * from employee where age 25 or age 30 or age 35;
select * from employee where age in (25, 30, 35);-- 姓名为两个字
select * from employee where name like __;-- 身份证最后为X
select * from employee where idcard like %X;聚合查询聚合函数
常见聚合函数
函数 功能count 统计数量max 最大值min 最小值avg 平均值sum 求和
语法 SELECT 聚合函数(字段列表) FROM 表名; 例 SELECT count(id) from employee where workaddress 广东省;
分组查询
语法 SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];
where 和 having 的区别
● 执行时机不同where是分组之前进行过滤不满足where条件不参与分组having是分组后对结果进行过滤。 ● 判断条件不同where不能对聚合函数进行判断而having可以。
例子 根据性别分组统计男性和女性数量只显示分组数量不显示哪个是男哪个是女 select count(*) from employee group by gender; 根据性别分组统计男性和女性数量 select gender, count(*) from employee group by gender; 根据性别分组统计男性和女性的平均年龄 select gender, avg(age) from employee group by gender; 年龄小于45并根据工作地址分组 select workaddress, count(*) from employee where age 45 group by workaddress; 年龄小于45并根据工作地址分组获取员工数量大于等于3的工作地址 select workaddress, count(*) address_count from employee where age 45 group by workaddress having address_count 3;
注意事项
● 执行顺序where 聚合函数 having ● 分组之后查询的字段一般为聚合函数和分组字段查询其他字段无任何意义
排序查询
语法 SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
排序方式
● ASC: 升序默认 ● DESC: 降序
例子 根据年龄升序排序 SELECT * FROM employee ORDER BY age ASC; SELECT * FROM employee ORDER BY age; 两字段排序根据年龄升序排序入职时间降序排序 SELECT * FROM employee ORDER BY age ASC, entrydate DESC;
注意事项
如果是多字段排序当第一个字段值相同时才会根据第二个字段进行排序
分页查询
语法 SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
例子 查询第一页数据展示10条 SELECT * FROM employee LIMIT 0, 10; 查询第二页 SELECT * FROM employee LIMIT 10, 10;
注意事项
● 起始索引从0开始起始索引 查询页码 - 1 * 每页显示记录数 ● 分页查询是数据库的方言不同数据库有不同实现MySQL是LIMIT ● 如果查询的是第一页数据起始索引可以省略直接简写 LIMIT 10
合并查询笛卡尔积会展示所有组合结果 select * from employee, dept;
笛卡尔积两个集合A集合和B集合的所有组合情况在多表查询时需要消除无效的笛卡尔积
消除无效笛卡尔积 select * from employee, dept where employee.dept dept.id;
内连接查询
内连接查询的是两张表交集的部分
隐式内连接 SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;
显式内连接 SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;
显式性能比隐式高
例子
-- 查询员工姓名及关联的部门的名称
-- 隐式
select e.name, d.name from employee as e, dept as d where e.dept d.id;
-- 显式
select e.name, d.name from employee as e inner join dept as d on e.dept d.id;外连接查询
左外连接
-- 查询左表所有数据以及两张表交集部分数据
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
-- 相当于查询表1的所有数据包含表1和表2交集部分数据右外连接
-- 查询右表所有数据以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;例子
-- 左
select e.*, d.name from employee as e left outer join dept as d on e.dept d.id;
select d.name, e.* from dept d left outer join emp e on e.dept d.id; -- 这条语句与下面的语句效果一样
-- 右
select d.name, e.* from employee as e right outer join dept as d on e.dept d.id;左连接可以查询到没有dept的employee右连接可以查询到没有employee的dept
自连接查询
当前表与自身的连接查询自连接必须使用表别名
语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
自连接查询可以是内连接查询也可以是外连接查询
例子
-- 查询员工及其所属领导的名字
select a.name, b.name from employee a, employee b where a.manager b.id;
-- 没有领导的也查询出来
select a.name, b.name from employee a left join employee b on a.manager b.id;联合查询
把多次查询的结果合并形成一个新的查询集 (union, union all)
语法
SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...注意事项
● UNION ALL 会有重复结果UNION 不会 ● 联合查询比使用or效率高不会使索引失效
子查询
SQL语句中嵌套SELECT语句称谓嵌套查询又称子查询。
SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2);子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个
根据子查询结果可以分为
标量子查询子查询结果为单个值列子查询子查询结果为一列行子查询子查询结果为一行表子查询子查询结果为多行多列
根据子查询位置可分为
WHERE 之后FROM 之后SELECT 之后
标量子查询
子查询返回的结果是单个值数字、字符串、日期等。 常用操作符-
例子
-- 查询销售部所有员工
select id from dept where name 销售部;
-- 根据销售部部门ID查询员工信息
select * from employee where dept 4;
-- 合并子查询
select * from employee where dept (select id from dept where name 销售部);-- 查询xxx入职之后的员工信息
select * from employee where entrydate (select entrydate from employee where name xxx);列子查询
返回的结果是一列可以是多行。
常用操作符
操作符 描述
IN 在指定的集合范围内多选一
NOT IN 不在指定的集合范围内
ANY 子查询返回列表中有任意一个满足即可
SOME 与ANY等同使用SOME的地方都可以使用ANY
ALL 子查询返回列表的所有值都必须满足例子
-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name 销售部 or name 市场部);
-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary all(select salary from employee where dept (select id from dept where name 财务部));
-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary any (select salary from employee where dept (select id from dept where name 研发部));行子查询
返回的结果是一行可以是多列。 常用操作符, , , IN, NOT IN
例子
-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) (12500, 1);
select * from employee where (salary, manager) (select salary, manager from employee where name xxx);表子查询
返回的结果是多行多列 常用操作符IN
例子
-- 查询与xxx1xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name xxx1 or name xxx2);-- 查询入职日期是2006-01-01之后的员工及其部门信息
select e.*, d.* from (select * from employee where entrydate 2006-01-01) as e left join dept as d on e.dept d.id;总结
DQL执行顺序
FROM - WHERE - GROUP BY - SELECT - ORDER BY - LIMIT