DQL语句

基础查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
    语法:
    	select 查询列表 from 表名

    特点:
        1、查询列表可以是:表中的字段、常量值、表达式、函数
        2、查询的结果是一个虚拟的表格
*/
USE myemployees;
#1、查询表中的单个字段
	SELECT last_name FROM employees;

#2、查询表中的多个字段 
	SELECT last_name, salary, email FROM employees;

#3、查询表中的所有字段
	SELECT *FROM employees;

#4、查询常量值
    SELECT 100;
    SELECT '广东省梅州市';

#5、查询表达式
	SELECT 100%98;

#6、查询函数 
	SELECT VERSION();

#7、起别名 
/*
    ①便于理解
    ②如果要查询的字段有重名的情况,使用别名可以区分开来
*/
#方式一:
    SELECT 100%98 AS 结果;
	SELECT last_name AS , first_name AS  FROM employees;
#方式二: 
	SELECT last_name , first_name  FROM employees;

#案例:查询salary, 显示结果为 out put(别名可能有关键字,建议用双引号把别名给引起来)
	SELECT salary AS 'out put' FROM employees;

#8、去重
#案例:查询员工表中涉及到的所有的部门的编号
	SELECT DISTINCT department_id FROM employees;

#9、+号的作用 
/*
    mysql中的+号:仅仅只有一个功能——运算符
    SELECT 100+90;    两个操作数都为数值型,则做加法运算
    SELECT '123'+90;  其中一方为字符数,mysql会视图将字符型转换成数值型
                                        如果转换成功,则继续做加法运算
    SELECT 'John'+90;                   如果转换失败,则将字符型转换成0
    SELECT NULL+90;		只要其中一方为NULL,则结果肯定为NULL
*/
#案例:查询员工名和姓连接成一个字段,并显示为姓名 
	SELECT concat(last_name,' ',first_name) AS '姓名' FROM employees;

#补充IFNULL()函数
#--------------------------------------------------------------
    SELECT 
        IFNULL(commission_pct,0) AS 奖金率,
        commission_pct
    FROM
        employees;
#--------------------------------------------------------------

    SELECT 
        CONCAT(employee_id,',',job_id,',',salary,',', IFNULL(commission_pct,0) )
        AS out_put
    FROM
        employees;

条件查询

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
    语法:
        SELECT 
            查询列表
        FROM
            表名
        WHERE
            筛选条件;
    分类:
        一、按条件表达式筛选
        示例:salary>10000
        条件运算符:> < >= <= = != <> <=>

        二、按逻辑表达式筛选
        示例:salary>10000 && salary<20000
        逻辑运算符:
            AND(&&):两个条件如果同时成立,结果为true,否则为false
            OR(||):两个条件只要有一个成立,结果为true,否则为false
            NOT(!):如果条件成立,则not后为false,否则为true

        三、模糊查询
        示例:last_name like 'a%'
        LIKE, BETTWEEN AND , IN, IS NULL 
*/

#一、按条件表达式筛选
    #案例1:查询工资>12000的员工信息 
        SELECT *
        FROM employees
        WHERE salary>12000;

    #案例2:查询部门编号不等于90号的员工名和部门编号
        SELECT
            CONCAT(first_name,' ', first_name) AS '员工名',
            department_id
        FROM employees
        WHERE department_id <> 90
        ORDER BY department_id;

#二、按逻辑表达式筛选 

    #案例1:查询工资在10000到20000之间的员工名、工资以及奖金 
        SELECT last_name, salary, commission_pct
        FROM employees
        WHERE salary >= 10000 AND salary <= 20000;

        SELECT last_name, salary, commission_pct
        FROM employees
        WHERE salary BETWEEN 10000 AND 20000;

    #案例2:查询部门编号不在90-110之间 或者 工资高于15000的员工信息 
        SELECT *
        FROM employees
        WHERE (department_id NOT BETWEEN 90 AND 100) OR (salary > 15000)

