MySQL数据库基本操作04-DQL
简单查询
运算符
MySQL支持四种运算符:算数、比较、逻辑、位运算符
排序查询
聚合查询
-
count函数对null值的处理:
如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
-
sum和avg函数对null值的处理:
这两个函数忽略null值的存在,就好象该条记录不存在一样。
-
max和min函数对null值的处理:
max和min两个函数同样忽略null值的存在。
分组查询
select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
注:如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现
- 分组之后对统计结果进行筛选的话必须使用having,不能使用where
- where子句用来筛选 FROM 子句中指定的操作所产生的行
- group by 子句用来分组 WHERE 子句的输出。
- having 子句用来从分组的结果中筛选行
分页查询
-- 方式1-显示前n条
select 字段1,字段2... from 表明 limit n;
-- 方式2-分页显示
select 字段1,字段2... from 表明 limit m,n;
# m: 整数,表示从第几条索引开始,计算方式 (当前页-1)*每页显示条数
# n: 整数,表示查询多少条数据
-- 查询product表的前5条记录
select * from product limit 5 ;
-- 从第4条开始显示,显示5条
select * from product limit 3,5;
insert into select语句
insert into Table2(field1,field2,…) select value1,value2,… from Table1 # # 或者:
insert into Table2 select * from Table1
# 要求目标表Table2必须存在
create table pro2(pname varchar(20),price double);
insert into pro2(pname,price) select pname,price from product;
P55\P56 练习
select name,english from student;
select distinct * from student;
select name,(chinese+english+math) as total from student;
select name,(chinese+english+math+10) as total2 from student;
select * from student where english >90;
select * from student where (chinese+english+math) >200;
select * from student where english between 80 and 90;
select * from student where english not between 80 and 90;
select * from student where math in (89,90,91);
select * from student where name like '李%' order by (chinese+english+math) desc;
selcet gender,count(*) from student group by gender
order by count(*) desc;
-- --------------------------------------------------------
select * from emp where deptno != 10 order by empno ;
select * from emp where ename not like '_A%' and sal >1000 order by (sal+ifnull(comm,0))*12 desc;
select deptno,avg(sal) from emp group by deptno;
select deptno,job,max(sal) from emp group by deptno,job order by deptno;
select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
select ename,sal from emp where comm is not null;
select max(sal)-min(sal) from emp ;
正则表达式
正则表达式(regular expression)
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。
-- ^ 在字符串开始处进行匹配
SELECT 'abc' REGEXP '^a';
select * from product where pname regexp '^海';
-- $ 在字符串末尾开始匹配
SELECT 'abc' REGEXP 'a$';
SELECT 'abc' REGEXP 'c$';
select * from product where pname regexp '水$';
-- . 匹配任意单个字符,除换行符之外
SELECT 'abc' REGEXP '.b';
SELECT 'abc' REGEXP '.c';
SELECT 'abc' REGEXP 'a.';
-- [...] 匹配括号内的任意单个字符
SELECT 'abc' REGEXP '[xyz]'; #0
SELECT 'abc' REGEXP '[xaz]'; #1
-- [^...] 注意^符合只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
SELECT 'a' REGEXP '[^abc]'; #0
SELECT 'x' REGEXP '[^abc]'; #1
SELECT 'abc' REGEXP '[^a]'; #1
-- a* 匹配0个或多个a,包括空字符串。可以作为占位符使用.有没有指定字符都可以匹配到数据
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';
SELECT '' REGEXP 'a*';
-- a+ 匹配1个或者多个a,但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';
-- a? 匹配0个或者1个a
SELECT 'stb' REGEXP '.ta?b';
SELECT 'stab' REGEXP '.ta?b';
SELECT 'staab' REGEXP '.ta?b';
-- a1|a2 匹配a1或者a2,
SELECT 'a' REGEXP 'a|b';
SELECT 'b' REGEXP 'a|b';
SELECT 'b' REGEXP '^(a|b)';
SELECT 'a' REGEXP '^(a|b)';
SELECT 'c' REGEXP '^(a|b)';
-- a{m} 匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c';
SELECT 'auuuuc' REGEXP 'au{3}c';
-- a{m,} 匹配m个或更多个a
SELECT 'auuuuc' REGEXP 'au{4,}c';
SELECT 'auuuuc' REGEXP 'au{3,}c';
SELECT 'auuuuc' REGEXP 'au{5,}c'; #0
-- a{m,n} 匹配m到n个a,包含m和n
SELECT 'auuuuc' REGEXP 'au{3,5}c';
SELECT 'auuuuc' REGEXP 'au{4,5}c';
SELECT 'auuuuc' REGEXP 'au{5,10}c';
-- (abc) abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y';
SELECT 'xababy' REGEXP 'x(ab)*y';
SELECT 'xababy' REGEXP 'x(ab){1,2}y';