- 按多字段分组查询
按照同一个分公司、同一个部门查询员工的平均工资:
USE test;
SHOW TABLES;
SELECT
AVG(salary) 平均工资,department 部门,branch_company 分公司
FROM
employee
GROUP BY
department,branch_company;
- 添加排序的分组查询
对上述得到的平均工资降序排序:
USE test;
SHOW TABLES;
SELECT
AVG(salary) 平均工资,department 部门,branch_company 分公司
FROM
employee
GROUP BY
department,branch_company
ORDER BY
平均工资
DESC;
- 连接查询——多个表之间的字段值相互匹配
USE test;
SHOW TABLES;
SELECT
`name`,job
FROM
employee_job,job
WHERE
employee_job.job_id=job.job_id;
表名:employee_job
name | job_id |
---|---|
Justin | 2 |
Nancy | 2 |
Tom | 1 |
Lee | 3 |
Thomas | 1 |
Douglas | 4 |
表名:job
jod_id | job |
---|---|
1 | 职工 |
2 | 主管 |
3 | 部门经理 |
4 | 总监 |
例如上述两个表中,我们要将第一个表中员工的工作职务编号与第二个表中的职务相匹配,常规方法易导致笛卡尔集错误。
USE test;
SHOW TABLES;
SELECT
`name`,job
FROM
employee_job,job;
显然这样做是分别拿第一个表中的每一个name字段与第二个表中的所有job字段相匹配。
正确代码:
USE test;
SHOW TABLES;
SELECT
`name`,job
FROM
employee_job,job
WHERE
employee_job.job_id=job.job_id;
sql99标准的等值连接:
USE test;
SHOW TABLES;
SELECT
`name`,job
FROM
employee_job
INNER JOIN
job
ON
employee_job.job_id=job.job_id;
如果最终结果我还想显示每个员工所属部门的部门编号,然而我们发现两个表中都有job_id字段,这时需要进行限定:
USE test;
SHOW TABLES;
SELECT
`name`,job.job_id,job
FROM
employee_job,job
WHERE
employee_job.job_id=job.job_id;
即代码第四行需指定要显示的是job表中的job_id字段,否则会报错。
我们也可以给表起别名,从而简化代码:
USE test;
SHOW TABLES;
SELECT
`name`,j.job_id,job
FROM
employee_job AS e,job AS j
WHERE
e.job_id=j.job_id;
也可以连接查询多个表,多个筛选条件用and连接:
USE test;
SHOW TABLES;
SELECT
`name`,j.job_id,job,bonus_rate
FROM
employee_job AS e,job AS j,employee AS em
WHERE
e.job_id=j.job_id
AND
e.`name`=em.employee_name;