数据库||基本查询select

表的增删改查增删改查

Create
Retrieve
Update
Delete

1.增(Insert)

  • 语法
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 数量
必须和定义表的列的数量及顺序一致

INSERT INTO students VALUES (100, 10000, '干将', NULL);
Query OK, 1 row affected (0.02 sec);
INSERT INTO students VALUES (101, 10001, '莫邪', '11111');
Query OK, 1 row affected (0.02 sec);
  • 查看结果

在这里插入图片描述

1.2: 多行数据 + 指定列插入

插入两条记录,value_list 数量
必须和指定列数量及顺序一致

INSERT INTO students (id, sn, name) VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');
  • 查看结果

在这里插入图片描述

1.3: 插入否则更新
  • 主键冲突
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师');
  • 提示错误

ERROR 1062 (23000): Duplicate entry ‘100’ for key ‘PRIMARY’

  • 唯一键冲突
INSERT INTO students (sn, name) VALUES (20001, '曹阿瞒');

  • 提示错误

ERROR 1062 (23000): Duplicate entry ‘20001’ for key ‘sn’

  • 可以同时进行同步更新操作语法
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
Query OK, 2 rows affected (0.47 sec)
-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新
-- 通过 MySQL 函数获取受到影响的数据行数
SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
1.4:替换
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
Query OK, 2 rows affected (0.00 sec)
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入

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 '同学姓名',
yuwen float DEFAULT 0.0 COMMENT '语文成绩',
shuxue float DEFAULT 0.0 COMMENT '数学成绩',
yingyu float DEFAULT 0.0 COMMENT '英语成绩'
);
  • 插入数据
INSERT INTO exam_result (name, yuwen, shuxue, yingyu) 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全列查询
select * from  exam_result;
  • 查询结果

在这里插入图片描述

2.2:指定列查询
SELECT id, name, yingyu FROM exam_result;
  • 查询结果

在这里插入图片描述

2.3:查询字段为表达式
  • 字段查询
select id,name,yingyu*1.5 from exam_result;

在这里插入图片描述

  • 给查询结果的列重新起名
select id,name,yingyu*1.5  yingyu_result from exam_result;
  • 查询结果

在这里插入图片描述

2.4:结果去重
  • 关键字:distinct
  • 指令
SELECT DISTINCT shuxue FROM exam_result;
  • 结果比对

在这里插入图片描述

2.5:WHERE 条件
2.5.1:比较运算符

在这里插入图片描述

2.5.2:逻辑运算符

在这里插入图片描述

  • 案例一
  • 查询英语成绩不及格的同学的姓名和成绩
select name,yingyu
from exam_result
where yingyu<60;
  • 结果查询

在这里插入图片描述

  • 案例二
  • 语文成绩在 [80, 90] 分的同学及语文成绩
select name,yuwen
from exam_result
where yuwen between 80 and 90;
  • 查询结果

在这里插入图片描述

select name,yuwen
from exam_result
where yuwen>=80 and yuwem<=90;
  • 案例三
  • 数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
select name,shuxue
from exam_result
where shuxue in(58,59,98,99);

-- 等价于
select name,shuxue
from exam_result
where shuxue=58 or shuxue=59 or shuxue=98 or shuxue=99;
  • 查询结果

在这里插入图片描述

  • 案例四
  • 查找姓莫的同学
select name
from exam_result
where name like '莫%';
  • 查询名字中第二个字是悟的同学的全部信息
select *  
from exam_result 
where name like '_悟%';
  • 查询结果

在这里插入图片描述

  • 向表中插入一个名字(加入这个名字中下划线"_")
insert into exam_result(name,yuwen,shuxue,yingyu) 
value ('G_Jack',98,99,87);
  • 查找名字为G_开头的同学的信息
select * 
from exam_result 
where name like   "G/_%" escape "/";
  • 转义字符和通配符的比较

在这里插入图片描述

  • 案例五
  • 查询总成绩<200的学生信息
select name, yuwen+shuxue+yingyu grade
from exam_result
where (yuwen+shuxue+yingyu)<200;
  • 查询结果

在这里插入图片描述

  • 案例六
  • 语文成绩 > 80 并且不姓孙的同学
select name,yuwen
from  exam_result
where yuwen>80 and name not like '孙%';
  • 查询结果

在这里插入图片描述

  • 案例七
  • 孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
select name,yuwen,shuxue,yingyu,yuwen+shuxue+yingyu 总分
from exam_result 
where name like "孙%" or
( yuwen+shuxue+yingyu >200 and yuwen<shuyue and yingyu>80);
  • 查询结果

在这里插入图片描述

  • 案例八
  • NULL 的查询
  • 查询信息表中qq号为空的人的信息
select *
from students
where qq is null;
  • 查询结果

在这里插入图片描述

  • 查询qq不为null的人的信息
select *
from students
where qq is not null;
  • 查询结果

在这里插入图片描述

2.5.3:结果排序
  • 语法
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序

  • 案例一
  • 同学及数学成绩和语文成绩,按数学成绩升序显示,语文成绩降序
