标记: (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、运算符及关键字
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);
子查询的分类: