数据库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 手机'
  1. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
  2. insert into tab_name (列名…) values (),(),() 形式添加多条记录
INSERT INTO `goods` (id, goods_name, price)
		VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800);
  1. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO `goods` 
		VALUES(70, 'IBM 手机', 5000);
  1. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
    – 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null
    – 如果我们希望指定某个列的默认值,可以在创建表时指定

二、 UPDATE 语句

在这里插入图片描述

如果where不写,就是对表中所有的记录进行修改。

示例如下:

UPDATE employee 
		SET salary=3000 
		WHERE `name`='小妖怪';

可以修改多个列的值

UPDATE employee
		SET salary = salary + 1000 , job = '出主意的'
		WHERE `name` = '老妖怪'

三、 DELETE 语句

在这里插入图片描述

如果不添加where语句,则删除表内所有记录。

  1. – 删除表中名称为’老妖怪’的记录。
		DELETE FROM employee
			WHERE user_name = '老妖怪';
  1. – 删除表中所有记录, 一定要小心
	DELETE FROM employee;	
  1. – Delete 语句不能删除某一列的值(可使用 update 设为 null 或者 ‘’)
	UPDATE employee SET job = '' WHERE user_name = '老妖怪';
	SELECT * FROM employee
  1. – 要删除这个表
	DROP TABLE employee;

四、 SELECT 语句**

很重要

1.单表查询

在这里插入图片描述

  • DISTINCT 代表去重,去除重复行,可添加可不添加。
  • column 指定列名
  • *号代表查询所有列
  • From 指定查询的表名

代码如下(示例):

  1. – 查询表中所有学生的信息。
SELECT * FROM student;
  1. – 查询表中所有学生的姓名和对应的英语成绩。
SELECT `name`,english FROM student;
  1. – 过滤表中重复数据 distinct 。要查询的记录,每个字段都相同,才会去重
SELECT DISTINCT english FROM student;

使用表达式对查询的列进行运算

在这里插入图片描述

  1. – 统计每个学生的总分
SELECT `name`, (chinese+english+math) FROM student;
  1. – 在所有学生总分加 10 分的情况
SELECT `name`, (chinese + english + math + 10) FROM student;
  1. – 使用别名表示学生分数。
    在这里插入图片描述
SELECT `name` AS '名字', (chinese + english + math + 10) AS total_score
		FROM student;

在 where 子句中经常使用的运算符

在这里插入图片描述

  1. 比较运算符示例如下
-- 查询姓名为赵云的学生成绩 
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
  1. – 查询总分大于 200 分 并且 数学成绩小于语文成绩,的姓赵的学生.
    赵% 表示 名字以赵开头的就可以
SELECT * FROM student
	WHERE (chinese + english + math) > 200 AND math < chinese AND `name` LIKE '赵%'
  1. – 查询英语分数在 80-90 之间的同学。
    between .. and .. 是 闭区间
SELECT * FROM student
	WHERE english >= 80 AND english <= 90; 
SELECT * FROM student
	WHERE english BETWEEN 80 AND 90; 
  1. – 查询数学分数为 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;

在这里插入图片描述


总结

以上是从韩顺平老师教成立截出来的笔记以供自己复习使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值