MySql常用查询方式以及一些常用的聚合函数
1、排序。排序默认是ASC降序。(DESC为升序)
1).语法格式:
SELECT 列名1[,列名2…列名n]
FROM 表名ORDER BY 表达式 [ASC|DESC]
2).示例:
#查询emp表中的empon,ename,sal 列,按照sal降序,empno升序
select empno,ename,sal from emp order by sal,empno;
select empno,ename,sal from emp order by sal desc,empno;
select empno,ename,sal from emp order by sal desc,empno desc;
select empno,ename,sal,hiredate from emp order by hiredate;
3).select语句的总结:
SELECT [ALL|DISTINCT] 列名1 别名,列名2 别名…
FROM 表1
[WHERE 条件表达式]
[GROUP BY 列名]
[HAVING 条件表达式]
[ORDER BY 列名 [ASC|DESC]]
[LIMIT [start_row,]row_count];
2、sql函数ifnull(comm,0) 功能是判断表达式是否为null, 为null则返回0, 否则返回comm自身。
#查询emp表中员工的总工资(总工资=工资+奖金),并按照工资降序,
select empno,ename,sal,comm,sal+ifnull(comm,0) from emp order by sal+ifnull(comm,0);
3、limit 子句用户限制返回行数,常用于分页。(limit 子句放在查询语法的后边)
1).语法:limit[分页起始索引], 每页记录数
2).分页的公式:select * from emp limit(页码-1)*页大小,页大小;
例如查询商品表中第三页的数据,每页记录10条记录。
select * from 商品表 limit (3-1)*10,10;
select empno,ename from emp limit 10,5;
4、where 子句。(where 子句可以分为5类:简单比较测试、范围测试、组成员测试、模式匹配测试、空值测试)
1).简单比较 表达式结合 比较运算符和关系运算符 = < > <= >= <> != 关系运算符:与(and) 或 (or) 非(not)
select * from emp where sal>1000 and sal <2000;
2).范围运算符。(between and)
#查找emp表中工资1000-2000的员工信息
select * from emp where sal between 1000 and 2000;
5、between and 语句。(使用BETWEEN… AND…关键字可以方便的限制查询数据的范围)
1).语法格式:
SELECT 列名1[,列名2…列名n]
FROM 表名
WHERE 表达式 [NOT] BETWEEN 表达式1 AND 表达式2
2).示例:SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 1000 AND 3000;
6、in 语句(not in)。
1).语法格式:
SELECT 列名1[,列名2…列名n]
FROM 表名
WHERE 表达式 [NOT] IN (表达式1,表达式2[,…表达式n])
2).示例(组成员测试):
#在emp表中查询编号为10、20、30三个部门的员工的部门编号、员工编号和员工姓名信息
SELECT deptno,empno,ename FROM EMP WHERE deptno IN (10,20,30);
相当于:SELECT deptno,empno,ename FROM EMP WHERE deptno=10 OR deptno=20 OR deptno=30;
7、模式匹配测试(模糊查询)SQL提供了LIKE子句来进行这类模糊搜索。
1).语法格式:
SELECT 列名1[,列名2…列名n] FROM 表名 WHERE 表达式 [NOT] LIKE 条件;
2).LIKE 子句通配符。
* %(百分号) 表示从0-n 个任意字符。
*_ (下划线) 表示单个的任意字符。
3).示例:
#在emp表中查询名字中包含字母“A”的员工的员工编号、员工姓名信息:
SELECT empno,ename FROM emp WHERE ename LIKE '%A%';
#在emp表中查询名字中第二个字母不为“A”的员工的员工编号、员工姓名信息:
SELECT empno,ename FROM emp WHERE ename NOT LIKE '_A%';
8、空值测试。
1).语法格式为:
ELECT 列名1[,列名2…列名n] FROM 表名 WHERE 表达式 IS [NOT] NULL;
2).示例:
SELECT empno,ename,sal,comm FROM emp WHERE comm IS NOT NULL;
9、复合搜索条件。(多个条件表达式之间可以通过逻辑运算符进行连接)
WHERE子句中经常使用的逻辑运算符包括:NOT(非)、AND(与)、OR(或)
select * from emp where comm id not null and(deptno=10 or deptno=20);
10、分组查询 group by 使用时注意 select 语句后仅允许出现如下列。
** 使用GROUP BY进行分组查询时,其他的DBMS一都具有如下的限制,SELECT语句中仅允许以下几项:
1、分组列deptno
2、聚合函数 max(sal)
3、常量
MySQL中虽然没有这个限制,但是写上其他的列没有实际意义
#从emp表中查询各个部门下各个工种的员工平均工资和最高工资。
SELECT deptno, job,avg(sal), max(sal) FROM emp GROUP BY deptno,job;
SELECT deptno,max(sal),min(sal),1000 from emp group by deptno;
11、使用列别名。(含有特殊字符(如空格),加单引号或双引号)
select ename 员工姓名 from dept;
12、聚合函数。
1).sum(表达式) 返回表达式中所有数值的总和,忽略空值。
2).avg(表达式) 返回表达式中所有数值的平均值,忽略空值。
SELECT avg(sal) '平 均 工 资' FROM emp;
3).min(表达式) 返回表达式中所有数值的最小值,忽略空值。
4).max(表达式) 返回表达式中所有数值得最大值,忽略空值。
5)count(*|表达式) 返回满足select语句中指定的条件的记录条数;为表达式时忽略空值。
13、having子句 在分组或使用聚合函数后再进一步筛选。相当于where对select效果。 having对group by
语法:
SELECT 列名1[,列名2…列名n]
FROM 表名
GROUP BY 列名1
HAVING 表达式
#从emp表中查询平均工资高于2000的部门编号及其平均工资。
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
14、distkinct 关键字,能够从返回的结果集去除重复记录。
** 在使用DISTINCT关键字后,如果表中有多个为NULL的数据,服务器会把这些数据视为相等。
** 在使用DISTINCT关键字后,如果表中有多个为NULL的数据,服务器会把这些数据视为相等。
SELECT COUNT(DISTINCT 列名)FROM 表名
#从emp表中查询员工的职位都有哪些(名称相同的只显示一次)
SELECT DISTINCT job FROM emp;
15、保存查询结果到新表。
1).将查询的结果保存到一个新表(原来不存在)中
-- 使用该语句可以完成很多功能:
-- 全表数据备份
-- 部分数据备份
-- 表结构的复制(注意不含约束)
语法:
CREATE TABLE <newtable>
[AS]
SELECT 语句
注意:查询可以涉及多个表
#查询出部门编号为10的员工信息,并将查询结果保存到一个新表emp1中
CREATE TABLE emp1 as SELECT * FROM emp WHERE deptno=10;
16、保存查询结果到旧表。
1).将查询的结果保存到一个旧表(原来存在)中,也可以理解为是一个批量插入数据的命令。
2).当使用INSERT命令来复制表中数据的时候,两个表的结构要么完全相同,要么指定两个表中数据类型相兼容的类型进行数据复制。
语法:
INSERT INTO target_table(column_list)
SELECT 语句
#查询出部门编号为20的员工信息,并将查询结果保存到表emp1中
INSERT INTO emp1 SELECT * FROM emp WHERE deptno=20;
This article is written in songyanping at 9:00 AM 2018/07/09