您的当前位置:首页正文

MySQL表的增删查改

来源:华佗健康网

进行表操作的前提,是必须先选中数据库

create database java109 charset utf8;

use java109;

1、新增(Create)

create table 表名(列名 类型,列名 类型....)

整数:int long
小数:double decimal

那么double和decimal有什么区别呢?

在数据库中,`DOUBLE` 和 `DECIMAL` 是两种不同的数据类型,它们在存储精度、范围和用途上有一些重要的区别。以下是它们的主要区别:

1. 存储方式
- **DOUBLE**:
  - 使用浮点数表示法(IEEE 754 标准)。
  - 通常占用 8 字节(64 位)。
  - 适合存储科学计算中的近似值,因为浮点数可能会有舍入误差。

- **DECIMAL**:
  - 使用定点数表示法。
  - 可以指定精度和小数位数,例如 `DECIMAL(10, 2)` 表示总共有 10 位数字,其中 2 位是小数部分。
  - 适合存储需要精确表示的数值,如货币金额。

2. 精度
- **DOUBLE**:
  - 精度有限,可能会有舍入误差。
  - 适用于不需要精确值的场景,如科学计算和工程应用。

- **DECIMAL**:
  - 提供精确的存储和计算,不会出现舍入误差。
  - 适用于需要精确值的场景,如财务和会计系统。

3. 范围
- **DOUBLE**:
  - 范围非常大,可以表示从大约 ±2.23 × 10^-308 到 ±1.79 × 10^308 之间的值。
  - 适合处理非常大或非常小的数值。

- **DECIMAL**:
  - 范围取决于指定的精度和小数位数。
  - 例如,`DECIMAL(10, 2)` 可以表示从 -9999999.99 到 9999999.99 之间的值。

4. 存储空间
- **DOUBLE**:
  - 固定占用 8 字节。

- **DECIMAL**:
  - 占用的空间取决于指定的精度和小数位数。
  - 例如,`DECIMAL(10, 2)` 通常占用 5 字节。

示例

-- 创建一个包含 DOUBLE 和 DECIMAL 类型的表
CREATE TABLE example_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    double_value DOUBLE,
    decimal_value DECIMAL(10, 2)
);
-- 插入数据
INSERT INTO example_table (double_value, decimal_value) VALUES (1234567.89, 1234567.89);

-- 查询数据
SELECT * FROM example_table;

总结
- **DOUBLE** 适合需要大范围数值和高效率计算的场景,但可能有舍入误差。
- **DECIMAL** 适合需要精确值的场景,如财务计算,但占用的存储空间会根据精度和小数位数而变化。

字符串:varchar
时间日期:datetime
  • 首先先创建一张学生表
CREATE TABLE student (
  id INT,
  sn INT comment '学号',
  name VARCHAR(20) comment '姓名',
  qq_mail VARCHAR(20) comment 'QQ邮箱'
);
  • 单行数据+全列插入
-- 插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
INSERT INTO student VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO student VALUES (101, 10001, '孙悟空', '11111');
  • 多行数据+全列插入
-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致
INSERT INTO student (id, sn, name) VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');