#三、模糊查询 
    /*
        like特点:①一般和通配符搭配使用
                            %:代表任意多个字符,包括0个
                            _ :代表单个字符
        between and
        is null
        is not null
    */

    #1、like
        #案例1:查询员工名中包含字符a的员工信息  
            SELECT *
            FROM employees
            WHERE first_name LIKE '%a%';

        #案例2:查询员工名中第3个字符为e,第5个字符为a的员工名 
            SELECT first_name
            FROM employees
            WHERE first_name LIKE '__e_a%';

        #案例3:查询员工名中第二个字符为_的员工名 
            SELECT last_name
            FROM employees
            WHERE last_name LIKE '_\\_%';

            SELECT last_name
            FROM employees
            WHERE last_name LIKE '_$_%' ESCAPE '$';

    #2、between and
        /*
        ①使用 BETWEEN AND 可以提高语句的简洁度
        ②包含临界值
        ③两个临界值不能调换顺序,左边数小右边数大
        */

        #案例1:查询员工编号在100-120之间的员工信息
            SELECT *
            FROM employees
            WHERE employee_id BETWEEN 100 AND 120
            ORDER BY employee_id;

    #3、in
        /*
        含义:判断某字段是否属于 IN 列表中的某一项 
        特点:
            ①使用IN提高语句简洁度 
            ②IN列表中的值,类型必须一致或兼容
            ③IN列表中不支持使用通配符
        */
        #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的员工名和工种编号 
            SELECT first_name, job_id
            FROM employees
            WHERE job_id IN ('IT_PROG','AD_VP','AD_PRES');

    #4、IS NULL
        /*
            NULL值无法用=,<,>,<>,!=判断,必须用IS NULL或IS NOT NULL进行判断
        */
        #案例1:查询没有奖金的员工名和奖金率 
            SELECT first_name, commission_pct
            FROM employees
            WHERE commission_pct IS NULL;

        #案例2:查询有奖金的员工名和奖金率 
            SELECT first_name, commission_pct
            FROM employees
            WHERE commission_pct IS NOT NULL;

    #安全等于  <=>  也可以判断NULL值

        #案例1:查询没有奖金的员工名和奖金率 
            SELECT first_name, commission_pct
            FROM employees
            WHERE commission_pct <=> NULL;

        #案例2:查询工资为12000的员工信息 
            SELECT first_name, salary
            FROM employees
            WHERE salary <=> 12000;

    /*IS NULL 对比 <=>
        IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
        <=>	   :既可以判断NULL值,又可以判断普通数值,可读性较低
    */
    
/*
	练习题:
        1. 查询工资大于 12000 的员工姓名和工资
        2. 查询员工号为 176 的员工的姓名和部门号和年薪
        3. 选择工资不在 5000 到 12000 的员工的姓名和工资
        4. 选择在 20 或 50 号部门工作的员工姓名和部门号
        5. 选择公司中没有管理者的员工姓名及 job_id
        6. 选择公司中有奖金的员工姓名,工资和奖金级别
        7. 选择员工姓名的第三个字母是 a 的员工姓名
        8. 选择姓名中有字母 a 和 e 的员工姓名
        9. 显示出表 employees 表中 first_name 以 'e'结尾的员工信息
        10. 显示出表 employees 部门编号在 80-100 之间 的姓名、职位
        11. 显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、职位  
*/  

排序查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
	语法:
		SELECT 查询列表
        FROM 表名
        【WHERE 筛选条件】
        ORDER BY 排序列表 【ASC|DESC】
	特点:
		1、ASC代表升序,DESC代表的是降序,如果不写,默认是升序
        2、ORDER BY 子句中可以支持单个字段、多个字段、表达式、函数、别名
        3、ORDER BY 子句一般是放在查询语句的最后面,但 LIMIT 子句除外
*/

#案例1:查询员工信息,要求按工资高到低排序 
	SELECT *
	FROM employees
	ORDER BY salary DESC;
	#--或者--
	SELECT *
	FROM employees
	ORDER BY salary;

#案例2:查询部门编号大于>=90的员工信息,要求按入职时间的先后进行排序 【添加筛选条件】
	SELECT *
    FROM employees
    WHERE department_id >= 90
    ORDER BY hiredate;

#案例3:按年薪的高低显示员工的信息和年薪【按表达式排序】
	SELECT *, salary*12*(1+IFNULL(commission_pct,0)) AS '年薪'
    FROM employees
    ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#案例4:按年薪的高低显示员工的信息和年薪【按别名排序】
	SELECT *, salary*12*(1+IFNULL(commission_pct,0)) AS '年薪'
    FROM employees
    ORDER BY 年薪 DESC;

#案例5:按姓名的长度显示员工的姓名和工资【按函数排序】
	SELECT LENGTH(first_name) AS '字节长度', first_name, salary
    FROM employees
    ORDER BY LENGTH(first_name) DESC;

#案例6:查询员工信息,要求先按工资排序,再按员工编号排序
	SELECT *
    FROM employees
    ORDER BY salary, employee_id DESC;
    
#练习1. 查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
	SELECT 
		first_name, 
		department_id, 
		salary*12*(1 + IFNULL(commission_pct,0)) AS '年薪'
	FROM employees
	ORDER BY 年薪, first_name;

