用作统计使用,又称为聚合函数或统计函数或组函数
sum 求和 avg 平均值 max最大值 min 最小值 count 计算个数
select sum(salary) from employees;
select min(salary) from employees;
select avg(salary) from employees;
select count(salary) from employees;
SELECT SUM(salary) 和 ,AVG(salary) 平均 , MAX(salary) 最高 , MIN(salary) 最低 ,COUNT(salary) 个数 FROM employees;
SELECT SUM(salary) 和 ,ROUND(AVG(salary),2) 平均 , MAX(salary) 最高 , MIN(salary) 最低 ,COUNT(salary) 个数 FROM employees;
select sum(last_name) ,avg(last_name) from employees;
select sum(hiredate) ,avg(hiredate) from employees;
select max(last_name) ,min(last_name) from employees;
select max(hiredate) ,min(hiredate) from employees;
select count(commission_pct) from employees;
select count(last_name) from employees;
select sum(commission_pct),avg(commission_pct),sum(commission_pct)/35,sum(commission_pct)/107 from employees;
select max(commission_pct) ,min(commission_pct) from employees;
select count(commission_pct) from employees;
(去重之后求和):
select sum(distinct salary), sum(salary) from employees;
select count(distinct salary),count(salary) from employees;
select count(salary) from employees;
select count(*) from employees;
举个例子:总行数有107行,如果我们统计salary(select count(salary) from employees;)
的时候,其中有一个为空,那么所得就是106行。提示:虽然salary为空,但salary所在行不一定全为null,这个时候总行数用salary去统计就不正确了。
用select count(*) from employees;
统计总行数的话,只要一行之中有一个不为null
(任何字段不为null),那么这行就可以被算上。
select count(1) from employees;
这个也可以用来统计行数,也就是说在每行的前面加了一个1,然后再来计算1的个数,最后有几行就有几个1喽),也可以在括号里写2,3,4,5,6…………写啥常量值(字符常量,或者数字常量)都行
MYISAM
存储引擎下,count(* )
的效率高(因为这个存储引擎内部有个计数器,直接返回个数)
默认存储引擎:INNODB
存储引擎下,count(*)
和count(1)
的效率差不多,比count(字段)
要高一些(加字段的话,得先判断这个字段是否为null
)
select avg(salary), employee_id from employees;
直接报错,原因如下:
即使出来了,这里的employee_id也没有任何意义
select max(salary) mx_sal, min(salary) mi_sal, round(avg(salary),2) ag_sal , sum(salary) sm_sal from employees;
select datediff(max(hiredate),min(hiredate)) DIFFRENCE from employees;
select datediff(now(),'2002-5-8');
select datediff('2020-10-1','2002-5-8');
select count(*) 个数 from employees where department_id=90;
select 分组函数,列(要求出现在group by的后面)
from 表
[where 筛选条件]
group by 分组的列表
[order by 子句]
查询列表必须特殊,要求是分组函数和group by后出现的字段
分组前筛选:
数据源 | 位置 | 关键字 |
---|---|---|
原始表 | group by子句的前面 | where |
分组后筛选:
数据源 | 位置 | 关键字 |
---|---|---|
分组后 | group by子句的后面 | having |
group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用得较少)
也可以添加排序(排序放在整个分组查询的最后)
查询每个部门的平均工资:
分组数据 group by 子句语法
可以使用 group by 子句将表中的数据分成若干组:
select column ,group_function(column) from table [where condition]
[group by group_by_expression] [order by column];
明确:where一定放在from后面
select max(salary) ,job_id from employees group by job_id;
select max(salary) ,job_id from employees group by job_id
select count(*),location_id from departments group by location_id;
select avg(salary),department_id from employees where email like '%a%' group by department_id;
(根据语法:where子句放在from后面,group by前面)
select max(salary),manager_id from employees where commission_pct is not null group by manager_id;
select count(*),department_id from employees group by department_id;
select count(*),department_id from employees group by department_id where count(*)>2???????
这样可以吗?where加在最后面?肯定不行呀,根据语法规则,where子句放在from后面,group by前面
所以的话需要使用新的关键字having
select count(*),department_id from employees group by department_id having count(*)>2;
select max(salary), job_id from employees where commission_pct is not null group by job_id;
select max(salary), job_id from employees where commission_pct is not null group by job_id having max(salary)>12000;
select min(salary),manager_id
from employees group by manager_id;
select min(salary),manager_id from employees where manager_id>102 group by manager_id;
select min(salary),manager_id from employees where manager_id>102 group by manager_id having min(salary) >5000;
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
select count(*),length(last_name) len_name from employees group by length(last_name);
select count(*),length(last_name) len_name from employees group by length(last_name) having count(*)>5;
使用别名:
select count(*) c ,length(last_name) len_name from employees group by len_name having c>5;
(MySQL中group by 和having后面皆可放别名,但是where后面不能放别名;Oracle中group by 和having后面不可以放别名)
select avg(salary),department_id,job_id from employees group by department_id,job_id;
在这里呢,group by后面所加的department_id,job_id可以互换位置
select avg(salary),department_id,job_id from employees group by job_id,department_id;
查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示:
select avg(salary),department_id,job_id from employees group by department_id,job_id order by avg(salary) desc;
然后添加id不为空,平均薪资大于10000才显示:
select avg(salary) a,department_id,job_id from employees where department_id is not null group by department_id,job_id having a>10000 order by avg(salary) desc;
select max(salary),min(salary),avg(salary),sum(salary),job_id from employees group by job_id order by job_id;
select max(salary)-min(salary) DIFFERENCE from employees;
select min(salary),manager_id from employees where manager_id is not null group by manager_id having min(salary)<6000;
SELECT department_id,COUNT(*),AVG(salary) a
FROM employees
GROUP BY department_id
ORDER BY a DESC;
select count(*) 个数 ,job_id from employees group by job_id;
CREATE TABLE `departments` (
`department_id` INT(4) ,
`department_name` VARCHAR(3) ,
`manager_id` INT(6) ,
`location_id` INT(4)
) ;
INSERT INTO `departments` VALUES (10, 'Adm', 200, 1700);
INSERT INTO `departments` VALUES (20, 'Mar', 201, 1800);
INSERT INTO `departments` VALUES (30, 'Pur', 114, 1700);
INSERT INTO `departments` VALUES (40, 'Hum', 203, 2400);
INSERT INTO `departments` VALUES (50, 'Shi', 121, 1500);
INSERT INTO `departments` VALUES (60, 'IT', 103, 1400);
INSERT INTO `departments` VALUES (70, 'Pub', 204, 2700);
INSERT INTO `departments` VALUES (80, 'Sal', 145, 2500);
INSERT INTO `departments` VALUES (90, 'Exe', 100, 1700);
INSERT INTO `departments` VALUES (100, 'Fin', 108, 1700);
INSERT INTO `departments` VALUES (110, 'Acc', 205, 1700);
INSERT INTO `departments` VALUES (120, 'Tre', NULL, 1700);
INSERT INTO `departments` VALUES (130, 'Cor', NULL, 1700);
INSERT INTO `departments` VALUES (140, 'Con', NULL, 1700);
INSERT INTO `departments` VALUES (150, 'Sha', NULL, 1700);
INSERT INTO `departments` VALUES (160, 'Ben', NULL, 1700);
INSERT INTO `departments` VALUES (170, 'Man', NULL, 1700);
INSERT INTO `departments` VALUES (180, 'Con', NULL, 1700);
INSERT INTO `departments` VALUES (190, 'Con', NULL, 1700);
INSERT INTO `departments` VALUES (200, 'Ope', NULL, 1700);
INSERT INTO `departments` VALUES (210, 'IT ', NULL, 1700);
INSERT INTO `departments` VALUES (220, 'NOC', NULL, 1700);
INSERT INTO `departments` VALUES (230, 'IT ', NULL, 1700);
INSERT INTO `departments` VALUES (240, 'Gov', NULL, 1700);
INSERT INTO `departments` VALUES (250, 'Ret', NULL, 1700);
INSERT INTO `departments` VALUES (260, 'Rec', NULL, 1700);
INSERT INTO `departments` VALUES (270, 'Pay', NULL, 1700);
又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
sql92
标准(MySQL:仅仅支持内连接)sql99
标准[标准]:(在mysql中:支持内连接 +外连接(左外和右外)+交叉连接)内连接:
外连接:
交叉连接
select name,boyname from boys,beauty ;
select name,boyname from boys,beauty where beauty.boyfriend_id=boys.id;
select name,boyname from boys,beauty where beauty.boyfriend_id=boys.id;
select last_name ,department_name from employees,departments where employees.department_id=departments.department_id;
如果为表起了别名,则查询的字段就不能用原来的表名去限定
SELECT e.last_name,e.job_id ,j.job_title FROM employees e ,jobs j WHERE e.job_id=j.job_id;
SELECT e.last_name,e.job_id , j.job_title FROM jobs j ,employees e WHERE e.job_id=j.job_id;
select last_name,department_name ,commission_pct from employees e,departments d where e.department_id=d.department_id and e.commission_pct is not null;
select department_name,city from departments d,locations l where d.location_id=l.location_id and city like '_o%';
SELECT COUNT(*) 个数,city FROM departments d,locations l WHERE d.location_id=l.location_id GROUP BY city;
SELECT department_name,d.manager_id,MIN(salary) FROM departments d,employees e WHERE d.department_id=e.department_id AND commission_pct IS NOT NULL GROUP BY department_name,d.manager_id;
SELECT job_title , COUNT(*) FROM employees e,jobs j WHERE e.job_id=j.job_id GROUP BY job_title ORDER BY COUNT(*) DESC;
select last_name,department_name,city from employees e,departments d, locations l where e.department_id=d.department_id and d.location_id=l.location_id;
SELECT last_name,department_name,city FROM employees e,departments d, locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id AND city LIKE 's%';
SELECT last_name,department_name,city FROM employees e,departments d, locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id AND city LIKE 's%' ORDER BY department_name DESC;
select salary,grade_level from employees e,job_grades g where salary between g.lowest_sal and g.highest_sal;
select salary,grade_level from employees e,job_grades g where salary between g.lowest_sal and g.highest_sal and g.grade_level='A';
select employee_id,last_name,manager_id from employees;
select e.employee_id,e.last_name,m.employee_id,m.last_name from employees e,employees m where e.manager_id=m.employee_id;
select max(salary),avg(salary)from employees;
select employee_id,job_id,last_name from employees order by department_id desc,salary asc;
select job_id from employees where job_id like '%a%e%';
select s.name,g.name,r.score from student s,grade g,result r where s.id=r.studentNo and g.id=s.gradeid;
select now();
select trim(字符 from '');
select substr(str,startIndex);
select substr(str,startIndex,length);
select last_name,d.department_id,department_name from employees e,departments d where e.department_id=d.department_id;
SELECT job_id,location_id FROM employees e ,departments d WHERE e.department_id=d.department_id AND e.department_id=90;
SELECT last_name ,department_name,l.location_id,city FROM employees e,departments d,locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id AND e.commission_pct IS NOT NULL;
SELECT last_name,job_id,d.department_id,department_name FROM employees e, departments d,locations l WHERE e.department_id=d.department_id AND d.location_id=l.location_id AND city='Toronto';
SELECT department_name,job_title,MIN(salary) 最低工资 FROM employees e,departments d,jobs j WHERE e.department_id=d.department_id AND e.job_id=j.job_id GROUP BY department_name,job_title;
SELECT * FROM departments d,locations l WHERE d.location_id=l.location_id;
select country_id,count(*) 部门个数 from departments d,locations l where d.location_id=l.location_id group by country_id having 部门个数>2;
employees Emp# manager Mgr#
kochhar101 king 100
SELECT e.last_name employees ,e.employee_id 'Emp#' ,m.last_name manager ,m.employee_id 'Mgr#' FROM employees e,employees m WHERE e.manager_id=m.employee_id;
SELECT e.last_name employees ,e.employee_id "Emp#" ,m.last_name manager ,m.employee_id "Mgr#" FROM employees e,employees m WHERE e.manager_id=m.employee_id AND e.last_name='Kochhar';
CREATE TABLE `boys` (
`id` INT(11) ,
`boyName` VARCHAR(20) ,
`userCP` INT(11)
) ;
INSERT INTO `boys` VALUES (1, '张无忌', 100);
INSERT INTO `boys` VALUES (2, '鹿晗', 800);
INSERT INTO `boys` VALUES (3, '黄晓', 50);
INSERT INTO `boys` VALUES (4, '段誉', 300);
CREATE TABLE `beauty` (
`id` INT(11) ,
`name` VARCHAR(50) ,
`sex` CHAR(1) ,
`borndate` DATETIME ,
`phone` VARCHAR(11) ,
`photo` BLOB ,
`boyfriend_id` INT(11)
) ;
INSERT INTO `beauty` VALUES (1, '柳岩', '女', '1988-02-03 00:00:00', '18209876577', NULL, 8);
INSERT INTO `beauty` VALUES (2, '苍老师', '女', '1987-12-30 00:00:00', '18219876577', NULL, 9);
INSERT INTO `beauty` VALUES (3, 'Angelababy', '女', '1989-02-03 00:00:00', '18209876567', NULL, 3);
INSERT INTO `beauty` VALUES (4, '热巴', '女', '1993-02-03 00:00:00', '18209876579', NULL, 2);
INSERT INTO `beauty` VALUES (5, '周冬雨', '女', '1992-02-03 00:00:00', '18209179577', NULL, 9);
INSERT INTO `beauty` VALUES (6, '周芷若', '女', '1988-02-03 00:00:00', '18209876577', NULL, 1);
INSERT INTO `beauty` VALUES (7, '岳灵珊', '女', '1987-12-30 00:00:00', '18219876577', NULL, 9);
INSERT INTO `beauty` VALUES (8, '小昭', '女', '1989-02-03 00:00:00', '18209876567', NULL, 1);
INSERT INTO `beauty` VALUES (9, '双儿', '女', '1993-02-03 00:00:00', '18209876579', NULL, 9);
INSERT INTO `beauty` VALUES (10, '王语嫣', '女', '1992-02-03 00:00:00', '18209179577', NULL, 4);
INSERT INTO `beauty` VALUES (11, '夏雪', '女', '1993-02-03 00:00:00', '18209876579', NULL, 9);
INSERT INTO `beauty` VALUES (12, '赵敏', '女', '1992-02-03 00:00:00', '18209179577', NULL, 1);
CREATE TABLE `jobs` (
`job_id` VARCHAR(10) ,
`job_title` VARCHAR(35) ,
`min_salary` INT(6) ,
`max_salary` INT(6)
) ;
INSERT INTO `jobs` VALUES ('AC_ACCOUNT', 'Public Accountant', 4200, 9000);
INSERT INTO `jobs` VALUES ('AC_MGR', 'Accounting Manager', 8200, 16000);
INSERT INTO `jobs` VALUES ('AD_ASST', 'Administration Assistant', 3000, 6000);
INSERT INTO `jobs` VALUES ('AD_PRES', 'President', 20000, 40000);
INSERT INTO `jobs` VALUES ('AD_VP', 'Administration Vice President', 15000, 30000);
INSERT INTO `jobs` VALUES ('FI_ACCOUNT', 'Accountant', 4200, 9000);
INSERT INTO `jobs` VALUES ('FI_MGR', 'Finance Manager', 8200, 16000);
INSERT INTO `jobs` VALUES ('HR_REP', 'Human Resources Representative', 4000, 9000);
INSERT INTO `jobs` VALUES ('IT_PROG', 'Programmer', 4000, 10000);
INSERT INTO `jobs` VALUES ('MK_MAN', 'Marketing Manager', 9000, 15000);
INSERT INTO `jobs` VALUES ('MK_REP', 'Marketing Representative', 4000, 9000);
INSERT INTO `jobs` VALUES ('PR_REP', 'Public Relations Representative', 4500, 10500);
INSERT INTO `jobs` VALUES ('PU_CLERK', 'Purchasing Clerk', 2500, 5500);
INSERT INTO `jobs` VALUES ('PU_MAN', 'Purchasing Manager', 8000, 15000);
INSERT INTO `jobs` VALUES ('SA_MAN', 'Sales Manager', 10000, 20000);
INSERT INTO `jobs` VALUES ('SA_REP', 'Sales Representative', 6000, 12000);
INSERT INTO `jobs` VALUES ('SH_CLERK', 'Shipping Clerk', 2500, 5500);
INSERT INTO `jobs` VALUES ('ST_CLERK', 'Stock Clerk', 2000, 5000);
INSERT INTO `jobs` VALUES ('ST_MAN', 'Stock Manager', 5500, 8500);
CREATE TABLE `locations` (
`location_id` INT(11) ,
`street_address` VARCHAR(40) ,
`postal_code` VARCHAR(12) ,
`city` VARCHAR(30) ,
`state_province` VARCHAR(25) ,
`country_id` VARCHAR(2)
) ;
INSERT INTO `locations` VALUES (1000, '1297 Via Cola di Rie', '00989', 'Roma', NULL, 'IT');
INSERT INTO `locations` VALUES (1100, '93091 Calle della Testa', '10934', 'Venice', NULL, 'IT');
INSERT INTO `locations` VALUES (1200, '2017 Shinjuku-ku', '1689', 'Tokyo', 'Tokyo Prefecture', 'JP');
INSERT INTO `locations` VALUES (1300, '9450 Kamiya-cho', '6823', 'Hiroshima', NULL, 'JP');
INSERT INTO `locations` VALUES (1400, '2014 Jabberwocky Rd', '26192', 'Southlake', 'Texas', 'US');
INSERT INTO `locations` VALUES (1500, '2011 Interiors Blvd', '99236', 'South San Francisco', 'California', 'US');
INSERT INTO `locations` VALUES (1600, '2007 Zagora St', '50090', 'South Brunswick', 'New Jersey', 'US');
INSERT INTO `locations` VALUES (1700, '2004 Charade Rd', '98199', 'Seattle', 'Washington', 'US');
INSERT INTO `locations` VALUES (1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario', 'CA');
INSERT INTO `locations` VALUES (1900, '6092 Boxwood St', 'YSW 9T2', 'Whitehorse', 'Yukon', 'CA');
INSERT INTO `locations` VALUES (2000, '40-5-12 Laogianggen', '190518', 'Beijing', NULL, 'CN');
INSERT INTO `locations` VALUES (2100, '1298 Vileparle (E)', '490231', 'Bombay', 'Maharashtra', 'IN');
INSERT INTO `locations` VALUES (2200, '12-98 Victoria Street', '2901', 'Sydney', 'New South Wales', 'AU');
INSERT INTO `locations` VALUES (2300, '198 Clementi North', '540198', 'Singapore', NULL, 'SG');
INSERT INTO `locations` VALUES (2400, '8204 Arthur St', NULL, 'London', NULL, 'UK');
INSERT INTO `locations` VALUES (2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford', 'UK');
INSERT INTO `locations` VALUES (2600, '9702 Chester Road', '09629850293', 'Stretford', 'Manchester', 'UK');
INSERT INTO `locations` VALUES (2700, 'Schwanthalerstr. 7031', '80925', 'Munich', 'Bavaria', 'DE');
INSERT INTO `locations` VALUES (2800, 'Rua Frei Caneca 1360 ', '01307-002', 'Sao Paulo', 'Sao Paulo', 'BR');
INSERT INTO `locations` VALUES (2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve', 'CH');
INSERT INTO `locations` VALUES (3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE', 'CH');
INSERT INTO `locations` VALUES (3100, 'Pieter Breughelstraat 837', '3029SK', 'Utrecht', 'Utrecht', 'NL');
INSERT INTO `locations` VALUES (3200, 'Mariano Escobedo 9991', '11932', 'Mexico City', 'Distrito Federal,', 'MX');
CREATE TABLE job_grades(
grade_level VARCHAR(3),
lowest_sal INT,
highest_sal INT
);
INSERT INTO job_grades
VALUES ('A', 1000, 2999);
INSERT INTO job_grades
VALUES ('B', 3000, 5999);
INSERT INTO job_grades
VALUES('C', 6000, 9999);
INSERT INTO job_grades
VALUES('D', 10000, 14999);
INSERT INTO job_grades
VALUES('E', 15000, 24999);
INSERT INTO job_grades
VALUES('F', 25000, 40000);