💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[toc] # 一、基本查询 ## 1.查询表中多个字段 ~~~ select salary,email from employees; //字段之间逗号隔开 ~~~ ## 2.查询表中的所有字段 ~~~ select * from employees; ~~~ ## 3.起别名 ~~~ //1.使用as select last_name as 姓,first_name as 名 from employees; //2.使用空格 select last_name 姓,first_name 名 from employees; ~~~ ## 4.去重 ~~~ //查询员工表中涉及到的所有部门的编号(关键字:distinct) select distinct department_id from employees; ~~~ ## 5.+号的作用 MySQL中+号仅仅只有一个功能:运算符 ~~~ select ‘132’+90; //字符型会试图转成数字型,若转换成功则继续做加法 select ‘Jack’+90; //若转换失败,字符串部分转换为0 select null+10; //只要其中一方为null,结果必为null。(此处需要ifnull(null,0)方法避免结果为null) ~~~ # 二、条件查询 语法 ~~~ select 查询列表 from 表名 where 筛选条件; ~~~ ## 1.按条件表达式查询 ~~~ //查询工资>12000的员工信息 select * from employees where salary>12000; ~~~ ## 2.按逻辑表达式筛选 ~~~ //查询工资在10000到20000之间的员工信息 select * from employees where salary>=10000 and salary<=20000; ~~~ ## 3.模糊查询 ~~~ /*like 一般和通配符使用:% 任意多个字符,包含0;_任意单个字符 between ... and ... 在...区间内 in(x,y,z) 在x,y,z这三个值之中 is null 为空 */ //查询员工名中第二个字符为_的员工名 select last_name from employees where last_name like '_$_%' escape '$'; ~~~ # 三、分组函数 功能:用作统计使用 分类:sum 求和 ;avg 平均值;max 最大值;min 最小值;count 计算个数 # 四、排序查询 语法 ~~~ select 查询列表 from 表名 where 条件 order by 排序的字段 +(asc/desc) //order by子句在查询语句的最后面,默认为升序 ~~~ # 五、常见函数 ## limit方法 limit子句用于限制查询结果返回的数量 ~~~ limit i,n i:为查询结果的索引值(默认从0开始); n:为查询结果返回的数量 注意:limit一般用在SQL语句的最后!!! ~~~ ## case函数方法 ~~~ //流程控制函数case 1.case函数方法一:类似java里switch case的效果 SELECT salary 原始工资,department_id, 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; ~~~ 结果如下,注意case是在<b>select和from中间</b>,处在一个比较靠前的位置,注意select上倒数第二个字段要逗号,<b>end as 后面接的才是最后一个字段</b>。还有就是如果when后面接的是字符串一定要加<b>引号</b>。 ![](https://box.kancloud.cn/c76fce3b1138ca7bbe22184da98b7049_302x162.png) ~~~ 2.case函数方法二:类似if else //此方法when后面是条件表达式,所以记住case后面什么都不写 SELECT salary, CASE WHEN salary>20000 THEN 'A' WHEN salary>15000 THEN 'B' WHEN salary>10000 THEN 'C' ELSE 'D' END AS 工资级别 FROM employees; ~~~ # 六、分组查询 语法 ~~~ select 字段 from 表 【where 筛选条件】 group by 分组字段 【having 筛选条件】 【order by 排序字段】 ~~~ ## where和having区别 <b>where主要对原始表中的字段进行筛选 having主要对原始表中不存在的字段进行筛选</b> ## 分组查询小技巧 看到<b>“每个”</b>来形容的字段就是要分组的字段 分组查询中,select后面接的字段基本是由<b>两部分</b>组成: - 1.分组函数如:sum,avg,min,max,count。 - 2.后面要分组的字段,即group by后面接的字段。 # 七、连接查询 ## 等值连接查询 ~~~ //案例:查询有奖金的员工名、部门名 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 e.employee_id,e.first_name,m.employee_id,m.last_name from employees e,employees m where e.manager_id = m.employee_id; ~~~ 这里的就是同一个表起了两个别名,我们假设第一个表里是员工,第二个表里是上司,然后将两张表按上司和员工的关系连接即可查询到相应的结果。 ## sql99查询语法 1.等值查询 ~~~ SELECT e.department_id,job_id,location_id FROM employees e JOIN departments d ON e.department_id=d.department_id WHERE e.department_id=90; //两个表的等值连接join里写要连接的表,on后面写两张表连接的条件,where后接筛选条件 ~~~ 2.多表连接 ~~~ SELECT j.job_id,j.job_title,department_name,MIN(salary) FROM employees e JOIN departments d ON e.department_id=d.department_id JOIN jobs j ON j.job_id=e.job_id GROUP BY job_id,department_name; //多表连接的话用多个join和on组合即可实现 ~~~ # 八、子查询 ## 1.where或having后面 特点: ①子查询放在小括号内 () ②子查询一般放在条件的右侧 工资>(子查询) ③标量子查询,一般搭配着单行操作符使用 ~~~ //1.标量子查询 案例:查询 最低工资大于50号部门最低工资的部门 部门id和其最低工资 ①查询50号部门的最低工资 SELECT MIN(salary) FROM employees WHERE department_id = 50 ②查询每个部门的最低工资 SELECT MIN(salary),department_id FROM employees GROUP BY department_id ③ 在②基础上筛选,满足min(salary)>① SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>( SELECT MIN(salary) FROM employees WHERE department_id = 50 ); //2.列子查询:只有一列,可以有多行 案例:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工 的员工号、姓名、job_id 以及salary SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<( SELECT MIN( salary) FROM employees WHERE job_id = 'IT_PROG' ) AND job_id<>'IT_PROG'; //3.行子查询:只有一行,可以多列 案例:查询员工编号最小并且工资最高的员工信息 SELECT * FROM employees WHERE (employee_id,salary)=( SELECT MIN(employee_id),MAX(salary) FROM employees ); //注意这里有重点,子查询还可以这样写where(字段1,字段2)=(select 目标1,目标2 from 表名),保证字段和目标一一对应即可。 ~~~ ## 2.from或者join后面 <b>子查询的结果可以充当一张表,要求必须起别名</b> ~~~ 案例:查询各部门中工资比本部门平均工资高的员工的员工号、姓名和工资 SELECT e.employee_id,e.first_name,e.salary FROM employees e JOIN (SELECT avg(salary) a, department_id FROM employees GROUP BY department_id) d on e.department_id=d.department_id WHERE salary>d.a; //注意这里,就是用子查询建了一个包含平均工资和部门的表,然后按照部门名相同连接起来,再做工资的筛选。 ~~~ ## 3.where exists后面(相关子查询) where exists的返回值是0或1,如果子查询存在返回1,否则返回0。 ~~~ 案例:查询有员工的部门名 SELECT department_name FROM departments d WHERE EXISTS( SELECT * FROM employees e WHERE d.`department_id`=e.`department_id` ); ~~~ # 九、联合查询 语法 ~~~ 查询语句1 union 查询语句2 ~~~ 应用场景:要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息必须一致。 ~~~ //引入的案例:查询部门编号>90或邮箱包含a的员工信息 SELECT * FROM employees WHERE email LIKE '%a%' UNION SELECT * FROM employees WHERE department_id>90; ~~~ 注意点: 1.要求多条查询语句的列数和查询的<b>字段要一致</b> 2.union关键字默认去重,如果使用union all可以包含重复项