1 INSERT
INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]);
插入数据的规则:
1、插入的数据应与字段的数据类型相同。
2、数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
3、在values中列出的数据位置必须与被加入的列的排列位置相对应。
4、字符和日期型数据应包含在单引号中。
5、插入空值:不指定或insert into table value(null)。
6、如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表。
在employee表中插入一条员工信息:
INSERT INTO employee (id, name, salary) VALUES (null, '张三', '1000');
或者可以这样写
INSERT INTO employee VALUES (null, '张三', '1000');
2 UPDATE
UPDATE table_name SET col_name=expr1[, col_name=expr2... ] [WHERE where_definition];
更新数据规则:
1、UPDATE语法可以用新值更新原有表行中的各列。
2、SET子句指示要修改哪些列和要给予哪些值。
3、WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行
将所有员工薪水修改为5000元:
UPDATE employee SET salary=5000;
将姓名为’张三’的员工薪水修改为3000元:
UPDATE employee SET salary WHERE name='张三';
将姓名为’张三’的员工薪水增加1000元:
UPDATE employee SET salary=salary+1000 WHERE name='张三';
3 DELETE
DELETE FROM table_name [WHERE where_definition];
删除数据的规则:
1、如果不使用where子句,将删除表中所有数据。
2、delete语句不能删除某一列的值(可使用update)。
3、使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
删除表中名称为’张三’的记录:
DELETE FROM employee WHERE name='张三';
删除表中所有记录:
DELETE FROM employee;
4 SELECT
4.1 基本查询
SELECT [DISTINCT] *|{col1, col2, col3...} FROM table_name;
其中FROM指定从哪张表筛选,*表示查找所有列,也可以指定一个列列表明确指定要查找的列,DISTINCT用来剔除重复行。
查询表中所有学生的信息:
SELECT * FROM exam;
查询表中所有学生的姓名和对应的英语成绩:
SELECT name, english FROM exam;
过滤表中英语成绩相同的重复数据:
SELECT DISTINCT english FROM exam;
在所有学生分数上加10分特长分显示:
SELECT name,math+10,chinese+10,english+10 FROM exam;
统计每个学生的总分:
SELECT name, math+chinese+english FROM exam;
使用别名表示学生总分:
SELECT name AS 姓名, math+chinese+english AS 总分 FROM exam;
或者可以省写AS:
SELECT name 姓名, math+chinese+english 总分 FROM exam;
4.2 使用WHERE子句进行过滤查询
查询姓名为张三的学生成绩:
SELECT * FROM exam WHERE name='张三';
查询英语成绩大于90分的同学:
SELECT * FROM exam WHERE english>90;
查询总分大于230分的所有同学:
SELECT name 姓名, math+chinese+english 总分 FROM exam WHERE math+chinese+english>230;
查询英语分数在 80-100之间的同学:
SELECT * FROM exam WHERE english BETWEEN 80 AND 100;
查询数学分数为75,76,77的同学:
SELECT * From exam WHERE math IN (75,76,77);
查询所有姓张的学生成绩:
SELECT * FROM exam WHERE name LIKE '张%'; // 以‘张’开头就可以
SELECT * FROM exam WHERE name LIKE '张__'; // 以‘张’开头并且后面跟随两个字
查询数学分>70,语文分>80的同学:
SELECT * FROM exam WHERE math>70 AND chinese>80;
4.3 使用ORDER BY 对查询结果进行排序
SELECT col1, col2, col3... FROM table_name WHERE ... ORDER BY col1 ASC|DESC;
其中ASC代表升序(默认就是升序),DESC代表降序。
对语文成绩升序后输出:
SELECT name,chinese FROM exam ORDER BY chinese ASC;
对总分排序按从高到低的顺序输出:
SELECT name 姓名,math+chinese+english 总分 FROM exam ORDER BY 总分 DESC;
对姓张的学生的数学成绩降序输出:
SELECT name 姓名, math 数学 FROM exam WHERE name LIKE '张%' ORDER BY 数学 DESC;
4.4 聚合函数
1、COUNT -- 用来统计符合条件的行的个数
统计一个班级共有多少学生:
SELECT COUNT(*) FROM exam;
统计数学成绩大于90的学生有多少个:
SELECT COUNT(*) FROM exam WHERE math>90;
2、SUM -- 用来将符合条件的记录的指定列进行求和操作
统计一个班级数学总成绩:
SELECT SUM(math) FORM exam;
统计一个班级语文、英语、数学各科的总成绩:
SELECT SUM(chinese),SUM(english),SUM(math) FROM exam;
统计一个班级语文、英语、数学的成绩总和:
SELECT SUM(IFNULL(chinese,0)+IFNULL(english,0)+IFNULL(math,0)) FROM exam;
// 在执行计算时,只要有null参与计算,整个计算的结构都是null,IFNULL关键字是为了让查询值为null是给定一个默认值
统计一个班级语文成绩平均分:
SELECT SUM(chinese)/COUNT(*) 语文平均分 FROM exam;
3、AVG -- 用来计算符合条件的记录的指定列的值的平均值
求一个班级数学平均分:
SELECT AVG(math) FROM exam;
求一个班级总分平均分:
SELECT AVG(IFNULL(chinese,0)+IFNULL(english,0)+IFNULL(math,0)) FROM exam;
4、MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值
求班级最高分和最低分:
SELECT MAX(IFNULL(chinese,0)+IFNULL(english,0)+IFNULL(math,0)) FROM exam;
SELECT MIN(IFNULL(chinese,0)+IFNULL(english,0)+IFNULL(math,0)) FROM exam;
4.5 分组查询
当表中某个列中的值有重复时,我们可以用GROUP BY来进行分组查询。具体分组原理可以参考:https://blog.csdn.net/u014717572/article/details/80687042
例如有如下一张订单表orders:

对订单表中商品归类后,显示每一类商品的总价:
SELECT product,SUM(price) FROM orders GROUP BY product;
查询购买了几类商品,并且每类总价大于100的商品:
SELECT product 商品,SUM(price) 总价 FROM orders GROUP BY product HAVING SUM(price)>100;
查询单价小于100而总价大于150的商品的名称:
SELECT product FROM orders WHERE price<100 GROUP BY product HAVING SUM(price)>150;
WHERE子句和HAVING子句的区别:
(1)WHERE子句在分组之前进行过滤,HAVING子句在分组之后进行过滤
(2)HAVING子句中可以使用聚合函数,WHERE子句中不能使用
(3)很多情况下使用WHERE子句的地方可以使用HAVING子句进行替代
5 SQL语句的书写顺序和执行顺序
书写顺序:SELECT FROM WHERE GROUP BY HAVING ORDER BY
执行顺序:FROM WHERE SELECT GROUP BY HAVING ORDER BY