提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
MuSQL——CRUD语句
一、 INSERT 语句
使用 insert 语句向表中插入数据
示例如下:
--创建商品goods表
CREATE TABLE `goods` (
id INT,
goods_name VARCHAR(10),
price DOUBLE);
DROP TABLE goods;
--插入商品1
INSERT INTO `goods` (id,goods_name,price)
VALUES(10,'华为手机',3000);
--插入商品2
INSERT INTO `goods` (id,goods_name,price)
VALUES(20,'苹果手机',3000);
细节
1. 插入的数据应与字段的数据类型相同。
-- 比如 把 'abc' 添加到 int 类型会错误 mysql底层会尝试去将‘abc’转成int型,如果能转,就能运行成功。如果无法转,就会报错。
2. 数据的长度应在列的规定范围内,
-- 例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。
3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应。
--一般第一列是id
4. 字符和日期型数据应包含在单引号中。
INSERT INTO `goods` (id, goods_name, price)
VALUES(40, vovo 手机, 3000); -- 错误的 vovo 手机 应该 'vovo 手机'
- 列可以插入空值[前提是该字段允许为空],insert into table value(null)
- insert into tab_name (列名…) values (),(),() 形式添加多条记录
INSERT INTO `goods` (id, goods_name, price)
VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800);
- 如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO `goods`
VALUES(70, 'IBM 手机', 5000);
- 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
– 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null
– 如果我们希望指定某个列的默认值,可以在创建表时指定
二、 UPDATE 语句
如果where不写,就是对表中所有的记录进行修改。
示例如下:
UPDATE employee
SET salary=3000
WHERE `name`='小妖怪';
可以修改多个列的值
UPDATE employee
SET salary = salary + 1000 , job = '出主意的'
WHERE `name` = '老妖怪'
三、 DELETE 语句
如果不添加where语句,则删除表内所有记录。
- – 删除表中名称为’老妖怪’的记录。
DELETE FROM employee
WHERE user_name = '老妖怪';
- – 删除表中所有记录, 一定要小心
DELETE FROM employee;
- – Delete 语句不能删除某一列的值(可使用 update 设为 null 或者 ‘’)
UPDATE employee SET job = '' WHERE user_name = '老妖怪';
SELECT * FROM employee
- – 要删除这个表
DROP TABLE employee;
四、 SELECT 语句**
很重要
1.单表查询
- DISTINCT 代表去重,去除重复行,可添加可不添加。
- column 指定列名
- *号代表查询所有列
- From 指定查询的表名
代码如下(示例):
- – 查询表中所有学生的信息。
SELECT * FROM student;
- – 查询表中所有学生的姓名和对应的英语成绩。
SELECT `name`,english FROM student;
- – 过滤表中重复数据 distinct 。要查询的记录,每个字段都相同,才会去重
SELECT DISTINCT english FROM student;
使用表达式对查询的列进行运算
- – 统计每个学生的总分
SELECT `name`, (chinese+english+math) FROM student;
- – 在所有学生总分加 10 分的情况
SELECT `name`, (chinese + english + math + 10) FROM student;
- – 使用别名表示学生分数。
SELECT `name` AS '名字', (chinese + english + math + 10) AS total_score
FROM student;
在 where 子句中经常使用的运算符
- 比较运算符示例如下
-- 查询姓名为赵云的学生成绩
SELECT * FROM student
WHERE `name` = '赵云'
-- 查询英语成绩大于 90 分的同学
SELECT * FROM student
WHERE english > 90
-- 查询总分大于 200 分的所有同学
SELECT * FROM student
WHERE (chinese + english + math) > 200
-- 查询 math 大于 60 并且(and) id 大于 4 的学生成绩
SELECT * FROM student
WHERE math >60 AND id > 4
-- 查询英语成绩大于语文成绩的同学
SELECT * FROM student
WHERE english > chinese
- – 查询总分大于 200 分 并且 数学成绩小于语文成绩,的姓赵的学生.
赵% 表示 名字以赵开头的就可以
SELECT * FROM student
WHERE (chinese + english + math) > 200 AND math < chinese AND `name` LIKE '赵%'
- – 查询英语分数在 80-90 之间的同学。
between .. and .. 是 闭区间
SELECT * FROM student
WHERE english >= 80 AND english <= 90;
SELECT * FROM student
WHERE english BETWEEN 80 AND 90;
- – 查询数学分数为 89,90,91 的同学。
SELECT * FROM student
WHERE math = 89 OR math = 90 OR math = 91;
SELECT * FROM student
WHERE math IN (89, 90, 91);
使用 order by 子句排序查询结果
默认 asc,代表升序。Desc 代表降序。
示例如下
OrderBy 语句位于 SELECT 语句结尾。
-- 对数学成绩排序后输出【升序】。
SELECT * FROM student
ORDER BY math;
-- 对总分按从高到低的顺序输出 [降序] -- 使用别名排序
SELECT `name` , (chinese + english + math) AS total_score FROM student
ORDER BY total_score DESC;
-- 对姓韩的学生成绩[总分]排序输出(升序) where + order by
SELECT `name`, (chinese + english + math) AS total_score FROM student
WHERE `name` LIKE '宋%' ORDER BY total_score;
-- ^^按照部门号升序而雇员的工资降序排列 , 显示雇员信息
SELECT * FROM emp ORDER BY deptno ASC , sal DESC;
一些细节
- 在 mysql 中, 日期类型可以直接比较, 需要注意格式
--使用 where 子句 查找 1992.1.1 后入职的员工
SELECT * FROM emp
WHERE hiredate > '1992-01-01';
- 使用 like 操作符(模糊查询)
– % : 表示 0 到多个任意字符
– _ : 表示单个任意字符
-- 显示首字符为 S 的员工姓名和工资
SELECT ename, sal FROM emp WHERE ename LIKE 'S%'
-- 显示第三个字符为大写 O 的所有员工的姓名和工资
SELECT ename,sal FROM emp WHERE ename LIKE '__O%';
- 判断为空
-- ■ 显示没有上级的雇员的情况
SELECT * FROM emp WHERE mgr IS NULL;
- 查询表结构
-- ■ 查询表结构
DESC emp
分页查询
- 基本语法 : select … limit start, rows;
– 表示从 start+1 行开始取,取出 rows 行,start 从 0 开始计算。
-- 按雇员的 id 号升序取出, 每页显示 3 条记录,请分别显示 第 1 页,第 2 页,第 3 页
-- 第 1 页
SELECT * FROM emp ORDER BY empno LIMIT 0,3;
-- 第 2 页
SELECT * FROM emp ORDER BY empno LIMIT 3, 3;
-- 第 3 页
SELECT * FROM emp ORDER BY empno LIMIT 6, 3;
-- 推导一个公式
SELECT * FROM emp ORDER BY empno
LIMIT 每页显示记录数 * (第几页-1) , 每页显示记录数
分组查询
-- (1) 显示每种岗位的雇员总数、平均工资。
SELECT COUNT(*),AVG(sal),job FROM emp GROUP BY job;
-- (2) 显示雇员总数,以及获得补助的雇员数。
-- 思路: 获得补助的雇员数 就是 comm 列为非 null, 就是 count(列),
-- 如果该列的值为 null, 是不会统计 , SQL 非常灵活,需要我们动脑筋.
SELECT COUNT(*),COUNT(comm) FROM emp;
-- 老师的扩展要求:统计没有获得补助的雇员数
SELECT COUNT(*),COUNT(IF(comm is NULL,1,NULL)) FROM emp;
SELECT COUNT(*), COUNT(*) - COUNT(comm) FROM emp;
-- (3) 显示管理者的总人数。小技巧:尝试写->修改->尝试[正确的]
-- mgr 可能存在重复, 这里使用distinct 去重
SELECT COUNT(DISTINCT mgr) FROM emp;
- 如果select语句同时包含有group by, having, limit, order by
- 那么他们的顺序是group by, having, orderby, limit
2.多表查询
- 在默认情况下:当两个表查询时,规则
– 1. 从第一张表中,取出一行和第二张表的每一行进行组合,返回结果[含有两张表的所有列].
– 2. 一共返回的记录数: 第一张表 行数 * 第二张表 的行数
– 3. 这样多表查询默认处理返回的结果,称为 笛卡尔集
– 4*. 解决这个多表的关键就是要写出正确的过滤条件 where - 小技巧:多表查询的条件不能少于 表的个数-1, 否则会出现笛卡尔集
SELECT * FROM emp,dept WHERE emp.deptno = dept.deptno;
-- ?如何显示部门号为 10 的部门名、员工名和工资
SELECT emp.deptno,dname, ename, sal FROM emp,dept WHERE emp.deptno=dept.deptno AND dept.deptno=10;
-- ?显示各个员工的姓名,工资,及其工资的级别
-- 思路 姓名,工资 来自 emp 13
-- 工资级别 salgrade 5
-- 写 sql , 先写一个简单,然后加入过滤条件...
select ename, sal, grade
from emp , salgrade
where sal between losal and hisal;
- 自连接
– 自连接的特点
– 1. 把同一张表当做两张表使用
– 2. 需要给表取别名 表名 表别名
– 3. 列名不明确,可以指定列的别名 列名 as 列的别名
-- 思考题: 显示公司员工名字和他的上级的名字
-- 分析: 员工名字 在 emp, 上级的名字 emp
-- 员工和上级是通过 emp 表的 mgr 列关联
SELECT worker.ename AS '职员名字',boss.ename AS '上级'
FROM emp worker, emp boss
WHERE worker.mgr = boss.empno;
- 子查询
– 子查询是指嵌入其他sql语句中的 select 语句,也叫嵌套查询
单行子查询示例
-- 请思考:如何显示与 SMITH 同一部门的所有员工?
/*
1. 先查询到 SMITH 的部门号得到
2. 把上面的 select 语句当做一个子查询来使用
*/
SELECT deptno FROM emp WHERE ename = 'SMITH';
SELECT ename FROM emp
WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH');
多行子查询
-- 课堂练习:如何查询和部门 10 的工作相同的雇员的
-- 名字、岗位、工资、部门号, 但是不含 10 号部门自己的雇员.
/*
1. 查询到 10 号部门有哪些工作
2. 把上面查询的结果当做子查询使用
*/
SELECT DISTINCT job FROM emp WHERE deptno = 10;
SELECT ename, sal, deptno, job
FROM emp
WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno = 10)
AND deptno != 10;
总结
以上是从韩顺平老师教成立截出来的笔记以供自己复习使用。