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 是删除了表里面的记录,表还在*/
因篇幅问题不能全部显示,请点此查看更多更全内容