1、select子句和from子句。基本的查询语句,至少要有这两个子句。
#格式1:可以指定字段进行查询 select colName[,colName.....] from tableName #格式2:查询整张表: select * from tableName; #通配符*:如果是在select字句中,代替的是所有的字段。2、给查询显示的列,起别名【as】。
#格式: select ename [as] "员工姓名"[,colName as nickName....] from tableName [as] tableNickName3、where子句: 作用:起到条件限制约束等操作。有过滤的作用。 位置:放在 from子句后。
#格式: select colName from tableName where 条件。条件:关系运算符: >,>=,<,<=,=,!=,<>。
(1)null在条件中,应该使用is null或者is not null(2)范围查询:针对于某一个字段来说。 1:可以使用>,>=和<,<=来进行范围限制 2: 还可以使用between and来限制。
#格式: colName [not] between val1 and val2; #注意: between val1 and val2 相当于闭区间[val1,val2](3)集合作为条件写法:同一个字段有多个值的情况下使用。 使用:in或者not in
#格式: colName [not] in (元素1,元素2,....); #注意:in相当于or; not in相当于and。集合的其他用法: all与any
#格式: >all(元素1,元素2,元素3......) :大于集合中最大的元素。 <all(元素1,元素2,元素3......) :小于集合中最小的元素。 >any(元素1,元素2,元素3......) :大于集合中最小的元素。 <any(元素1,元素2,元素3......) :小于集合中最大的元素。 =any(元素1,元素2,元素3......) :等于集合中的任意元素=any可以用in替换 #注意:mysql数据库中,集合元素的来源只能基于一张表的查询。不能写定值。(4)模糊查询:like关键字
#格式: colName like value。 #通常与通配符%连用 # %:0或0个以上的字符 # _:匹配一个字符。 #例如:查询员工姓名第二字母是s的信息 ename like '_s%'(5)排序(order by)
#位置语法: select..from tableName [where 子句][order by 子句] #格式: order by colName [ASC|DESC][,colName1....[ASC|DESC]];#默认是升序排序。 #注意: 可以通过一个或多个字段排序。(6)去重(distinct)
#语法 select distinct colName,... from tableName... #distinct必须放在select关键字之后(7)分组查询(group by)
#位置语法 select...from tName [where 条件] [group by子句] [order by子句] #格式 group by Field1[,Field2]注意:在分组查询时,select子句中的字段,除了聚合函数外,只能写分组字段。
聚合函数:
count(Filed):统计指定字段的记录数。 sum(Filed):统计指定字段的和。 avg(Filed):统计指定字段的平均值 max(Filed):返回指定字段中的最大值。 min(Filed):返回指定字段中的最小值。 ifnull(field,value):如果field字段对应的值不是null,就使用 field的值,如果是null,就使用value。PS:聚合函数会忽略null值。 因此有时候需要使用函数:ifnull()
(8)having子句: 在分组查询时,有的时候可能需要再次使用条件进行过滤,这个时候不能where子句,应该使用having子句。
having子句后可以使用聚合函数。 位置:位于group by子句后一个完整的查询语句:
select..from..[where..][group by..][having..][order by..]执行顺序: from>>where>>group by>>having>>select>>order by
(9)关联查询
1、概念 当在查询时,我们所需要的数据不在一张表中,可能在两张表或多张表中。此时我们需要同时操作这些表。即关联查询。
2、等值连接 在做多张表查询时,这些表中应该存在着有关联的两个字段。我们使用某一张表中的一条记录与另外一张表通过相关联的两个字段进行匹配,组合成一条记录。
3、笛卡尔积 在做多张表查询时,我们使用某一张表中的每一条记录都与另外一张表的所有记录进行组合。比如表A有x条,表B有y条件,最终组合数为x*y,这个值就是笛卡尔积,通常没有意义。
4、内连接 只要使用了join on。就是内连接。查询效果与等值连接一样。
#格式 from 表A [inner] join 表B on 关联条件5、外连接: 在做多张表查询时,我们所需要的数据,除了满足关联条件的数据外,还有不满足关联条件的数据。此时需要使用外连接。会涉及到两个概念: 驱动表(主表):除了显示满足条件的数据,还需要显示不满足条件的数据的表。 从表(副表):只显示满足关联条件的数据的表。 外连接分为三种: 左外连接
#格式 from tableA left [outer] join tableB on 关联条件。 #表A是驱动表,表B是从表。右外连接
#格式 from tableA right [outer] join tableB on 关联条件 #表B是驱动表,表A是从表全外连接: 两张表的数据不管满不满足条件,都做显示。
#格式 from tableA full [outer] join tableB on 关联条件 #PS:mysql 不支持全外连接6、自连接:在多张表进行关联查询时,这些表的表名是同一个。即自连接。
(10)高级关联查询(嵌套查询):有的时候,我们要查询的数据, 一个简单的查询语句满足不了,并且我们使用的数据,表中不能直观体现出来。而是预先经过一次查询才会有所体现。那么先执行的查询,我们称之子查询。被子查询嵌入的查询语句称之为父查询。
比如需求:查询工资大于员工JONES工资的员工的信息。 子查询返回的数据特点: (1) 可能是单行单列的数据。 (2) 可能是多行单列的数据 (3) 可能是单行多列的数据 (4) 可能是多行多列的数据
1)子查询可以在where子句中
#查询工资大于员工JONES工资的员工的信息 select * from emp where sal>(select sal from emp where ename='jones');2)子查询可以在from子句中
#查询每个员工的工资,姓名和其部门的平均工资。 select emp.deptno,ename,sal,平均工资 from emp join (select deptno,avg(ifnull(sal,0)) 平均工资 from emp group by deptno) e on emp.deptno=e.deptno;3)子查询可以在having子句中
#查询部门平均工资大于30部门平均工资的部门平均工资,工资之和,最大工资,最小工资,总人数。 select avg(ifnull(sal,0)),sum(sal),max(sal),min(sal),count(*) from emp group by deptno having avg(ifnull(sal,0))>(select avg(ifnull(sal,0)) from emp where deptno=30);4)子查询可以在select字句中,相当于外连接的另外一种写法。
#查询每个员工的姓名,工资,及其部门的平均工资,工资之和。 select ename,sal, (select avg(ifnull(sal,0)) from emp a where a.deptno=b.deptno) avg_sal, (select sum(sal) from emp c where c.deptno=b.deptno ) sum_sal from emp b order by b.deptno;(10)分页查询:
#limit start size;第start行开始,查询size条数据 #limit size;szie是指查询size条数据 #例如:查询员工表,查询第一页的数据,每页10条。 select * from emp limit 0,10; #默认记录数从0开始