DQL 数据查询语言

DQL 数据查询语言

标记: (Data Query Language)

语法:
SELECT selection_list       /要查询的列名称*/
FROM table_list       /要查询的表名称/
WHERE condition       /行条件/
GROUP BY grouping_columns       /对结果分组/
HAVING condition       /分组后的行条件/
ORDER BY sorting_columns       /对结果排序/
LIMIT offset_start, row_count       /结果限定/

基础查询:

1、查询所有列

select * from 表名

2、查询指定列

select 指定列1,指定列2… from 表名

条件查询:

1、运算符及关键字

  • =、!=、<>、<、<=、>、>=
    (标记: “<>”相当于“!=”)
  • BETWEEN…AND
    (标记: 是否包含)
  • between 10 and 40
    (//就是10到40之间的)
  • IN(set) :匹配集合
  • IS…NULL :空
    (标记: 查询是否为空时使用is关键字)
  • AND :相当&&
  • OR :相当||
  • NOT :相当!

模糊查询:

1、使用 LIKE 关键字

2、“ _ ” 一个下划线代表一个字符

例:
//查询名字为三个字符,且第二个字符为n的记录
select * from stu where sname like ‘n’;

//查询名字为5个字符的记录(这里写了5个下划线)
select * from stu where sname like ‘_____’;

3、 “%” 百分号匹配 0-n 个字符

例:
//查询姓名以t开头的所有记录
select * from stu where sname like ‘t%’;

4、特殊且常见“%char%”: 查询是否包含某字符的记录

例:
//是否包含名字带‘乔’的记录
select * from stu where sname like ‘%乔%’;

字段控制查询:

1、去除重复记录

使用DISTINCT关键字

例:
//查询stu表,sid列的所有但不重复的记录
select distinct sid from stu;

2、列的和值

使用“+”(加号)连接两个列名,列值就会相加

例:
//把jiangJIn 和 gongZi 两个列求和
select jiangJIn,gongZi,jiangJin+gongZi from stu;

注意:
1.只有数值类型和数值类型才可求和,有一个不是,就不是求和
2.NULL和任何数字运算都会是NULL

NULL运算解决:IFNULL()函数
使用IFNULL(可能出现NULL的列名,替代的默认值)函数

例:
//把jiangJIn 和 gongZi 两个列求和,jiangJin可能为NULL,当jiangJin为NULL时默认为0
select jiangJIn,gongZi,IFNULL(jiangJin,0)+gongZi
from stu;

3、给列取别名

使用AS关键字:语法:select 列名 AS 别名 from 表;
标记: 例:select sname AS 姓名 from stu;

例:
//情况2:通过计算、合并得到的新列命名
//employee中存在firstName列和lastName列,将两列合并成一个叫做“姓名”的列
select firstName+’.’+lastName AS 姓名 from employee;

AS关键字可省略:省略时列名和别名中间保持一个空格就行
标记: (省略AS)例:select sname 姓名 from stu;

排序

1、按指定列 升序

语法:使用ORDER BY 列名 ASC;

例:
//按照sid列的值 升序排列查询结果
select * from stu order by sid asc;

2、按指定列 降序

语法:使用ORDER BY 列名 DESC;

例:
//按照 sid列的值,把查询结果降序
select * from stu order by sid desc;

3、多条件排序

当多个指定列值相同时,追加排序

例:
//使用 sid升序,当sid相同时,使用年龄降序排列
select * from stu order by sid asc , age desc;

聚合函数

标记: 做纵向运算

  • COUNT():统计指定列不为null的记录行数,除指定列外“*”号和数字都是统计表总记录数
    例1:
    #查询有佣金的人数,以及有领导的人数
    SELECT COUNT(comm), COUNT(mgr) FROM emp;
    例2:
    #查询emp表总记录数
    SELECT COUNT(
    ) AS 总数 FROM emp;*

  • MAX():计算指定列的最大值
    例:
    //查询最高工资和最低工资:
    SELECT MAX(sal), MIN(sal) FROM emp;

  • MIN():计算指定列的最小值

  • SUM():计算指定列的数值和
    例:
    //查询所有雇员月薪+佣金和:
    SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

  • AVG():计算指定列的平均值
    列类型非数值类型,则为0
    (SUM():计算指定列的数值和, AVG():计算指定列的平均值)
    若是字符串类型,则使用排序运算
    (MAX():计算指定列的最大值, MIN():计算指定列的最小值)

分组查询:

使用关键字 GROUP BY
标记: 处于末尾位置

语法:SELECT 分组标识列,聚合函数 FROM 表名 GROUP BY 分组标识列;

例:
//查询每个部门的部门编号和每个部门的工资和:
SELECT deptnoSUM(sal) FROM EMP GROUP BY deptno;

1、先筛选匹配条件的记录,再分组

例:(先筛选,再分组)
//查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;

2、先分组,再筛选分组后匹配条件的记录(要使用"HAVING" 关键字)

语法:SELECT 分组标识列,聚合函数 FROM 表名 GROUP BY 分组标识列 HAVING 筛选条件;
例:
//查询工资总和大于9000的部门以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

注意:
1.看筛选的条件是 列名 还是 聚合函数
2.聚合函数 搭配 分组,分组后 只有聚合函数的信息,拿不到 某一列的数据
3.列名 条件 只能在分组前 用where ,聚合函数 作为条件 只能在分组后 用having

分页查询:

LIMIT 关键字(MySQL独有)

语法:SELECT * FROM 表名 LIMIT 起始行,查询长度

例:
//查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3, 10;

1.起始行从0开始
公式:startRow=(x-1)*size
   startRow:起始页;x当前是第几页;
   size:展示的记录数
   起始行等于当前页减1再乘以要展示的大小
2.查询长度 - 表示每页展示的记录数

多表查询:

合并结果集:

语法:
select 列 from 表
union all
select 列 from 表

1、使用Union all 关键字,把两个查询结果一同展示

例:
//dept表和emp表,d和e分别是对应表的别名
SELECT d.deptno,d.dname
FROM dept d
UNION ALL
SELECT e.empno,e.ename
FROM emp e

2、使用Union 关键字,自动去除重复的记录

例:
//emp表和dept表,自动去除重复了的记录
SELECT d.deptno,d.dname
FROM dept d
UNION
SELECT e.empno,e.ename
FROM emp e

3、注意:
1.两个结果集的列数相同
2.列的类型对应相同
3.不局限于同一张表

内连接:

方言版
标记: MySQl独有

语法:select 列 from 表1,表2 where 条件;
例1:
//查询emp和dept表
SELECT * FROM emp,dept
例2:
//查询emp和dept表,并且使用两个表deptno值来 去除重复值
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;

标准版
标记: 其他品牌数据库也可使用

语法:select 列 from 表1 INNER JOIN 表2 ON 条件;
例:
//内连接emp表和dept表,使用 inner join关键字 连接表,on关键字判断条件(on只在需要时使用,不是必备的)
SELECT *
FROM emp e INNER JOIN dept d
ON e.deptno=d.deptno

关键字:INNER JOIN 、 ON

外连接:

标记: 外连接的OUTER关键字可省略,因为有left和right标识

例://省略OUTER关键字的左外连接,e和d是两个表的别名
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

左外连接

特点:以 “关键字左边” 的表作为主表,即使条件不匹配,主表内容也将展示

语法:
select 列
from 表1 LEFT OUTER JOIN 表2
ON 条件;

例:
//左外连接emp和dept表,e和d是别名,去重条件deptno相同
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

关键字:LEFT OUTER JOIN 、 ON

右外连接

特点:以 “关键字右边” 的表作为主表,即使条件不匹配,主表内容也将展示

语法:
select 列
from 表1 RIGHT OUTER JOIN 表2
ON 条件;

例:
//右外连接emp和dept表,e和d是别名,去重条件deptno相同
SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;

关键字:RIGHT OUTER JOIN 、 ON

全外连接

标记: MySQL没有全外连接,只能模拟

特点:模拟出来的全外连接,两个表中不匹配条件的记录也会展示出来

实现想法:同时使用 “左外连接” 和 “右外连接” ,并“合并两者的结果集”

语法:
select 列 from emp e left join dept d on e.deptno=d.deptno
union
select 列 from emp e right join dept d on e.deptno=d.deptno;

例:
//全外连接emp和dept表,e和d是别名,去重条件是deptno相同
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno
UNION
SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno

关键字:LEFT JOIN 、 ON 、 UNION 、 RIGHT JOIN

注意:
1、内连接:书写 去重条件 后,不匹配的记录不会出现(在使用时应当书写去重条件)
2、外连接:书写 去重条件后,主表中不匹配的记录依旧会展示

子查询:

理解:把前一次查询的结果集,当成一个新表,并对它再次查询

子查询出现的位置:

1、from 后面 使用结果集 替换 表

例:
//
SELECT e.* FROM (SELECT * FROM emp) e;

注意:在from后面使用时,必须给结果集一个别名

例:
#查询empno>7788 的员工里面工资大于 2999的人
SELECT n.*
FROM (SELECT empno,ename,sal FROM emp WHERE empno>7788) n
WHERE sal>2999;

(SELECT sal FROM emp WHERE empno>7788;)是查询empno大于7788的员工

2、where 的后面 作为查询条件
例:
//查询工资最高员工的详细
SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

子查询的分类:

  1. 单行单列:= < > >= <= <>
    例:
    //找出高于平均工资的
    SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);
  2. 多行单列:in all (求集合中的最大值) any(求集合中的最小值)
    例:
    #找出高于 id为30部门 所有员工工资的人
    SELECT *
    FROM emp
    WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30);
  3. 单行多列:in 理解为一个对象(少用)
    例:
    #找出工资与部门与 WARD 相同的人
    SELECT *
    FROM emp
    WHERE (sal,deptno) IN (SELECT sal,deptno FROM emp WHERE ename=‘WARD’);
  4. 多行多列:from后面
    语法:select 别名.列 from (select 列 from 表) 别名;
    例:
    #查询 empno>3 的员工里面工资大于400的人
    SELECT e.*
    FROM (SELECT * FROM emp WHERE empno>3) e
    WHERE sal>400

你可能感兴趣的:(Java)