下面是表名和表数据
1.MySQL的最原始查询
SELECT salary, salary+1000 new_salary
FROM employees;
由图可看出来:字段名 新的别名。
2.过滤
2.1查询薪水在6000-10000之间
SELECT first_name,salary
FROM employees
#where salary>=6000 && salary<=10000;
#另一种写法
#where salary>=6000 and salary<=10000;
#还有一种
WHERE salary BETWEEN 6000 AND 10000;
2.2查询30和50号部门中所有的员工
SELECT first_name,department_id
FROM employees
#where department_id=30 || department_id=50;
#where department_id=30 or department_id=50;建议这个
WHERE department_id IN(30,60);#和上面的都一样
2.3员工的奖金率为null的员工是谁
SELECT first_name,commission_pct
FROM employees
WHERE commission_pct IS NULL;#不能写成=null
反过来,查询不为null的员工
WHERE commission_pct IS NOT NULL;
2.4查询员工工资不在6000-10000之间的
SELECT salary,first_name
FROM employees
WHERE salary NOT BETWEEN 6000 AND 10000;
3.模糊查询
3.1查询员工的姓名中包含f的有哪些
SELECT first_name
FROM employees
WHERE first_name LIKE '%f%';#%表示任意个数的任意字符
3.2查询员工中姓名中第二个字符为d的员工有哪些
SELECT first_name
FROM employees
WHERE first_name LIKE '_d%';#%_表示任意一个字符 \_表示_
3.3escape:指定转义字符
SELECT first_name
FROM employees
WHERE first_name LIKE '_$_%' ESCAPE '$';#指定$为转义字符
再换一个
SELECT first_name
FROM employees
WHERE first_name LIKE '_p_%' ESCAPE 'p';
3.4查询员工姓名中既包含a又包含e的有那些
SELECT first_name
FROM employees
WHERE first_name LIKE '%a%e%'OR first_name LIKE '%e%a%';
#或者:where first_name like'%a%' and first_name like'%e%';
4.排序 1.asc-升序 2.desc-降序
4.1查询员工姓名和薪水并按照薪水排序 默认升序
SELECT first_name,salary
FROM employees
ORDER BY salary DESC;
#ORDER BY salary asc;
4.2查询80号部门的所有员工的姓名和薪水并按照薪水升序
SELECT first_name,salary
FROM employees
WHERE department_id=80
ORDER BY salary ASC;
4.3查询给员工薪水+1000后的工资降序
SELECT first_name,salary,salary+1000 new_salary
FROM employees
ORDER BY new_salary DESC;
4.4查询所有员工的名字,薪水,部门号。并对部门号将进行降序,若部门号一样,按薪水升序
SELECT first_name,salary,department_id
FROM employees
ORDER BY department_id DESC ,salary ASC;
5.多表查询
以下是sql92语法
5.1查询员工的姓名和部门名称
SELECT first_name,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;
5.2查询员工的姓名,部门号,部门名称
在多表查询中若查询的字段是唯一的,那么可以在字段名前不用加表名。若不是唯一,
还是加上比较好。
在两个表中,如果字段是唯一的,它会需要查找所有的表来确定查找的字段;
若加上表明的话,它只会查找一个表,更有效率。
SELECT employees.`first_name`,departments.`department_name`,departments.`department_id`
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;
如果表名太复杂,可以起名;数据库是先执行 from 再执行其他的;
SELECT d.`first_name` a,e.`department_name` b,e.`department_id` c
FROM employees d,departments e
WHERE d.`department_id`=e.`department_id`;
若没有where,则会产生的卡尔基的问题,也就是3*3,4*4那种意思;
SELECT d.`first_name` a,e.`department_name` b,e.`department_id` c
FROM employees d,departments e
以下是sql99语法:
select 字段名1,字段名2,....
from 表名1 join 表名2
on 连接条件
join 表名3
on 连接条件
.......
where 过滤条件
order by 字段名1 asc/desc, 字段名2 asc/desc,......
以下等值连接:连接条件使用的是等号 = ;
以下非自连接:连接的两张表不是同一张。
5.3查询员工的姓名,部门号,部门名称
SELECT d.`first_name` a,e.`department_name` b,e.`department_id` c
FROM employees d JOIN departments e
ON d.`department_id`=e.`department_id`;
以下自连接:同一张表;
5.4查询员工姓名以及该员工的管理者的姓名
SELECT e1.`first_name` 员工姓名,e2.`manager_id`
FROM employees e1 JOIN departments e2 #e1:当员工表,e2:当管理者表,其实为一张表;
ON e1.`manager_id`=e2.`department_id`
以下非等值连接
5.5查询员工的薪水及等级
SELECT e1.`first_name` , j.`GRADE`
FROM employees e1 JOIN job_grades j
#on e1.`salary` >= j.`LOWEST_SAL`and e1.`salary`<=j.`HIGHEST_SAL`;
#还可用这种beteen
ON e1.`salary` BETWEEN j.`LOWEST_SAL`AND j.`HIGHEST_SAL`;