文章目录
- 1.Create
- 1.1单行数据+全列插入
- 1.2多行数据+指定列插入
- 1.3插入否则更新
- 1.4替换
- 2.Retrieve
- 2.1 select列
- 2.1.1全列查询
- 2.1.2指定列查询
- 2.1.3查询字段为表达式
- 2.1.4 为查询结果指定别名
- 2.1.5结果去重
- 2.2where 条件
- 2.2.1英语不及格的同学及英语成绩 ( < 60 )
- 2.2.2语文成绩在 [80, 90] 分的同学及语文成绩
- 2.2.3数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
- 2.2.4姓孙的同学 及 孙某同学
- 2.2.5语文成绩好于英语成绩的同学
- 2.2.6总分在 200 分以下的同学
- 2.2.7语文成绩 > 80 并且不姓孙的同学
- 2.2.8 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
- 2.2.9 null的查询
- 2.3 结果排序
- 2.3.1同学及数学成绩,按数学成绩升序显示
- 2.3.2同学及 qq 号,按 qq 号排序显示
- 2.3.3 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
- 2.3.4查询同学及总分,由高到低
- 2.3.5 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
1.Create
语法:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
示例:
创建一张学生表
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);
1.1单行数据+全列插入
-- 插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
-- 注意,这里在插入的时候,也可以不用指定id(当然,那时候就需要明确插入数据到那些列了),那么mysql会使用默认的值进行自增。
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO students VALUES (101, 10001, '孙悟空', '11111');
-- 查看插入结果
SELECT * FROM students;
1.2多行数据+指定列插入
插入两条记录,value_list 数量必须和指定列数量及顺序一致
insert students (sn,name) values
(20001,'曹孟德'),
(20002,'孙仲谋');
select * from students;
1.3插入否则更新
由于 主键 或者 唯一键 对应的值已经存在而导致插入失败
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师');
INSERT INTO students (sn, name) VALUES (20001, '曹阿瞒');
可以选择性的进行同步更新操作
语法:
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
insert students (id,sn,name) values(100,10010,'唐大师')
on duplicate key update sn=10010,name='唐大师';
冲突数据被更新
– ON DUPLICATE KEY 当发生重复key的时候
1.4替换
– 主键 或者 唯一键 没有冲突,则直接插入;
– 主键 或者 唯一键 如果冲突,则删除后再插入
replace students (sn,name) values (20001,'曹阿瞒');
select * from students;
2.Retrieve
语法:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
示例:
创建表结构
create table exam_result(
id int unsigned primary key auto_increment,
name varchar(20) not null comment'姓名',
chinese float default 0.0 comment'语文成绩',
math float default 0.0 comment'数学成绩',
english float default 0.0 comment'英语成绩'
);
插入测试数据
insert exam_result(name,chinese,math,english)values
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
2.1 select列
2.1.1全列查询
– 通常情况下不建议使用 * 进行全列查询
– 1. 查询的列越多,意味着需要传输的数据量越大;
– 2. 可能会影响到索引的使用。
select * from exam_result;
2.1.2指定列查询
– 指定列的顺序不需要按定义表的顺序来
select id,name,english from exam_result;
2.1.3查询字段为表达式
– 表达式不包含字段
select id,name,5 from exam_result;
– 表达式包含一个字段
select id,name,english+5 from exam_result;
– 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result;
2.1.4 为查询结果指定别名
语法:
SELECT column [AS] alias_name [...] FROM table_name;
SELECT id, name, chinese + math + english 总分 FROM exam_result;
2.1.5结果去重
SELECT math FROM exam_result;
– 98 分重复了
SELECT DISTINCT math FROM exam_result;
– 去重结果
2.2where 条件
比较运算符:
运算符 | 说明 |
---|---|
>,>=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
示例:
2.2.1英语不及格的同学及英语成绩 ( < 60 )
select name,english from exam_result where english<60;
2.2.2语文成绩在 [80, 90] 分的同学及语文成绩
SELECT name, chinese FROM exam_result WHERE chinese >= 80 AND chinese <= 90;
– 使用 BETWEEN … AND … 条件
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
2.2.3数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
select name,math from exam_result
where math=58
or math=59
or math=98
or math=99;
– 使用 IN 条件
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
2.2.4姓孙的同学 及 孙某同学
– % 匹配任意多个(包括 0 个)任意字符
select name from exam_result where name like '孙%';
– _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '孙_';
2.2.5语文成绩好于英语成绩的同学
– WHERE 条件中比较运算符两侧都是字段
SELECT name, chinese, english FROM exam_result WHERE chinese > english;
2.2.6总分在 200 分以下的同学
– WHERE 条件中使用表达式
– 别名不能用在 WHERE 条件中
SELECT name, chinese + math + english 总分 FROM exam_resultWHERE chinese + math + english < 200;
2.2.7语文成绩 > 80 并且不姓孙的同学
SELECT name, chinese FROM exam_result
WHERE chinese > 80 AND name NOT LIKE '孙%';
2.2.8 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
select name,chinese,math,english,chinese+math+english 总分 from exam_result where name like ' 孙_' or (chinese +math +english>200 and chinese < math and english>80);
2.2.9 null的查询
– 查询 students 表
– 查询 qq 号已知的同学姓名
SELECT name, qq FROM students WHERE qq IS NOT NULL;
– NULL 和 NULL 的比较,= 和 <=> 的区别
SELECT NULL = NULL, NULL = 1, NULL = 0;
SELECT NULL <=> NULL, NULL <=> 1, NULL <=> 0;
2.3 结果排序
语法:
– ASC 为升序(从小到大)
– DESC 为降序(从大到小)
– 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
示例:
2.3.1同学及数学成绩,按数学成绩升序显示
SELECT name, math FROM exam_result ORDER BY math;
2.3.2同学及 qq 号,按 qq 号排序显示
– NULL 视为比任何值都小,升序出现在最上面
SELECT name, qq FROM students ORDER BY qq;
– NULL 视为比任何值都小,降序出现在最下面
SELECT name, qq FROM students ORDER BY qq DESC;
2.3.3 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
– 多字段排序,排序优先级随书写顺序
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese;
2.3.4查询同学及总分,由高到低
– ORDER BY 中可以使用表达式
SELECT name, chinese + english + math FROM exam_result
ORDER BY chinese + english + math DESC;
– ORDER BY 子句中可以使用列别名
SELECT name, chinese + english + math 总分 FROM exam_result ORDER BY 总分 DESC;
2.3.5 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
– 结合 WHERE 子句 和 ORDER BY 子句
SELECT name, math FROM exam_result
WHERE name LIKE '孙%' OR name LIKE '曹%'
ORDER BY math DESC;