MySQL的操作中,一些专用的词无论是大写还是小写都是可以通过的。
|
1 |
INSERT [INTO] table_name (列名称…)VALUES (列数据…), (列数据…); |
"[]"表示可有可无,插入时,如果不指定要插入的列,则表示默认全部列都要插入数据,插入数据的顺序必须和列的顺序一致。
如果插入单行数据,则只需一个"()“,如果想要多行插入,则可以同时追加多个”()"。
此外,由于主键或者唯一键对应的值已经存在而导致插入失败,则可以更新数据:
|
1 |
INSERT INTO 表名称 (列名称…) VALUES (列数据…) ON DUPLICATE KEY UPDATE 列名称=新数据…; |
除这条语句之外,还有一条语句,名为替换,也可以解决主键或唯一键冲突问题:
|
1 |
REPLACE INTO 表名称(列名称…) VALUES (列数据…); |
如果没有发生冲突,就相当于直接插入,如果发生冲突,则删除原有数据,重新插入新数据。
全列查询
|
1 |
select * from 表名称; |
指定列查询
|
1 |
select 列名称…from 表名称; |
查询字段表达式
|
1 |
select 列名称… 表达式 from 表名称; |
例如:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT id, name, 10 FROM exam_result;
±–±-------±—+
| id | name | 10 |
±–±-------±—+
| 1 | 张三 | 10 |
| 2 | 李四 | 10 |
| 3 | 王五 | 10 |
| 4 | 赵六 | 10 | |
如果表达式与字段无关,则会生成一列表达式数据。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT id, name, english + 10 FROM exam_result;
±–±--------±----------------+
| id | name | english + 10|
±–±--------±----------------+
| 1 |张三 | 66 |
| 2 |李四 | 87 |
| 3 |王五 | 100 |
| 4 |赵六 | 77 | |
表达式与字段有关:生成表达式为english + 10即将学生的英语成绩+10分的列并显示。
|
1 |
SELECT id, name, chinese + math + english FROM exam_result; |
还有如上表达式,表示显示学生汉数英的成绩之和。
|
1 |
SELECT id, name, chinese + math + english 总分 FROM exam_result; |
还可以给表达式指定别名,即在表达式后追加别名。
|
1 |
SELECT DISTINCT 字段 FROM 表名称; |
通过DISTINCT,可以将查询结果去重。
上边的查找操作,都是对一整个列的数据进行查找,如果我们想要对列中的特定数据进行查找,则可以通过WHERE 条件。
比较运算符:
逻辑运算符:
where基本使用
|
1 |
select 字段… from 表名称 where 条件; |
例如,查找一张成绩表中,英语不及格的学生名单:
|
1 |
SELECT name, english FROM exam_result WHERE english < 60; |
多个条件可以通过逻辑运算符相互组合。
如果现在要查找一个同学,但是不记得他的全名,只记得他的姓为孙,该怎么找到他呢?
|
1 2 |
SELECT name FROM exam_result WHERE name LIKE ‘孙%'; SELECT name FROM exam_result WHERE name LIKE ‘孙_'; |
通过 “LIKE” 条件, 其中 ‘%’ 表示该同学的名字可以是任意数量的字符,‘_’ 表示该同学的名字只有一个字。
值得注意的是,在MySQL中,null 、0、和空字符’ ',三者互不相干,执行相关的查询时应注意。
对数据进行排序通常是查找到对应数据后的操作。
select 列名称… from 表名称 ORDER BY 列名称 排序方式;
当数据中有null时,null视为比任何值都小。
此外,当出现多字段排序,比如:查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示,查询后的结果并不是说,就是按照上述排序方式将单独的科目进行排序,而是按照书写优先级,先将整体数据按照数学降序排序,如果出现数学成绩相等,再将其后的英语成绩按照升序排序,如果英语成绩也相等,则最后排序语文成绩。
当数据量过大时,如果直接查询,可能会引起诸多不便,比如直接就显示到了数据的末尾几行。
因此可以通过LIMIT 按行筛选数据的方式来查询对应行的数据信息:
因此当我们对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。
数据更新必须配合where使用,因为你不可能将一整列的数据全部更新,一般都是对特定行的数据进行更新。
|
1 |
UPDATE 表名称 SET 列名称 = 新数据[, column = expr …] [WHERE …] [ORDER BY …] [LIMIT …] |
可以同时对某一行的多个数据进行更新,也可以对更新后的数据进行排序筛选等操作。
值得注意的是,当需要对某数据进行加减运算时,在MySQL中不支持 “+=” 等操作,必须采用 “新数据 = 原数据 + 改变值” 的方式。
|
1 |
DELETE FROM table_name [WHERE …] [ORDER BY …] [LIMIT …] |
删除数据时,可以使用where来指定要删除的数据,如果不使用where,则默认为删除整张表的全部数据。
值得注意的是,删除数据不会影响表的各种结构定义,就仅仅是删除插入的数据,诸如表字段的类型,以及表的各种约束条件等都不会受到影响。
特别要注意的是,delete删除数据,不会对自增长****AUTO_INCREMENT产生影响,比如说原本自增长已经到了5,此时删除全部数据,在进行插入,自增长依然会为6。
|
1 |
TRUNCATE [TABLE] table_name; |
截断表truncate,同样是清空表的全部数据,与delete不同的是,它会将自增长****AUTO_INCREMEN同样清除,从AUTO_INCREMEN的初始值从头开始增长。
聚合函数可以选择对去重后的数据操作,通常和数据查找共同使用,例如查找某表总共有多少行:
|
1 |
SELECT COUNT(*) FROM 表名称; |
使用 * 做统计,不受 NULL 影响。
在select中使用group by 子句可以对指定列进行分组查询。
|
1 |
select 列名称… from table group by 列名称; |
所谓分组查询,就是对表中某一列中的相同数据组合,例如,有一张完整的学生表数据,其中包含名称为班级号的字段,现在要查询每个班级分别有多少学生,就可以通过分组查询:
|
1 |
select class_id count(*)from studentgroup by class_id; |
having和group by配合使用,对group by结果进行过滤,作用类似用where:
|
1 |
select 列名称… from table group by 列名称 having 过滤条件; |