-- 多字段排序,排序优先级随书写顺序
select name,shuxue,yuwen
from exam_result
order by  shuxue desc,yuwen ;
  • 查询结果

在这里插入图片描述

  • 案例二
  • 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
select name,shuxue
from exam_result
where name like '孙%' or name like '曹%'
order by shuxue desc ;
  • 查询结果

在这里插入图片描述

2.5.4: 筛选分页结果
  • 语法
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 n 开始,筛选 s 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s OFFSET n;
  • 建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
  • 在操作的数据库数据量比较大的情况下,我们应当选择该方法来帮助自己理清头绪

  • 案例一:从0开始筛选n条结果

  • 查看exam_result表中的前三条数据.

select * from exam_result order by id limit 3;

在这里插入图片描述

  • 案例二:从s开始筛选n条结果
  • 选择从3开始的4条记录
select * from exam_result order by id limit 3,4;

在这里插入图片描述

  • 案例三:从 n 开始筛选 s条结果比第二种用法更明确,建议使用

  • 选择从第4条开始的3条数据

select * from exam_result order by id limit 3 offset 4;

在这里插入图片描述

3.Update

3.1:语法
UPDATE table_name 
SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
  • 原始表
    在这里插入图片描述
  • 案例一:将孙悟空同学的数学成绩变更为 99 分
update exam_result
set shuxue=99  
where name='孙悟空';
  • 案例二: 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
 update exam_result 
 set shuxue=60,yuwen=70 
 where name='曹孟德';

在这里插入图片描述

  • 案例三:将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
update exam_result 
set shuxue=shuxue+30 
order by shuxue+yingyu+yuwen 
limit 3;
  • 案例四:将所有同学的语文成绩更新为原来的 2 倍
update exam_result 
set yuwen=yuwen*2 
order by yuwen;

在这里插入图片描述

4.Delete

4.1:语法
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
4.2:实例
  • 案例一: 删除孙悟空同学的考试成绩
delete from exam_result 
where name='孙%';

在这里插入图片描述

  • 案例二: 删除整张表数据
delete from exam_result;

在这里插入图片描述

5.截断表

5.1:语法
TRUNCATE [TABLE] table_name;
  • 注意:这个操作慎用
  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快
  3. 会重置 AUTO_INCREMENT 项
5.2:实例
  • 最初的建表数据

在这里插入图片描述

  • 使用截断表

在这里插入图片描述

  • 插入一条数据
insert into exam_result values(1,'Jack',86,85,84);
  • 截断后的建表数据:出现 AUTO_INCREMENT=2 项
    在这里插入图片描述

6.聚合和函数

函数说明
count ([distin]t expr)返回查询到的数据的数量
sum([distinct] expr)返回查询到的数据总和,不是数字没有意义
avg([distinct] expr)返回查询到的数据的平均值,不是数字没有意义
max([diseinct] expr)返回查询到的数据的最大值,不是数字没有意义
min([distinct] expr)返回查询到的数据的最小值,不是数字没有意义
  • 案例一:统计班级共有多少同学
select count(*) from exam_result;

在这里插入图片描述

  • 案例二:统计数学成绩总分
select sum(shuxue) 
as 数学总分 
from exam_result;

在这里插入图片描述

  • 案例三:统计平均总分
select avg(yuwem+shuxue+yingyu) 
as 总分
from exam_result; 

在这里插入图片描述

  • 案例四:返回英语最高分
select max(yingyu) 
as 英语最高
from exam_result;

在这里插入图片描述

  • 案例五: 返回>70分以上的数学最低分
select min(shuxue)
as 数学最低分
from exam_result
where shuxue>70;

在这里插入图片描述

group by
  • 1.细化聚集函数的作用对象
  • 未对查询结果分组,聚集函数将作用于整个查询结果
  • 对查询结果分组后,聚集函数将分别作用于每个组
  • 作用对象时查询的中间结果表
  • 按指定的一列或者多列值分组,值相等的为一组
语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
案例
  • 案例一:求各个课程号及相应的选课人数。
select cno,count(sno)
from sc
group by cno;
  • 案例二:查询选修了3门以上课程的学生学号
select sno
from sc
group by
having count(*)>3;
HAVING
  • 出现原因:在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
语法
SELECT column_name, 
aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) 
operator value
案例
  • 案例一:查询成绩在60分以上选修课程超过三门的学生学号
select sno
from sc
where grade > 60
group by sno
having count(*)>3;

当where子句、group by子句和having 子句同时出现在select查询语句中时,查询语句的执行顺序为

  • 1.执行where 子句,从表中选择满足条件的元组;
  • 2.由group by 子句对选取的元组进行分组,并对每组执行聚集函数
  • 3.执行having子句,从分组中选择满足条件的组.
having短语和where子句的区别
  • 作用对象不同
  • where 子句作用于基表和试图,从中选择满足条件的元组
  • having短语作用域组,从中选择满足条件的组.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值