在进行增删改查的时候,务必先要选中数据库!!
1. CRUD
注释:在 SQL 中可以使用 “-- 空格 + 描述 ” 来表示注释说明
CRUD 即增加 (Create) 、查询 (Retrieve) 、更新 (Update) 、删除 (Delete) 四个单词的首字母缩写。
2. 新增(Create)
语法:insert into 表名 values (列,列,列......);
values后面的()中的内容,个数和类型都要和表的结构匹配
案例:
insert 除了可以插入完整的一行数据之外,还可以只当列插入;此时未被指定的列则是以默认值来填充的
如果指定多个列,就可以使用,来进行分隔即可
insert语句,values后面的()可以有多组,每一组就对应到一行(一条记录),因此借助这个功能就可以一个SQL语句插入多条数据
3. 查询(Retrieve)
3.1 全列查询
语法:select * from 表名
* 叫做通配符,代表了所有的列。无论这里的表是啥样的里面有几列,都是啥名字都可以用 * 来代表它们
注意:如果数据量很大那就不要用这个了,因为容易把硬盘IO还有网络带宽吃满!
3.2 指定列查询
语法:select 列名 from 表名
通过指定列查询,相比上面的select * 查询要精简不少
3.3 带表达式的查询
在查询过程中,进行一个简单的计算(列和列之间),不能进行行和行之间的运算
进行表达式查询的时候,查询结果是一个"临时表",服务器会根据SQL来进行计算,查询出这个表的所有记录并生成一个临时表,原来表中的数据不会改变
select只是能查询,无论怎么操作都不会对硬盘的数据进行修改
3.4 别名
使用表达式查询的时候,查询的临时表的列名就是自己写的表达式,这个写法并不美观,就可以在表达式后面加个 as + 名
3.5 去重:DISTINCT
查询的时候,针对列来进行去重(把所有重复的记录给合并成一个) → 使用distinct 关键字对某列数据进行去重
也可以指定多个列,当指定多个列的时候则是要求所有的列都相同,才算“重复”
3.6 针对查询结构进行排序:order by
语法:select 列名 from 表名 order by 列名;
默认是升序排序的,如果要进行降序排序,就在后面加上desc
【注意事项】:
1.如果SQL中没有明确地写order by,这时候查询结果的顺序是不可预期的。看起来像是根据插入顺序来进行排序的,然而实际上在MySQL中并没有对顺序做出过任何承诺
2.如果是要排序的列中,有NULL,则视为NULL是“最小值”
3.也可以针对表达式/别名来进行排序,比如根据总成绩
在SQL中,NULL和任何值进行运算,结果依然是NULL
4.排序还可以指定多个列来进行排序(更复杂的比较规则)
3.7 条件查询:where
通过where指定一个“条件”(想要描述“条件”,需要用到“关系运算符”和“逻辑运算符”),把查询到的每一行都带入到这个条件中,看条件是 真 还是 假 ,把条件为真的行保留(作为临时表的结果),条件为假的就舍弃
查询语文低于六十分的
查询语文成绩好于英语成绩的
查询总分小于200的
在这个代码中,where子句不能使用 列 的别名来进行比较。因为MySQL执行查询操作的时候,先针对每一条记录中的计算条件进行筛选,满足条件的记录才会取出对应的列,然后计算列里面的表达式(生成别名)
查询语文成绩在80 - 90之间的
3.8 分页查询: LIMIT
语法:
案例:按 id 进行分页,每页 3 条记录,分别显示 第 1 、 2 、 3 页
4. 修改( Update )
语法:
-- 查询数学成绩是 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 ;
-- % 匹配任意多个(包括 0 个)字符
SELECT name FROM exam_result WHERE name LIKE ' 孙 %' ; -- 匹配到孙悟空、孙权
-- _ 匹配严格的一个任意字符
SELECT name FROM exam_result WHERE name LIKE ' 孙 _' ; -- 匹配到孙权
-- 查询 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 ;
-- 起始下标为 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;
-- 第 1 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 0 ;
-- 第 2 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 3 ;
-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 6 ;
UPDATE table_name SET column = expr [, column = expr ...]
[ WHERE ...] [ ORDER BY ...] [ LIMIT ...] 案例:
5. 删除( Delete )
语法:
案例:
6. 内容重点总结
新增:
查询
-- 将孙悟空同学的数学成绩变更为 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 + 30 ORDER BY chinese + math + english LIMIT
3 ;
-- 将所有同学的语文成绩更新为原来的 2 倍
UPDATE exam_result SET chinese = chinese * 2 ;
DELETE FROM table_name [ WHERE ...] [ ORDER BY ...] [ LIMIT ...]
-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = ' 孙悟空 ' ;
-- 删除整张表数据
-- 准备测试表
DROP TABLE IF EXISTS for_delete;
CREATE TABLE for_delete (
id INT ,
name VARCHAR ( 20 )
);
-- 插入测试数据
INSERT INTO for_delete (name) VALUES ( 'A' ), ( 'B' ), ( 'C' );
-- 删除整表数据
DELETE FROM for_delete;
-- 单行插入
insert into 表 ( 字段 1, ..., 字段 N) values (value1, ..., value N);
-- 多行插入
insert into 表 ( 字段 1, ..., 字段 N) values
(value1, ...),
(value2, ...),
(value3, ...);
-- 全列查询
select * from 表
-- 指定列查询 修改
删除
7. 课后作业
select 字段 1, 字段 2... from 表
-- 查询表达式字段
select 字段 1+ 100 , 字段 2+ 字段 3 from 表
-- 别名
select 字段 1 别名 1, 字段 2 别名 2 from 表
-- 去重 DISTINCT
select distinct 字段 from 表
-- 排序 ORDER BY
select * from 表 order by 排序字段
-- 条件查询 WHERE :
-- (1) 比较运算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR
(8)NOT
select * from 表 where 条件
update 表 set 字段 1=value1, 字段 2=value2... where 条件
delete from 表 where 条件