五、表的增删改查
5.1 Create
5.1.1 单行数据 + 全列插入:
--value_list 数量必须和定义表的列的数量及顺序一致
INSERT INTO students VALUES (101, 10001, '孙悟空', '11111');
5.1.2 多行数据 + 指定列插入:
-- 插入两条记录,value_list 数量必须和指定列数量及顺序一致
INSERT INTO students (id, sn, name) VALUES(102, 20001, '曹孟德'),(103, 20002, '孙仲谋');
5.1.3 插入否则更新(3)
(1)表中有冲突数据,数据的值和 update 的值相等(2)表中没有冲突数据时被插入(3)表中有冲突数据已被更新
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';5.1.4 替换
(1)主键或者唯一键没有冲突,则直接插入;(2)主键或者唯一键如果冲突,则删除后再插入
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
5.2 Retrieve
5.2.1 SELECT 列
(1) 全列查询: SELECT * FROM exam_result;
(2) 指定列查询:SELECT id, name, english FROM exam_result;
(3)查询字段为表达式:表达式不包含字段:SELECT id, name, 10 FROM exam_result;
表达式包含一个字段:SELECT id, name, english + 10 FROM exam_result;
表达式包含多个字段:SELECT id, name, chinese + math + english FROM exam_result;
(4)为查询结果指定别名:SELECT id, name, chinese + math + english 总分 FROM exam_result;
(5)结果去重:SELECT DISTINCT math FROM exam_result;
5.2.2 WHERE 条件
比较运算符:
逻辑运算符:
eg:(1)<: SELECT name, english FROM exam_result WHERE english < 60;
(2)AND:SELECT name, yuwen FROM exam_result WHERE yuwen >= 80 AND yuwen <= 90;
BETWEEN ... AND ...:SELECT name, yuwen FROM exam_result WHERE yuwen BETWEEN 80 AND 90;
(3)OR: SELECT name, shuxue FROM exam_result WHERE shuxue = 98 OR shuxue = 99;
IN: SELECT name, shuxue FROM exam_result WHERE shuxue IN (98, 99);
(4)%: SELECT name FROM exam_result WHERE name LIKE '孙%'; --姓孙
_: SELECT name FROM exam_result WHERE name LIKE '孙_';--孙某
(5)IS NOT NULL : SELECT name, qq FROM students WHERE qq IS NOT NULL;
5.2.3 结果排序
语法:-- ASC 为升序(从小到大) DESC 为降序(从大到小) 默认为 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
eg:SELECT name, math, english, chinese FROM exam_result ORDER BY math DESC, english, chinese;
5.2.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;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
5.3 Update
语法:UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]
eg: UPDATE exam_result SET math = math + 30 ORDER BY math + english + chinese LIMIT 3;--将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
5.4 Delete
5.4.1 删除数据: DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
eg:DELETE FROM exam_result WHERE name = '孙悟空';
DELETE FROM tablename; --删除整张表数据
5.4.2 截断表:TRUNCATE [TABLE] table_name
注意:这个操作慎用(1)只能对整表操作,不能像 DELETE 一样针对部分数据操作;(2)实际上 MySQL 不对数据操作,所以比 DELETE 更快(3)会重置 AUTO_INCREMENT 项
eg:TRUNCATE for_truncate; -- 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
5.5 插入查询结果
语法:INSERT INTO table_name [(column [, column ...])] SELECT ...
eg:-- 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样
CREATE TABLE no_duplicate_table LIKE duplicate_table;-- 将 duplicate_table 的去重数据插入到 no_duplicate_table
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
-- 通过重命名表,实现原子的去重操作
RENAME TABLE duplicate_table TO old_duplicate_table,no_duplicate_table TO duplicate_table;
5.6 聚合函数
5.7group by子句的使用
select column1, column2, .. from table group by column;
六、函数
6.1 日期函数
eg: select date_add('2017-10-28', interval 10 day);
6.2 字符串函数
eg:(1)--要求显示student表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分
select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from student;
(2)--求学生表中学生姓名占用的字节数
select length(name), name from student;
注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数组算作一个字节,中文表示多个字节数(与字符集编码有关)
6.3 数学函数
6.4 其他函数
(1)user() 查询当前用户
(2)md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
(3)database()显示当前正在使用的数据库 eg:select database();
(4)password()函数,MySQL数据库使用该函数对用户加密 eg:select password('root');
(5)ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值