一、构造数据
为了操作方便,先构造以下数据
1、学生表
create table `student` (
`id` int unsigned primary key auto_increment,
`name` char(32) not null unique,
`sex` enum('男', '女') not null,
`city` char(32) not null,
`description` text,
`birthday` date not null default '1995-1-1',
`money` float(7, 2) default 0,
`only_child` boolean
) charset=utf8;
insert into `student` (`name`, `sex`, `city`, `description`, `birthday`, `money`, `only_child`) values
('郭德纲', '男', '北京', '班长', '1997/10/1', rand() * 100, True),
('陈乔恩', '女', '上海', NULL, '1995/3/2', rand() * 100, True),
('赵丽颖', '女', '北京', '班花, 不骄傲', '1995/4/4', rand() * 100, False),
('王宝强', '男', '重庆', '超爱吃火锅', '1998/10/5', rand() * 100, False),
('赵雅芝', '女', '重庆', '全宇宙三好学生', '1996/7/9', rand() * 100, True),
('张学友', '男', '上海', '奥林匹克总冠军!', '1993/5/2', rand() * 100, False),
('陈意涵', '女', '上海', NULL, '1994/8/30', rand() * 100, True),
('赵本山', '男', '南京', '副班长', '1995/6/1', rand() * 100, True),
('张柏芝', '女', '上海', NULL, '1997/2/28', rand() * 100, False),
('吴亦凡', '男', '南京', '大碗宽面要不要?', '1995/6/1', rand() * 100, True),
('鹿晗', '男', '北京', NULL, '1993/5/28', rand() * 100, True),
('关晓彤', '女', '北京', NULL, '1995/7/12', rand() * 100, True),
('周杰伦', '男', '台北', '小伙人才啊', '1998/3/28', rand() * 100, False),
('马云', '男', '南京', '一个字:贼有钱', '1990/4/1', rand() * 100, False),
('马化腾', '男', '上海', '马云死对头', '1990/11/28', rand() * 100, False);
2、成绩表
create table score (
`id` int unsigned primary key auto_increment,
`math` float not null default 0,
`english` float not null default 0
) charset=utf8;
insert into score (`math`, `english`) values (49, 71),
(62, 66.7), (44, 86), (77.5, 74), (41, 75), (82, 59.5),
(64.5, 85), (62, 98), (44, 36), (67, 56), (81, 90),
(78, 70), (83, 66), (40, 90), (90, 90);
二、常用的查询语句
1、select:字段表达式
- select既可以做查询,也可以做输出
- 示例:
select rand(); -- 随机数
select unix_timestamp(); -- 显示Unix时间戳
# 查询表数据
select id, name from student;
2、from子句
- 语法:select 字段 from 表名
- from后面是数据源,可以写多个数据源, 多个数据源时结果将会进行笛卡尔积运算。
3、where子句:按指定条件过滤
- 语法:select 字段 from 表名 where 条件;
- where是做条件查询,只返回结果为True的结果。
- 示例:
select name from student where city = '上海';
- 空值判断: is null | is not null
select `name` from `student` where `description` is null;
select `name` from `student` where `description` is not null;
- 范围判断
between ... and ...
not between ... and ...
select id, math from score where math between 60 and 70;
select id, math from score where math not between 60 and 70;
# 直接做比较判断
select * from score where math>=80 and english<=60;
4、having
- having:用于指定分组后的筛选条件
- where 与 having的区别
having的条件查询,只能包含在前面的搜索结果里 。
where只能识别数据表中存在的字段,即使是为字段设置的别名也不行 。
5、groud by:分组查询
- 语法:select 字段 from 表名 group by 分组字段 ;
- 按照某一字段进行分组, 会把该字段中值相同的归为一组, 将查询的结果分类显示, 方便统计。
- 示例:
# 报错,使用group需要将结果通过 “聚合函数” 拼接
select sex, count(id) from student group by sex;
# 使用group_concat()函数拼接结果
select sex, group_concat(name) from student group by sex;
6、order by:按字段排序
- order by 主要作用是排序
- 语法: select 字段 from 表名 order by 排序字段 asc|desc;
- 分为升序 asc 降序 desc, 默认 asc (可以不写)
- 示例:
select * from student order by age;
select * from student order by age desc;
7、where, order by , group by ,having 联合使用:
- 使用顺序:where >group by > having > order by。
- 示例:
select city, avg(money), group_concat(name), sum(money) from student where sex='男'
group by city having sum(money) > 70
order by sum(money);
8、limit:限制去除数量
- 语法:
# 从第 1 行到第 m 行
select 字段 from 表名 limit m;
# 从第 m + 1行开始,往下取 n 行
select 字段 from 表名 limit m, n;
# 跳过前 n 行, 取后面的 m 行
select 字段 from 表名 limit m offset n;
9、distinct:去重
- 示例:
# 查看学员城市
select distinct city from student;
10、dual表
- dual 是一个虚拟表, 仅仅为了保证 select ... from ... 语句的完整性
- 示例:
select now() from dual;