当前位置: 首页 > news >正文

【MySQL】基本查询(上):创建、读取

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的数量和顺序必须与定义表的列的一致
insert into students values (100, 1000, '张三', NULL);
insert into students values (101, 1001, '李四', '1234');
-- 插看插入结果
select * from students;

1.2 多行数据 指定列插入

-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致
insert into students (id, number, name) values
(102, 1002, '王五'),
(103, 1003, '赵六');-- 查看插入结果
SELECT * FROM students;

1.3 插入/更新

由于我们在定义这个学生表时,将id设定为主键,将number设定为唯一键,则它们的值都是唯一的,如果我们的插入语句中出现重复的id或number,mysql就会报错,插入失败。

主键冲突:

唯一键冲突:

其实我们可以选择性地进行同步更新操作:

INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...-- ON DUPLICATE KEY 当发生重复key的时候

1.4 替换

-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
REPLACE INTO students (number, name) VALUES (1001, '李小帅');

大家可以发现:replace和on duplicate key update的区别在于:如果要插入的行已存在,replace会删除原来行,然后插入新行,适用于希望完全替换已存在行的情况;on duplicate key update则不会删除旧行,而是更新已存在行的指定列,适用于希望保留现有数据并更新部分字段的情况。

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,
Chinese float default 0.0 comment '语文成绩',
Math float default 0.0 comment '数学成绩',
English float default 0.0 comment '英语成绩'
);-- 插入测试数据
INSERT INTO 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 基础查询

全列查询

-- 通常情况下不建议进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。select * from exam_result;

指定列查询

-- 指定列的查询不需要按表定义的顺序来
select name, Chinese from exam_result;

查询字段为表达式

-- 表达式不包含字段
select name, 10 from exam_result;、

-- 表达式包含一个字段
select id, name, English + 10 from exam_result;

-- 表达式包含多个字段
select name, Chinese + Math + English from Exam_result;

-- 为查询结果指定别名
select name as '姓名', Chinese + Math + English as '总分' from exam_result;

2.4 distinct去重

-- 98 分重复了
select Math from exam_result;-- 对结果进行去重
select distinct Math from exam_result;

不去重的结果:

去重的结果:

2.2 where 条件

运算符
说明
>, >=, <, <=
大于,大于等于,小于,小于等于
=
等于, 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 个)任意字符; _ 表示任意一个字符

举几个例子:

英语不及格的同学及英语成绩 ( < 60 ):
语文成绩在 [80, 90] 分的同学及语文成绩:
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩:

姓孙的同学 及 孙某同学:
语文成绩好于英语成绩的同学:
总分在 200 分以下的同学:
语文成绩 > 80 并且不姓孙的同学:
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80:

2.3 order by 对结果排序

语法:

-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

依然是举几个例子:

同学及数学成绩,按数学成绩升序显示:

查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示:

查询同学及总分,由高到低:

查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示:

2.4 limit 筛选分页结果

-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

 建议对未知表进行查询时最好加一条limit1,这样能避免由于表数据量过大,查询全表数据导致数据库卡死。

使用例子:

-- 第 1 页
SELECT id, name, math, english, chinese FROM exam_result
ORDER BY id LIMIT 3 OFFSET 0;

-- 第 2 页
SELECT id, name, math, english, chinese FROM exam_result
ORDER BY id LIMIT 3 OFFSET 3;

-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result
ORDER BY id LIMIT 3 OFFSET 6;


剩下的删和改我们留到下篇文章再继续学习,希望大家看完文章之后也可以动手写一写sql语句,一开始不熟练也没关系,后面会越来越熟悉的~


http://www.mrgr.cn/news/46506.html

相关文章:

  • Qt 自动根据编译的dll或exe 将相关dll文件复制到目标文件夹
  • qt 窗口(window/widget)绘制/渲染顺序 QPainter QPaintDevice Qpainter渲染 失效 无效 原因
  • 哥大开发AI模型助力癌症和遗传病研究,近屿智能专注培养AI人才
  • java中json字符串键值获取
  • 【无标题】四类sql语句通用
  • 2_CSS3 背景 --[CSS3 进阶之路]
  • 如何在Android Studio中找到CMakeLists.txt的打印信息
  • C#操作SqlServer数据库存储过程
  • docker-compose查看容器日志和实时查看日志
  • 【C++】模板初阶
  • 前端Javascript常见算法题(一)【待学】
  • C/C++语言的函数指针
  • 欧盟零毁林法案 EUDR
  • .NET周刊【9月第4期 2024-09-22】
  • 【Power Query】用筛选和上下文 排名
  • 系统性能优化
  • minio简单使用
  • 谷歌AI大模型Gemini API快速入门及LangChain调用视频教程
  • Wasserstein距离
  • C++之multimap:关键字分类的利器
  • (Linux和数据库)1.Linux操作系统和常用命令
  • NLP: SBERT介绍及sentence-transformers库的使用
  • 基于SpringBoot的校园新闻管理系统 计算机毕业设计选题 Java毕业设计 SpringBoot+Vue 前后端分离 [附源码+安装调试]
  • MAX模型转为las点云模型
  • 响应速度相关知识
  • 汽车胶黏剂市场研究:预计2030年全球市场规模将达到67.4亿美元