#练习2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序
	SELECT first_name, salary
	FROM employees
	WHERE salary NOT BETWEEN 8000 AND 17000
	ORDER BY salary DESC;

#练习3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
	SELECT *, LENGTH(email) AS '邮箱长度'
	FROM employees
	WHERE email LIKE '%e%'
	ORDER BY LENGTH(email) DESC, department_id;    

常见函数

概括归纳

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
	概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
	好处:1、隐藏了实现细节  2、提高代码的重用性
	调用:select 函数名(实参列表) 【from 表】;
	特点:
		①叫什么(函数名)
		②干什么(函数功能)
	分类:
		1、单行函数
			如 concat、length、ifnull等
		2、分组函数		
			功能:做统计使用,又称为统计函数、聚合函数、组函数		
	常见函数:
		一、单行函数
			字符函数:
				length:获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
				concat、substr、instr、trim、upper、lower、lpad、rpad、replace			
			数学函数:
				round、ceil、floor、truncate、mod				
			日期函数:
				now、curdate、curtime、year、month、monthname、day、
				hour、minute、second、str_to_date、date_format                
			其他函数:
				version、database、user
			流程控制函数:
				if、case
*/

单行函数

字符函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#1.LENGTH:获取参数值的字节个数
	SELECT LENGTH('Mike');  #返回4
	SELECT LENGTH('张三丰');   #返回9,在UTF8下,一个汉字占3个字节;在JDK下,一个汉字占2个字节 

	SHOW VARIABLES LIKE '%char%'; #显示所用字符集

#2.CONCAT: 拼接字符串 
	SELECT CONCAT(first_name, '*', last_name) AS '姓名'
	FROM employees;

 #3.UPPER、LOWER(将字符转换大小写):
	SELECT UPPER('mike');
	SELECT LOWER('MIKE');
	#示例:将姓变大写,名变小写,然后拼接 
		SELECT CONCAT(UPPER(first_name), ' * ', LOWER(last_name)) AS '姓名'
		FROM employees;

 #4.SUBSTR、SUBSTRING(截取字符串,注:索引从1开始)
	#带2个参数:截取从指定索引处后面所有字符
		SELECT SUBSTR('李莫愁爱上了陆展元', 7) AS out_put;   #返回陆展元 
	#带3个参数:截取从指定索引处指定字符长度的字符
		SELECT SUBSTR('李莫愁爱上了陆展元', 1, 3) AS out_put;  #返回李莫愁
	#案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来
		SELECT 
			CONCAT( 
                   UPPER( SUBSTR(first_name, 1,1)),
                   LOWER( SUBSTR(first_name,2)))
			AS out_put
		FROM employees;

#5.INSTR:返回子串第一次出现的索引,如果找不到返回0
	SELECT INSTR('杨不悔爱上了殷六侠', '殷六侠') AS out_put;

#6.TRIM:去除字符前后的空格或其他指定的字符
	SELECT TRIM('    张  翠   山     ') AS out_put;
    SELECT TRIM('a' FROM'aaaaaaa张aa翠aaa山aaaaaa' ) AS out_put;

#7.LPAD:用指定的字符实现左填充至指定长度
	SELECT LPAD('殷素素', 10, '*') AS out_put;    #返回'*******殷素素'

    SELECT LPAD('殷素素', 2, '*') AS out_put;     #返回'殷素'

#8.RPAD:用指定的字符实现右填充至指定长度
	SELECT RPAD('殷素素', 12, 'ab') AS out_put;   #返回'殷素素ababababa'
    SELECT RPAD('殷素素', 2, '*') AS out_put;     #返回'殷素'       

#9.REPLACE:替换
	SELECT REPLACE('张无忌爱上了周芷若', '周芷若', '赵敏') AS out_put;   #返回'张无忌爱上了赵敏'
    SELECT REPLACE('张无忌周芷若爱上了周芷若', '周芷若', '赵敏') AS out_put;   #返回'张无忌赵敏爱上了赵敏'

数学函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#1.ROUND:四舍五入
	SELECT ROUND(1.65);      #返回2
    SELECT ROUND(-1.45);     #返回-1
    SELECT ROUND(1.567, 2);  #返回1.57
    
#2.CEIL:向上取整,返回>=该参数的最小整数 
	SELECT CEIL(1.002);      #返回2
    SELECT CEIL(-1.02);      #返回-1
	
#3.FLOOR:向下取整,返回<=该参数的最大整数
	SELECT FLOOR(9.99);      #返回9
    SELECT FLOOR(-9.99);     #返回-10

