@(笔记)[MarkDown|我的博客|数据库]
select count( [* | all | distinct] expr) from 表名;
select sum([all | distinct] expr) as 别名 from 表名;
select avg(mark) as ‘平均成绩’ from sutdent
where studentID = 10;
输出表student中studentID为10的所有mark的平均值
select max(mark) as '最高成绩', min(mark) as '最低成绩'
from student
where examID = 6;
mysql常用函数
将表按条件分组,然后在组中查找需要的值
select 列A, 聚合函数(聚合函数规范)
from 表名
where 过滤条件
group by 列A;
当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
如果where在group by前面,并不是从分组中查询
如果where在group by后面,则是从分组中查询需要的结果
select
from
where 条件中不能有聚合函数
group by
[where]
having 条件中都是聚合函数,就在选出的分组中再次筛选
order by 如果需要,最后进行排序
注意,WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。
LIMIT用来限定查询结果的起始行,以及总行数。
SELECT * FROM emp LIMIT 0, 5;
注意,起始行从0开始,即第一行开始!
SELECT * FROM emp LIMIT 3, 10;
如果一页记录为10条,希望查看第3页记录应该怎么查呢?
查询页的下标 = (要查询的页数 - 1) * 每页记录的行数
select 列名1[, 列名2,...]
from 数据源
[where condition];
*
代表所有的列select concat(teacher_name,'xxx')
from teacher_table;
在mysql中,字符串和null连接会返回null,
对于其他一些数据库,如果让字符串和null连接,会把null当成空字符串处理
select distinct student_name ,java_teacher
from student_table;
运算符 | 含义 |
---|---|
expr1 between expr2 and expr3 | 要求expr2<=expr1<=expr3 |
expr1 in (expr2,expr3,..) | 要求expr1等于括号内任意表达式的值 |
like | 字符串匹配,like后面的字符串支持通配符 |
is null | 要求制定值等于null |
= | 是否相等 |
<> | 不相等 |
:= | 赋值 |
SQL支持2个通配符
- 下划线 _ :代表一个任意的字符
- 百分号 %:代表任意多个字符
当查询中需要使用到下划线或百分号时,可以使用\
转义,
也可使用escape
关键字
select * from student_table
where student_name like '\_%' escape '\';
SQL提供了 and
和 or
来组合2个条件,并提供not
来对逻辑表达式求否.
select * from student_table
where stduent_name like '__' and student_id > 3;
运算符 | 优先级(小的优先) |
---|---|
所有的比较运算符 | 1 |
not (非) | 2 |
and (且) | 3 |
or (或者) | 4 |
括号的优先级最高,所以可以使用括号来改变逻辑运算符优先级
select * from student_table
where (student_id > 3 or student_name > '张') and java_teacher > 1;
查询结果默认按插入顺序排序,如果需要查询结果按某列值得大小进行排序,
则可以使用 order by
order by 列名1 [desc] ,列名2,列名3,...;
上面语法进行排序时可以采用列名,列序号和列别名.
进行排序时默认进行升序排序,如果想按降序排列,可以写上 desc
关键字
与之对应的是asc
关键字
下面的语句选出student_table中所有的记录,然后按java_teacher列的升序排列
select * from student_table
order by java_teacher;
如果需要按多行排序,则每行的asc和desc必须单独指定,
如果指定了多个排序列,则第一个排序列是又要排序列,只要当第一列中存在多个相同的值时,第二列才会起作用
select * from student_table
order by java_teacher desc , student_name;
当java_teacher列的值相同时,按照student_name列的升序排列.
连接查询
外链接
自然连接
子查询
select * from t1 union select * from t2;
select * from t1 union all select * from t2;
被合并的2个结果必须列数,类型一致
连接查询就是求出多个表的乘积,例如t1和t2连接,那个查询出的结果就是t1*t2
就这是笛卡尔积
select * from emp,dept
where emp.deptno = dept.depton;
标准格式:
select * from empe
inner join dept
on empe.deptno = dept.deptno;
select * from 表1
natural join 表2
系统自动找到两张连接的表中名称和类型完全一致的列
先查询出左表,然后查询右表,右表中满足条件的显示出来,不满足的显示为null
SELECT * FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
同左外连接的效果相反,先把右表中所有的记录查出来,然后左表满足条件的显示,不满足的显示为null
SELECT * FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
在mysql中实现外全连接
SELECT * FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
union
SELECT * FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。
两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了
子查询出现的位置:
当子查询出现在where后作为条件时,还可以使用如下关键字:
子查询结果集的形式
select * from 表1 where 列1 [=,>,<,>=,<=,!=] (select 列 from 表 where 条件)
select * from 表where (列1,列2) in (select 列1,列2 from 表 where 条件)
select * from 表 where 列1 [in ,all ,any ] (select 列 from 表 where 条件)
select * from 表1,(select * from …) where 条件