2、查询(Retrieve

  • 查看所有表

show tables;

  • 查看指定表的结构

desc 表名;

  • 全列查询

通常情况下不建议使用 *进行全列查询--
1.查询的列越多,意味着需要传输的数据量越大;
2.可能会影响到索引的使用。(索引待后面课程讲解)
SELECT * FROM exam_ result;
  •  指定列查询

--指定列的顺序不需要按定义表的顺序来
SELECT id, name,english FROM exam_result;
  •  查询字段为表达式

-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result;

 这些计算字段不会永久性地改变数据库中的数据;它们只是在查询执行时临时生成,并作为查询结果的一部分返回给用户

  •    别名

-- 结果集中,表头的列名=别名
SELECT id, name, chinese + math + english as total FROM exam_result;
  •    去重DISTINCT

-- 98 分重复了
SELECT math FROM exam_result;
+--------+
| math |
+--------+
|     98 |
|     78 |
|     98 |
|     84 |
|     85 |
|     73 |
|     65 |
+--------+
7 rows in set (0.00 sec)
-- 去重结果
SELECT DISTINCT math FROM exam_result;
+--------+
| math |
+--------+
|     98 |
|     78 |
|     84 |
|     85 |
|     73 |
|     65 |
+--------+
6 rows in set (0.00 sec)
  • 查询的时候排序

进行行的排序

首先要明确排序规则:1、针对哪个列作为比较规则? 2、排序的时候是升序还是降序

此时的排序仍然是针对临时数据来展开的,此处的排序,不影响原有数据在mysql服务器上的存储顺序

select  列名 from 表名order by 列名 asc/desc 

asc是升序,desc是降序,如果省略,就是升序排列

select name, math from exam_result order by math desc;
  • 条件查询

 指定具体的条件,按照条件对数据 进行筛选

select 列名 from  表名 where 条件;

--查询英语不及格的同学的英语成绩
select name,english from exam_result where engilsh < 60;
--查询语文成绩好于英语成绩的同学
select name, chinese ,english from exam_result where chinese > english;
--查询总分在200分以下的同学
select name, chinese + english + math as total from exam_result where (chinese + english + math) < 200;
--查询语文成绩大于80分,且英语成绩>80分的同学
select name, chinese, english from exam_result where chinese > 80 and english > 80;
--查询语文成绩大于80分,且英语成绩>80分的同学
select name, chinese, english from exam_result where chinese > 80 or english > 80;
--查询语文成绩在{80,90}分的同学及语文成绩  这是一个闭区间
select name, chinese from exam_result where chinese between 80 and 90;
--查询数学成绩是58或者59或者98或者99的同学及数学成绩  使用in来表示一个离散的集合
select name, math from exam_result where math in (58, 59, 98, 99);
--模糊匹配
--孙%:查询以孙开头的内容
select * from exam_result where name like '孙%';
--孙_:查询以孙开头的包含一位的内容
select * from exam_result where name like '孙_';
--%孙:查询以孙结尾的内容
select * from exam_result where name like '%孙';
--%孙%:查询包含孙的内容
select * from exam_result where name like '%孙%';
--NULL的查询
--查询qq_mail 已知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NOT NULL;
--查询qq_mail未知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NULL;
--可以针对两个列进行比较的
select * from exam_result where chinese <=> null;

<=> 是SQL中的一个特殊操作符,被称为“空值安全等于”操作符或“宇航员操作符”(因为它的形状像一个小火箭)。它主要用于处理包含 NULL 值的比较,其行为与普通的等号 = 操作符有所不同。
空值安全:当两个 NULL 值使用 <=> 进行比较时,结果是 TRUE(1),而使用普通等号 = 比较时,NULL = NULL 的结果是 UNKNOWN 或 FALSE(0),因为按照SQL标准,NULL 表示未知值,所以两个未知值不能简单地认为是相等的。
全等比较:除了能够正确处理 NULL 值外,<=> 操作符还能够进行全等比较,意味着它不仅检查值是否相同,还会检查数据类型是否一致(这一点取决于具体的数据库系统实现)。

  • 分页查询

使用select * 这种查询,是比较危险的,需要保证一次不要查出来太多东西,所以就需要用limit来进行限制,limit可以限制这次查询最多能 查出来多少个结果

-- 起始下标为0时
select * from exam_result limit 3;
-- 从3开始,筛选出三条结果
select from exam_result limit 3 offset 3;

-- 和 # 都只能用于单行注释,而 /* */ 可以用于多行注释。

在使用 -- 时,务必在 -- 后面加一个空格,否则可能会导致语法错误。

3、修改(Update

update 表名 set 列名 = 值 where 条件;

-- 将孙悟空的数学成绩变为80分
update exam_result set math = 80 where name = '孙悟空';
-- 将曹孟德的数学成绩变更为60分,语文成绩变更为70分
update exam_result set math = 60, chinese = 70 where name = '曹孟德';
-- 将总成绩倒数前三的3位同学数学成绩加上30分
update exam_result set math = math + 30order by chinese + math + english limit 3;
-- 将所有同学的语文更新为原来的2倍
update exam_result set Chinese = chinese * 2;

4、删除(Delete

delete from 表名 where 条件/order by /limit;把符合条件的行删掉

-- 删除孙悟空同学的考试成绩
delete from exam_result where name = '孙悟空';
-- 删除整张表格
delete from exam_result;
/*和drop table不太一样。drop table 是删除了表,也删除了表里面的记录,
delete table 是删除了表里面的记录,表还在*/

因篇幅问题不能全部显示,请点此查看更多更全内容