目录
2.将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
1.准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)
语法: (括号内的都是可以省略的)
- INSERT [INTO] table_name
- [(column [, column] ...)]
- VALUES (value_list) [, (value_list)] ...
-
- value_list: value, [, value] ...
案例:创建一张学生表
- CREATE TABLE students (
- id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
- sn INT NOT NULL UNIQUE COMMENT '学号',
- name VARCHAR(20) NOT NULL,
- qq VARCHAR(20)
- );
插入两条记录,value_list 数量必须和指定列数量及顺序一致
(1)由于 主键 或者 唯一键 对应的值已经存在而导致插入失败
(2)可以选择性的进行同步更新操作语法
- INSERT ... ON DUPLICATE KEY UPDATE
- column = value [, column = value] ...
(3)行受影响
语法:
- SELECT[DISTINCT] {* | {column [, column] ...}
- [FROM table_name]
- [WHERE ...]
- [ORDER BY column [ASC | DESC], ...]
- LIMIT ...
案例:
- -- 创建表结构 CREATE TABLE exam_result (
- id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(20) NOT NULL COMMENT '同学姓名',
- chinese float DEFAULT 0.0 COMMENT '语文成绩',
- math float DEFAULT 0.0 COMMENT '数学成绩',
- english float DEFAULT 0.0 COMMENT '英语成绩'
- );
-
-
- -- 插入测试数据 INSERT INTO exam_result (name, chinese, math, english) VALUES
- ('唐三藏', 67, 98, 56),
- ('孙悟空', 87, 78, 77),
- ('猪悟能', 88, 98, 90),
- ('曹孟德', 82, 84, 67),
- ('刘玄德', 55, 85, 45),
- ('孙权', 70, 73, 78),
- ('宋公明', 75, 65, 30);
- Query OK, 7 rows affected (0.00 sec) Records: 7 Duplicates: 0 Warnings: 0
(1)通常情况下不建议使用 * 进行全列查询
(2)指定列查询
(3) 查询字段为表达式
①表达式不包含字段
②表达式包含一个字段
③表达式包含多个字段
(4)为查询结果指定别名 (as 可省略)
(5)结果去重
比较运算符 :
逻辑运算符 :
运算符 | 说明 |
AND | 多个条件必须都为TRUE(1),结果才是TRUE(1). |
OR | 任意一个结果为TRUE(1),结果为TRUE(1) |
NOT | 条件为TREU(1),结果为FALSE(0) |
(1)英语不及格的同学及英语成绩 < 60
(2)语文成绩在 [80, 90] 分的同学及语文成绩
①使用 AND 进行条件连接
②使用 BETWEEN ... AND ... 条件
(3)数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
①使用 OR 进行条件连接
②使用 IN 条件
(4)姓孙的同学 及 孙某同学
① % 匹配任意多个(包括 0 个)任意字符
② _ 匹配严格的一个任意字符
(5)语文成绩好于英语成绩的同学
(6) 总分在 200 分以下的同学
(7)语文成绩 > 80 并且不姓孙的同学
(8)查找孙某同学,如果不是孙某则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
(9) NULL 的查询
① 查询 qq 号已知的同学姓名
②NULL 和 NULL 的比较,= 和 <=> 的区别
- -- ASC 为升序(从小到大)
- -- DESC 为降序(从大到小)
- -- 默认为 ASC
-
- SELECT ... FROM table_name [WHERE ...]
- ORDER BY column [ASC|DESC], [...];
(1) 同学及数学成绩,按数学成绩升序显示
(2)同学及 qq 号,按 qq 号排序显示
(3)查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
(4)查询同学及总分,由高到低
(5)查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
- -- 起始下标为 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)按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页
(2)limit 3,2 = limit 2 offset 3 (从第几行数据开始显示后面几行)
语法:
- UPDATE table_name SET column = expr [, column = expr ...]
- [WHERE ...] [ORDER BY ...] [LIMIT ...]
更新全表的语句慎用 ;没有 WHERE 子句,则更新全表
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
(1)准备测试表
(2)删除整张表
(3)再插入一条数据,自增 id 在原值上增长
(4)查看表结构,会有 AUTO_INCREMENT=n 项
语法:
TRUNCATE [TABLE] table_name
(1)准备测试表
(2)截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
(3)再插入一条数据,自增 id 在重新增长
(4)查看表结构,会有 AUTO_INCREMENT=3项
函数
| 说明 |
COUNT([DISTINCT] expr) | 返回查询到的数据的数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
select column1, column2, .. from table group by column;
案例:
- DROP database IF EXISTS `scott`;
- CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-
- USE `scott`;
-
- DROP TABLE IF EXISTS `dept`;
- CREATE TABLE `dept` (
- `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
- `dname` varchar(14) DEFAULT NULL COMMENT '部门名称',
- `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
- );
-
-
- DROP TABLE IF EXISTS `emp`;
- CREATE TABLE `emp` (
- `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
- `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
- `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
- `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
- `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
- `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
- `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
- `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
- );
-
-
- DROP TABLE IF EXISTS `salgrade`;
- CREATE TABLE `salgrade` (
- `grade` int(11) DEFAULT NULL COMMENT '等级',
- `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
- `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
- );
-
-
- insert into dept (deptno, dname, loc)
- values (10, 'ACCOUNTING', 'NEW YORK');
- insert into dept (deptno, dname, loc)
- values (20, 'RESEARCH', 'DALLAS');
- insert into dept (deptno, dname, loc)
- values (30, 'SALES', 'CHICAGO');
- insert into dept (deptno, dname, loc)
- values (40, 'OPERATIONS', 'BOSTON');
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
-
- insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
- values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
-
- insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
- insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
- insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
- insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
- insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);
(1)统计各个部门的平均工资
(2)having和group by配合使用,对group by结果进行过滤
凡是在select中出现原表中的列名称,也必须在grop中出现!