建议MySQL新手可以先看MySQL数据库基础操作
在使用MySQL中,我们接触最多的就是:
CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)==四个单词的首字母缩写。
DDL(data definition language):数据定义语言,用来维护存储数据的结构,主要包括增加(create)、删除(drop)、alter(修改)。
DML(Data Manipulation Language): 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。
语法:
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
);
-- CREATE TABLE tb_name
-- (
-- 列名1 数据类型(约束条件)(默认值),
-- 列名1 数据类型(约束条件)(默认值),
-- ...
-- );
可以使用comment增加字段说明。
示例:
-- 创建一张学生成绩表
-- 如果数据库中存在student表,则删除此表,重新创建一张exam_result表
DROP TABLE IF EXISTS student;
CREATE TABLE student(
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);
表创建好后,就可以往表里插入记录了。
语法:
INSERT [INTO] table_name [(column [, column] ...)] VALUES (value1,value2,……valuesn);
如果省略 [(column [, column] …)],则说明是向数据表中的全列插入。
插入单行全列的数据
示例:
-- 插入两条记录,(value1,value2,……valuesn)数量必须和定义表的列的数量及顺序一致
INSERT INTO student VALUES (100, 10000, '张三', 98, 99, 95);
INSERT INTO student VALUES (101, 10001, '王五', 97,100,92);
插入多行指定列的数据
在 MySQL 中,insert 语句还有一个很好的特性,可以一次性插入多条记录。
语法:
INSERT INTO tablename (field1, field2,……fieldn)
VALUES (record1_value1, record1_value2,……record1_valuesn),
(record2_value1, record2_value2,……record2_valuesn),
……
(recordn_value1, recordn_value2,……recordn_valuesn);
示例:
-- 插入两条记录,recordn_valuesn 数量必须和指定列数量及顺序一致
INSERT INTO student (id, sn, name) VALUES
(102, 20001, '赵六'),
(103, 20002, '李四');
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
示例:
-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = '李四';
-- 删除整张表数据
DROP TABLE IF EXISTS exam_result;
-- 删除整表数据
DELETE FROM exam_result;
语法:
SELECT {* | {column [, column] ...} FROM tablename [WHERE CONDITION];
全列查询
-- 用* 进行全列查询
SELECT * FROM student;
语句中 * 表示将所有符合条件的记录都选出来。
-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。
** 指定列查询 **
用逗号分割的所有要查的指定字段。
-- 指定列的顺序不需要按定义表的顺序来
SELECT id, name FROM student;
查询字段为表达式
-- 表达式不包含字段
SELECT id, name, 10 FROM student;
将输出三列,在查询出的表里新建一列,列名就为10, 这一列里面的每个数据都为10。
-- 表达式包含一个字段
SELECT id + 10, name FROM student;
将输出2列,在查询出的表里的id列中,列名就为id + 10,所有的id都加10。
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM student;
将输出三列,id,和name列正常输出,最后一列列名为 chinese + math + english,数据为三科成绩之和。
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称。但是别名并不具有
语法:
SELECT column [AS] new_name [...] FROM table_name;
将column 列中的所有数据去重,DISTINCT 关键字告诉MySQL返回的是不同的行,列中数据重复,则只返回其中一行,保证返回的数据都不重复。
语法:
-- DISTINCT 应用的格式很严格
SELECT DISTINCT column FROM table_name;
示例:
//输出math去重后的结果
SELECT DISTINCT math FROM exam_result;
错误示例:
-- 语法规则错误
SELECT name, DISTINCT math FROM exam_result;
-- 不能达到去重的效果
SELECT DISTINCT math,english FROM exam_result;
如果使用DISTINCT关键字,则他必须直接放在列名的前面。
不能多列使用DISTINCT,DISTINCT应用于单列,且不能有其他字段参与检索。
如果给出 SELECT DISTINCT column1, column2,除非指定的两个列都相同,否则所有的行都将被检索出来,去重失败
ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
ASC 为升序(从小到大) 默认为 ASC
DESC 为降序(从大到小)
语法:
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
示例:
-- 查询同学姓名和 math,按 math排序显示
SELECT name, qq_mail FROM student ORDER BY math;
SELECT name, qq_mail FROM student ORDER BY math DESC;
可以对多个字段进行排序,排序优先级随书写顺序
-- 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result ORDER BY math DESC, english, chinese;
使用表达式及别名排序
-- 查询同学及总分,由高到低
SELECT name, chinese + english + math total FROM exam_result ORDER BY total DESC;
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名之后给出。
WHERE子句位于FROM子句之后,ORDER BY 子句位于WHERE子句之后
示例:
SELECT name, math FROM exam_result WHERE english < 60 ORDER BY math DESC;
WHERE子句比较操作符
操作符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a AND b | 在指定的两个值之间,范围匹配,[a,b],如果 a <= value <= b,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配,用于字符串查找,% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
WHERE子句逻辑运算符
操作符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
1. WHERE条件可以使用表达式,但不能使用别名。
2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
操作符:BETWEEN
在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分割,BETWEEN匹配范围中所有的值,包括指定的低端值和高端值。
示例:
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
-- 使用 AND 也可以实现
SELECT name, chinese FROM exam_result WHERE chinese >= 80 AND chinese <= 90;
操作符:IN
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配,IN取合法值的由头号分割的清单,全都在小括号中。
示例:
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
-- 使用 OR 也可以实现
SELECT name, math FROM exam_result WHERE math = 58 OR math = 59 OR math
= 98 OR math = 99;
MySQL中支持NOT对IN,BETWEEN和EXISITS子句取反。
模糊查询:LIKE
通配符%
模糊查询是区分大小写的,例如LIKE 'R%';
和LIKE 'r%';
查询出来的结果是不一样的。
示例:
-- % 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE '张%';-- 匹配到张姓的所有人
最常使用的通配符是百分号%,在搜索串中,%表示任何字符出现的任意次数。
通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。例:'张%','%张%', '张%张'都符合规则。
除了一个或多个字符外,%还能匹配0个字符。代表搜索模式中给定位置的0个,1个或多个字符。
%通配符不能匹配NULL,例:'%'并不能匹配到NULL。
通配符_
下划线_通配符的用途的%号一样,但下划线只能匹配单个字符而不是多个字符。
示例:
-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE '李_';-- 匹配到李姓的名字为单个字的所有人
SELECT语句返回所有匹配的行,它们可能是指定表中的每个行,为了返回第一行会前几行,可使用LIMIT子句。
语法:
-- 起始下标为 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;
其中,OFFSET 表示偏移量,偏移3个数据,则从第4个开始查询。
MySQL中的NULL表示不知道、无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。
通常来说NULL参与的运算结果仍是NULL。
判断字段是否为NULL写法为(NULL 的查询):字段 IS [NOT] NULL
或字段 <=> NULL
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
示例:
-- 将张三同学的数学成绩变更为 80 分
UPDATE exam_result SET math = 80 WHERE name = '张三';
-- 将张三同学的数学成绩变更为 60 分,语文成绩变更为 70 分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '张三';