#4.TRUNCATE:截断,从小数点后保留几位(不进行四舍五入)
	SELECT TRUNCATE(1.646, 2);   #返回1.64
	SELECT TRUNCATE(1.646, 1);   #返回1.6
    
 #5.MOD:取余
	 /*
		mod(a,b)   : a - a/b *b
		mod(-10,-3):-10 - (-10)/(-3)*(-3)=-1
	*/
	SELECT MOD(10, 3);   #返回1
    SELECT 10%3;         #等价于mod取余的功能
    SELECT MOD(-10, -3); #返回-1
    SELECT MOD(-10, 3);  #返回-1
    SELECT MOD(10, -3);  #返回1

日期函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#1.NOW:返回当前系统日期+时间 
	SELECT NOW();

#2.CURDATE:返回当前系统日期,不包含时间
	SELECT CURDATE();
    
#3.CURTIME:返回当前系统时间,不包含日期 
	SELECT CURTIME();

#4.获取指定部分:年、月、日、小时、分钟、秒 
	SELECT YEAR(NOW()) AS '年';
    SELECT MONTH(NOW()) AS '月';        #返回'10'
    SELECT MONTHNAME(NOW()) AS '月';    #返回英文月份'October'
    SELECT DAY(NOW()) AS '日';
    SELECT HOUR(NOW()) AS '小时';
    SELECT MINUTE(NOW()) AS '分';
	SELECT SECOND(NOW()) AS '秒';
格式符 功能
%Y 四位的年份
%y 2位的年份
%m 月份(01,02,03,……,11,12)
%c 月份(1,2,3,……,11,12)
%d 日(01,02,……)
%H 小时(24小时制)
%h 小时(12小时制)
%i 分钟(00,01,02,03,04……59)
%s 秒(00,01,02,……59)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#5.str_to_date 将字符通过指定的格式转换成日期
	SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;
	
    #案例:查询入职日期为1992-4-3的员工信息
		SELECT *
        FROM employees
        WHERE hiredate = '1992-4-3';

		SELECT * 
        FROM employees 
        WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
    
#6.DATE_FORMAT:将日期转换成字符
	SELECT DATE_FORMAT(NOW(), '%y年%m月%d日') AS out_put;   #返回'19年10月07日'
    
    #案例:查询有奖金的员工名和入职日期(xx月/xx日 xx年)
		SELECT first_name, DATE_FORMAT(hiredate, '%m月/%d日 %y') AS '入职日期月/日 年'
        FROM employees
        WHERE commission_pct IS NOT NULL;

其他函数

1
2
3
SELECT VERSION();
SELECT DATABASE();
SELECT USER();

流程控制函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#1.IF函数: IF ELSE 的效果
	SELECT IF(10<5, '是', '否');   #返回'否'
    
    SELECT first_name, commission_pct, IF(commission_pct IS NULL, '无', '有') AS '有无奖金'
    FROM employees;

#2.CASE函数的使用一: switch case 的效果
	/*
		语法:
			CASE 要判断的字段或表达式
			WHEN 常量1 THEN 要显示的值1或语句1;(如果是值则不用分号)
			WHEN 常量2 THEN 要显示的值2或语句2;
			...
			ELSE 要显示的值n或语句n;
			END
	*/

	/*
		案例:查询员工的工资,要求
			部门号=30,显示的工资为1.1倍
			部门号=40,显示的工资为1.2倍
			部门号=50,显示的工资为1.3倍
			其他部门,显示的工资为原工资
	*/
		SELECT 
			first_name,
            department_id,
            salary AS '原始工资',
            CASE department_id
            WHEN 30 THEN salary*1.1
            WHEN 40 THEN salary*1.2
            WHEN 50 THEN salary*1.3
            ELSE salary
            END AS '新工资'
		FROM employees

#3.CASE 函数的使用二:类似于 多重if
	/*
		语法:
			CASE 
			WHEN 条件1 THEN 要显示的值1或语句1;(如果是值则不用分号)
			WHEN 条件2 THEN 要显示的值2或语句2;
			……
			ELSE 要显示的值n或语句n
			END
	*/
	/*
		案例:查询员工的工资的情况
			如果工资>20000,显示A级别
			如果工资>15000,显示B级别
			如果工资>10000,显示C级别
			否则,显示D级别
    */
		SELECT
			salary AS '原始工资',
			CASE
            WHEN salary > 20000 THEN 'A'
            WHEN salary > 15000 THEN 'B'
            WHEN salary > 1000  THEN 'C'
            ELSE 'D'
            END AS '工资级别'
		FROM employees;

