CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)
用一下表结构举例:
mysql> desc exam_result;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| chinese | float | YES | | 0 | |
| math | float | YES | | 0 | |
| english | float | YES | | 0 | |
+---------+------------------+------+-----+---------+----------------+
语法:
mysql> INSERT [INTO] 表名
-> (字段1, 字段2, ..., 字段n)
-> VALUES (字段1的值, 字段2的值, ..., 字段n的值);
解释:
INTO
可写,可不写。VALUES
前面为要插入数据的字段名,字段n为最后一个字段,除非字段会自增或有默认值否则表结构中的字段名都要写。VALUES
后为对应字段插入的值。VALUES
前的字段名可省略。4中插入方式示例:
#自定义数据全列插的第一种方式
mysql> INSERT INTO exam_result
-> (id, name, chinese, math, english)
-> VALUES (1, '唐三藏', 67, 98, 56);
#部分数据自定义插入:
mysql> insert into exam_result (name) values ('张三');
#自定义数据全列插的第二种方式
mysql> INSERT INTO exam_result
-> VALUES (3, '孙猴子', 80, 80, 20);
#多行数据插入示例
mysql> INSERT INTO exam_result (name, chinese, math, english) VALUES
-> ('猪悟能', 88, 98, 90),
-> ('懒洋洋', 87, 78, 77),
-> ('曹操', 88, 78, 67),
-> ('曹孟德', 82, 84, 67),
-> ('刘玄德', 55, 85, 45),
-> ('孙权', 70, 73, 78),
-> ('宋公明', 75, 65, 30);
#总数据如下
mysql> select * from exam_result;
+----+-----------+---------+------+---------+
| id | name | chinese | math | english |
+----+-----------+---------+------+---------+
| 1 | 唐三藏 | 67 | 98 | 56 |
| 2 | 张三 | 0 | 0 | 0 |
| 3 | 孙猴子 | 80 | 80 | 20 |
| 4 | 猪悟能 | 88 | 98 | 90 |
| 5 | 懒洋洋 | 87 | 78 | 77 |
| 6 | 曹操 | 88 | 78 | 67 |
| 7 | 曹孟德 | 82 | 84 | 67 |
| 8 | 刘玄德 | 55 | 85 | 45 |
| 9 | 孙权 | 70 | 73 | 78 |
| 10 | 宋公明 | 75 | 65 | 30 |
+----+-----------+---------+------+---------+
10 rows in set (0.00 sec)
由于主键或者唯一键对应的值已经存在而导致插入失败可通过一下语法进行更新式插入。
语法:
mysql> INSERT [INTO] 表名
-> (字段1, 字段2, ..., 字段n)
-> VALUES (字段1的值, 字段2的值, ..., 字段n的值)
-> ON DUPLICATE KEY UPDATE (字段1 = 字段1的值
-> ,...)
-- 0 row affected: 表中有冲突数据,但冲突数据的值和update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新
通过 MySQL 函数获取受到影响的数据行数
SELECT ROW_COUNT();
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
Query OK, 2 rows affected (0.00 sec)
SELECT * FROM [表名];
SELECT * FROM exam_result;
SELECT * [字段名1],[字段名2],[...] FROM [表名];
SELECT id, name, english FROM exam_result;
#对应的字段列为 数值时可进行表达式查询
SELECT 字段1, 字段2, 字段3 + 字段4 + 字段5
FROM exam_result;
SELECT id, name, chinese + math + english
FROM exam_result;
字段名后跟as 或 单空格跟别名均可
SELECT [字段1] AS [字段1别名] [...] FROM 表名;
SELECT id, name as 名字, chinese + math + english 总分 FROM exam_result;
+----+-----------+--------+
| id | 名字 | 总分 |
+----+-----------+--------+
| 1 | 唐三藏 | 221 |
+----+-----------+--------+
SELECT DISTINCT [字段] FROM [表名];
SELECT DISTINCT math FROM exam_result;
select [字段1],[字段2] from [表名] where [筛选条件];
select name,mtch for exam_rasult where math>60;
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,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 个)任意字符;_ 表示任意一个字符 |
SELECT name, math FROM exam_result ORDER BY math desc;
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
-- 起始下标为 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;
建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
UPDATE 表名 SET 表达式 WHERE name = '孙悟空';
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
DELETE FROM 表名 WHERE 筛选条件;
DELETE FROM exam_result WHERE name = '孙悟空';
方式一: 会重置 AUTO_INCREMENT 项
DELETE FROM 表名;
DELETE FROM for_delete;
方式二:
TRUNCATE [TABLE] 表名;
注意:这个操作慎用
将查询结果直接插入到目标表。
INSERT INTO [目标表] (字段1, 字段2, ..., 字段n)
SELECT column1, column2, ..., columnN
FROM source_table
WHERE conditions;
函数 | 说明 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
在select中使用group by 子句可以对指定列进行分组查询
select column1, column2, .. from table group by column;
select avg(sal) as myavg from EMP group by deptno having myavg<2000;
WHERE 子句:
HAVING 子句:
在 SQL 查询的执行过程中,WHERE 子句先于 HAVING 子句执行:
首先,WHERE 子句对表中的数据进行筛选,过滤掉不符合条件的行。
然后,对筛选后的结果进行分组(GROUP BY)。
最后,HAVING 子句对分组后的结果进行过滤。
在数据库查询中,除了常见的 SELECT
查询语句外,还有其他类型的SQL语句,它们在执行时也有各自的逻辑顺序。以下是一些常见的SQL语句类型及其执行顺序分析:
SELECT
查询语句这是最常见的一种查询语句,其执行顺序通常如下:
INSERT
插入语句INSERT
语句用于向表中插入数据。其执行顺序如下:
INTO
):确定要插入数据的表。INSERT INTO table VALUES (...)
,直接提供插入的值。INSERT INTO table SELECT ...
,则先执行 SELECT
查询,获取数据。UPDATE
更新语句UPDATE
语句用于更新表中的数据,其执行顺序如下:
WHERE
,则更新所有行)。DELETE
删除语句DELETE
语句用于删除表中的数据,其执行顺序如下:
WHERE
,则删除所有行)。