1.对数据的操作 增:insert into 表名 values(值1,值2...) insert into 表名(字段1,字段2.。。。)values(字段1的值,字段2的值。。。) 删 delete from 表名 where 条件 遍历删除所有数据:delete from 表名 直接清空表示据:truncat 表名 改 update 表名 set 修改后的数据 where 条件 查(核心): select * from 表名 where 条件 group by(分组) having (条件) order by(排序) limit(显示行数) 去重复:distinct as 取别名 关系运算符:> < = != >= <= 逻辑运算符:and or not in between an like:模糊查询 分组:group by 聚合函数:max min count avg sum order by:排序 默认升序asc 降序 desc 2.子查询 有些结果需要通过多次查询才可以得出,一个查询的结果只作为另一个查询的条件 这个条件有可能是单个数据、单个字段、一张表 单个数据: 例子:查询工资最高的人的信息 第一步查询最高的工资 SELECT MAX(salary) FROM dep 第二步:整合 select * from dep where salary=(SELECT MAX(salary) FROM dep) 例子:查询比江西省人数多的省份 第一步:查询江西省的人数 SELECT COUNT(*) FROM dep WHERE address='江西' 第二步:查询每个省的人数 SELECT address,COUNT(*)FROM dep GROUP BY address 整合:SELECT address,COUNT(*)FROM dep GROUP BY address having COUNT(*)>(SELECT COUNT(*) FROM dep WHERE address='江西') 例子:查询湖南省与江西省的平均年龄之差 第一步:查询湖南省的平均年龄 SELECT avg(age) FROM dep WHERE address='湖南' 第二步:查询江西省的平均年龄 SELECT avg(age) FROM dep WHERE address='江西' 第三步: SELECT (SELECT avg(age) FROM dep WHERE address='湖南')-(SELECT avg(age) FROM dep WHERE address='江西') 练习: 1.查询年龄最大的人的信息 第一步:查找最大年龄 select max(age) from dep 第二步:整合 SELECT * FROM dep WHERE age=(select max(age) from dep) 2.查询广东人中工资最低的人的信息 第一步:查询广东的最低工资 SELECT min(salary) FROM dep WHERE address='广东' 第二步:整合 SELECT * FROM dep WHERE salary=(SELECT min(salary) FROM dep WHERE address='广东') AND address='广东' 3.查询工资比平均工资高的人数 第一步:查询平均工资 SELECT avg(salary) FROM dep 第二步:整合 SELECT COUNT(*)FROM dep WHERE salary>(SELECT avg(salary) FROM dep) 4.查询平均年龄比刘雪峰年龄小的省份 第一步:查询刘雪峰的年龄 SELECT age FROM dep WHERE name='刘雪峰' 第二步查询每个省的平均年龄 select address,avg(age) from dep group by address 第三步整合: select address,avg(age) from dep group by address HAVING avg(age)<(SELECT age FROM dep WHERE name='刘雪峰') 5.查询年龄最大的人的工资与年龄最小的人的工资之差 第一步:查询最大年龄 select max(age)from dep 第二步:查询最小年龄 select min(age)from dep 第三步:查询最大年龄的工资 SELECT salary FROM dep WHERE age=(select max(age)from dep) 第四步:查询最小年龄的工资 SELECT salary FROM dep WHERE age=(select min(age)from dep) 第五步:整合 SELECT (SELECT salary FROM dep WHERE age=(select max(age)from dep))-(SELECT salary FROM dep WHERE age=(select min(age)from dep)) 一个字段: 例子:查询比湖南人年龄大的信息 解法一: 单个数据解法: SELECT max(age)FROM dep WHERE address='湖南' SELECT * FROM dep where age>(SELECT max(age)FROM dep WHERE address='湖南') 解法:2 字段解法: 第一步:插叙湖南的所有年龄 SELECT max(age)FROM dep WHERE address='湖南' 查询出来的结果是一个字段,有很多结果(23,30,33) 第二步:整合时候 SELECT * FROM dep WHERE age>ALL(SELECT age FROM dep WHERE address='湖南') 查询字段的年龄必须要大于23,30,33 age >23 and age >30 and age>33 all:将单个字段查询出来的数据进行比较,并用and进行连接 例子:查询所有经理的老乡 第一步:查询经理来自哪里 SELECT address FROM dep where job ='经理' 第二步:SELECT * FROM dep WHERE address =ANY(SELECT address FROM dep where job ='经理') AND job !='经理' 解释:查询出来的结果(广东或者江西) ANY/some:将单个字段查询出来的结果进行比较,并用or进行连接 address =广东 or address =江西 练习: 1.查询比广东人工资低的信息 解法1: SELECT * FROM dep WHERE salary<(SELECT MIN(salary)FROM dep where address='广东') 解法2: 第一步:查询广东的所有年龄 SELECT salary FROM dep where address='广东' 第二步整合: SELECT * FROM dep WHERE salary < ALL(SELECT salary FROM dep where address='广东') 2.查询与id 1-5之间年龄相同的人数 第一步:查询1-5之间的年龄 SELECT age FROM dep where id BETWEEN 1 AND 5 第二步整合: SELECT COUNT(*) FROM dep WHERE age =ANY(SELECT age FROM dep where id BETWEEN 1 AND 5 ) and NOT id BETWEEN 1 and 5 一张表: 例子:查询平均工资最高的岗位,显示岗位,平均工资 第一步:查找每个岗位的平均工资 SELECT job,AVG(salary) as avgsalary FROM dep GROUP BY job 第二步:查找表内最大的平均工资 select max(avgsalary) from (SELECT job,AVG(salary) as avgsalary FROM dep GROUP BY job)as avgjob 第三步整合: select * from (SELECT job,AVG(salary) as avgsalary FROM dep GROUP BY job)as avgjob where avgsalary=(select max(avgsalary) from (SELECT job,AVG(salary) as avgsalary FROM dep GROUP BY job)as avgjob) 例子:查询男人人数最多的省份,显示省份和人数 第一步:查询每个省的男人人数 SELECT address,sex,COUNT(*)FROM dep WHERE sex='男' GROUP BY address 第二步:查找最大的人数 SELECT MAX(a) FROM (SELECT address,COUNT(*)as a,sex FROM dep where sex='男' GROUP BY address)as b 第三步整合: SELECT * FROM (SELECT address,COUNT(*) as a,sex FROM dep where sex='男' GROUP BY address) as b WHERE a=(SELECT MAX(a) FROM (SELECT address,COUNT(*)as a,sex FROM dep where sex='男' GROUP BY address)as b) 1.多表查询 当查询的数据来自多张表时,需要用到多表连接查询 如果不找出表的连接关系,会产生笛卡尔积效应,会产生大量无意义的数据,只会显示按条件连接进行匹配的数据 用法 select * from 表1,表2... where 连接关系 例子:查询万宇所在的班级 SELECT name,class,grade FROM student,class WHERE student.cid=class.cid AND name='万宇' 例子:查询一年级有多少人 SELECT grade,COUNT(*) FROM student,class WHERE student.cid=class.cid AND grade='一年级' 例子:查询每个班的女生人数 SELECT grade,class,sex,COUNT(*)FROM student,class WHERE student.cid=class.cid AND sex='女' GROUP BY grade,class inner join 内连接:只会显示按条件连接进行匹配的数(效率会更高) 用法:select * from 表1 inner join 表2 on 连接关系 例子:将student 与class 表进行内连接 SELECT * FROM class INNER JOIN student ON student.cid=class.cid 例子:查询万宇的信息 select * from class INNER JOIN student ON student.cid=class.cid where name='万宇' left join:左表为主,按条件显示匹配的数据,显示左表的所有数据,右表无数据显示 null 例子:将class 与 student 表 进行左连接 SELECT * FROM class LEFT JOIN student ON student.cid=class.cid 例子:统计每个年级都多少个人 SELECT grade,class,COUNT(student.cid)FROM class LEFT JOIN student ON student.cid=class.cid GROUP BY grade,class 例子:统计每个班级的女生人数 SELECT grade,class,sex,COUNT(student.cid)FROM class LEFT JOIN student ON student.cid=class.cid WHERE sex='女' GROUP BY grade,class right join:右表为主,按条件显示匹配的数据,显示右表的所有数据,左表无数据显示null 例子:将class 与 student 表 进行右连接 SELECT * FROM class RIGHT JOIN student ON student.cid=class.cid 例子:查询班级为空的学生信息 SELECT * FROM class RIGHT JOIN student ON student.cid=class.cid where class.cid is null 例子:查询空的班级 SELECT grade,class FROM class as c LEFT JOIN student as s ON c.cid=s.cid WHERE s.cid IS NULL 全连接 union:自动去重复 用法:左连接 +右连接 将 student 表与 class 表全连接 SELECT * FROM student LEFT JOIN class ON student.cid=class.cid UNION SELECT * FROM student RIGHT JOIN class ON student.cid=class.cid 自连接:不是特有的连接方式,只是一种用法,本质就是把一张表分成了多张表,找到这两张表的连接关系 注意事项。查询出来的表要取别名 查询每个员工的编号,姓名,与他领导的姓名 先定义一张员工表 SELECT * from emp 再次定义领导表 SELECT * from emp 找出连接关系:员工的领导编号等于 领导的员工编号 SELECT yuangongbiao.empno,yuangongbiao.ename,lingdao.ename FROM (SELECT * from emp)AS yuangongbiao,(SELECT * from emp)as lingdao where yuangongbiao.mgr=lingdao.empno SELECT yuangong.empno,yuangong.ename,lingdao.ename FROM emp as yuangong,emp as lingdao WHERE yuangong.mgr=lingdao.empno (不会显示king这个员工) 左连接: SELECT yuangong.empno,yuangong.ename,lingdao.ename,lingdao.empno FROM emp as yuangong LEFT JOIN emp as lingdao ON yuangong.mgr=lingdao.empno