习题

  1. 显示系统时间(注:日期+时间)

  2. 查询员工号,姓名,工资,以及工资提高百分之 20%后的结果(new salary)

  3. 将员工的姓名按首字母排序,并写出姓名的长度(length)

  4. 做一个查询,产生下面的结果 earns monthly but wants

Dream Salary
King earns 24000 monthly but wants 72000
  1. 使用 case-when,按照下面的条件:
job grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
1
产生下面的结果
Last_name Job_id Grade
k_ing AD_PRES A
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#1.
	SELECT NOW();
#2.
	SELECT employee_id, first_name, salary, salary*1.2 AS 'NEW salary'
    FROM employees;

#3.
	SELECT LENGTH(first_name) AS 'LENGTH', SUBSTR(first_name,1,1) AS '首字符', first_name
    FROM employees
    ORDER BY 首字符;

#4.
	SELECT CONCAT(last_name, 'earns', salary, 'monthly but wants', salary*3) AS 'Dream Salary'
    FROM employees
    WHERE salary=24000;

#5.
	SELECT last_name, job_id,
    CASE job_id
    WHEN job_id = 'AD_PRES' THEN 'A'
    WHEN job_id = 'ST_MAN' THEN 'B'
    WHEN job_id = 'IT_PROG' THEN 'C'
    WHEN job_id = 'SA_REP' THEN 'D'
    WHEN job_id = 'ST_CLERK' THEN 'E'
    END AS 'Grade'
    FROM employees
    WHERE job_id = 'AD_PRES';

分组函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
    功能:用作统计使用,又称为聚合函数或统计函数或组函数
    分类:
    	SUM 求和、AVG 平均值、MAX 最大值 、MIN 最小值 、COUNT 计算个数
    特点:
    	1、SUM、AVG一般用于处理数值型
    		MAX、MIN、COUNT可以处理任何类型
    	2、以上分组函数都忽略NULL值
    	3、可以和DISTINCT搭配实现去重的运算
    	4、COUNT函数的单独介绍
    		一般使用COUNT(*)用作统计行数
		5、和分组函数一同查询的字段要求是GROUP BY后的字段
*/

#1、简单 的使用
	SELECT SUM(salary) FROM employees;
    SELECT AVG(salary) FROM employees;
    SELECT MIN(salary) FROM employees;
    SELECT MAX(salary) FROM employees;
    SELECT COUNT(salary) FROM employees;
    
    SELECT 
		SUM(salary) AS '和', 
        AVG(salary) AS '平均',
        MAX(salary) AS '最高', 
        MIN(salary) AS '最低', 
        COUNT(salary) AS '个数'
    FROM employees;
    
    SELECT
		SUM(salary) AS '和', 
        ROUND(AVG(salary),2) AS '平均',
        MAX(salary) AS '最高', 
        MIN(salary) AS '最低', 
        COUNT(salary) AS '个数'    
    FROM employees; 
    
#2、参数支持哪些类型
	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;

#3、是否忽略null
	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 commission_pct 
    FROM employees;

#4、和distinct搭配
	SELECT SUM(DISTINCT salary), SUM(salary)
    FROM employees;

	SELECT COUNT(DISTINCT salary), COUNT(salary)
    FROM employees;
    
#5、count函数的详细介绍
	SELECT COUNT(salary) FROM employees;
	SELECT COUNT(*) FROM employees;
	SELECT COUNT(1) FROM employees;

	/*
		效率:
		MYISAM存储引擎下  ,COUNT(*)的效率高
		INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
    */

#6、和分组函数一同查询的字段有限制
	SELECT AVG(salary), employee_id
	FROM employees;         #显示的 employee_id 没有意义

习题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#1.查询公司员工工资的最大值,最小值,平均值,总和
	SELECT 
		MAX(salary) AS '最高', 
        MIN(salary) AS '最低',
        AVG(salary) AS '平均',
        SUM(salary) AS '和'
    FROM employees;

#2.查询员工表中的最大入职时间和最小入职时间的相差天数 (DIFFRENCE)
	SELECT MAX(hiredate), MIN(hiredate), DATEDIFF(MAX(hiredate),MIN(hiredate)) AS 'DIFFERENCE'
    FROM employees;
    
    SELECT DATEDIFF('1995-2-7','1995-2-6');
    
#3.查询部门编号为90的员工个数
	SELECT COUNT(*) AS '个数'
    FROM employees
    WHERE department_id = 90;