 mysql表中的CRUD操作(增删改查))
5.表的增删改查CRUDcreate(创建)retrieve(读取) update(更新)delete(删除)5.1create(创建)例子创建一个学生表5.1.1单行数据全列插入插入两条记录value_list 数量必须和定义表的列的数量及顺序一致注意这里在插入的时候也可以不用指定id(当然那时候就需要明确插入数据到那些列了)那么mysql会使用默认的值进行自增。5.1.2多行数据指定列插入插入两条记录value_list 数量必须和指定列数量以及顺序一致5.1.3插入否则更新由于主键或者唯一键对应的值已经存在而导致插入失败主键冲突唯一键冲突正确写法-- 0 row affected: 表中有冲突数据但冲突数据的值和update的值相等--1 row affected: 表中没有冲突数据数据被插入--2 row affected: 表中有冲突数据并且数据已经被更新通过mysql函数获取受到影响的数据行数-- ON DUPLICATE KEY 当发生重复key的时候5.1.4替换--主键 或者唯一键 没有冲突则直接插入--主键 或者唯一键 如果冲突则删除后再插入-- 1 row affected : 表中没有冲突数据数据被插入--2 row affected : 表中有冲突数据删除后重新插入5.2.1select 列5.2.1.1全列查询通常情况下不建议使用* 进行全列查询1.查询的列越多意味着需要传输的数据量越大2.可能会影响到索引的使用5.2.1.2指定列的查询5.2.1.3查询字段为表达式表达式包含多个字段6.2.1.4为查询结果指定别名6.2.1.5结果去重分数重复了去重结果5.2.2where条件比较运算符例英语不及格的同学以及英语成绩605.2.2.2语文成绩再[80,90]分的同学及语文成绩5.2.2.3数学成绩式58或者59或者98或者99分的同学及数学成绩5.2.2.4姓孙的同学及孙某同学%匹配任意多个包括0个 任意字符_匹配严格的一个任意字符5.2.2.5语文成绩好于英语成绩的同学--where 条件中比较运算符的两侧都是字段5.2.2.6总分在200分以下的同学5.2.2.7 语文成绩 80 并且不姓孙的同学5.2.2.8孙某同学否则要求总成绩200并且语文成绩数学成绩 并且英语成绩805.2.2.9null的查询运算符含义遇到NULL时普通等于只要一边是NULL结果就是NULLNULL安全等于两边都是NULL返回1,一边NULL一边非NULL返回0都不为NULL时等价于 5.2.3结果排序例5.2.3.1同学及数学成绩按数学成绩升序显示5.2.3.2同学及qq号按qq号排序显示NULL视为比任何值都小升序出现在最上面NULL视为比任何值都小降序出现在最下面5.2.3.3查询同学各门成绩依次按按数学降序英语升序语文升序的方式显示--多字段排序排序优先级随书写顺序5.2.3.4查询同学以及总分由高到低order by 子句可以使用列别名5.2.3.5查询姓孙的同学或姓曹的同学的数学成绩结果按数学成绩由高到低显示5.2.4筛选分页结果建议对未知表进行查询时最好加一条LIMIT1避免因为表中数据过大查询全表数据导致数据库卡死按id进行分页每页3条记录分页显示第123页5.3Update5.3.1将孙悟空同学的数学成绩变更为80分查看原数据数据更新查看更新后数据5.3.2将曹孟德同学的数学成绩变更为60分语文成绩变更为70分5.3.3将总成绩倒数前3的3位同学的数学成绩加上30分5.3.4将所有同学的语文成绩更新为原来的2倍5.4Delete5.4.1删除数据5.4.1.1删除孙悟空同学的考试成绩5.4.1.2删除整张数据表删除整表操作要慎用5.4.2截断表truncate [table] table_name注意这个操作慎用1.只能对整表操作不能像DELETE一样针对部分数据操作2.实际上Mysql不对数据操作所以比Delete更快但是truncate在删除数据的时候并不经过真正的事务所以无法回滚。3.会重置AUTO_INCREMENT项5.5插入查询结果例删除表中的重复记录重复的数据只能有一份创建原数据表插入测试数据创建一张空表 no_duplicate_table结构和duplicate_table一样将duplicate_table 的去重数据插入到no_duplicate_table通过重命名表实现原子的去重操作查看最终结果5.6聚合函数函数说明Count([distinct]expr)返回查询到的数据的数量Sum([distinct] expr)返回查询到的数据的总和不是数字没有意义Avg([distinct] expr)返回查询到的数据的平均值不是数字没有意义Max([distinct] expr)返回查询到数据的最大值不是数字没有意义Min([distinct] expr)返回查询到的数据最小值不是数字没有意义5.6.1统计班级共有多少同学5.6.2统计班级收集的qq号有多少5.6.3统计本次考试的数学成绩分数个数5.6.4统计数学成绩总分5.6.5统计平均总分5.6.6返回英语最高分5.6.7返回70分以上的数学最低分5.7group by 子句的使用在select使用group by子句可以对指定列进行分组查询例准备工作创建一个雇员信息表来自oracle 9i的经典测试表EMP员工表DEPT部门表SALGREADE工资等级表mysql DROP TABLE IF EXISTS dept; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql mysql CREATE TABLE dept ( - deptno INT PRIMARY KEY, -- 部门编号 - dname VARCHAR(20), -- 部门名称 - loc VARCHAR(20) -- 所在地 - ); Query OK, 0 rows affected (0.04 sec) mysql mysql INSERT INTO dept VALUES (10, ACCOUNTING, NEW YORK); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO dept VALUES (20, RESEARCH, DALLAS); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO dept VALUES (30, SALES, CHICAGO); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO dept VALUES (40, OPERATIONS, BOSTON); Query OK, 1 row affected (0.01 sec) mysql DROP TABLE IF EXISTS emp; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql mysql CREATE TABLE emp ( - empno INT PRIMARY KEY, -- 雇员编号 - ename VARCHAR(20), -- 雇员姓名 - job VARCHAR(20), -- 职位 - mgr INT, -- 上级主管编号 - hiredate DATE, -- 入职日期 - sal DECIMAL(7,2), -- 月薪 - comm DECIMAL(7,2), -- 奖金 - deptno INT, -- 部门编号 - FOREIGN KEY (deptno) REFERENCES dept(deptno) - ); Query OK, 0 rows affected (0.03 sec) mysql INSERT INTO emp VALUES (7369, SMITH, CLERK, 7902, 1980-12-17, 800, NULL, 20); 81-05-01, 2850, NULL, 30); INSERT INTO emp VALUES (7782, CLARK, MANAGER, 7839, 1981-06-09, 2450, NULL, 10); INSERT INTO emp VALUES (7788, SCOTT, ANALYST, 7566, 1987-04-19, 3000, NULL, 20); INSERT INTO emp VALUES (7839, KING, PRESIDENT, NULL, 1981-11-17, 5000, NULL, 10); INSERT INTO emp VALUES (7844, TURNER, SALESMAN, 7698, 1981-09-08, 1500, 0, 30); INSERT INTO emp VALUES (7876, ADAMS, CLERK, 7788, 1987-05-23, 1100, NULL, 20); INSERT INTO emp VALUES (7900, JAMES, CLERK, 7698, 1981-12-03, 950, NULL, 30); INSERT INTO emp VALUES (7902, FORD, ANALYST, 7566, 1981-12-03, 3000, NULL, 20); INSERT INTO emp VALUES (7934, MILLER, CLERK, 7782, 1982-01-23, 1300, NULL, 10);Query OK, 1 row affected (0.01 sec) mysql INSERT INTO emp VALUES (7499, ALLEN, SALESMAN, 7698, 1981-02-20, 1600, 300, 30); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7521, WARD, SALESMAN, 7698, 1981-02-22, 1250, 500, 30); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO emp VALUES (7566, JONES, MANAGER, 7839, 1981-04-02, 2975, NULL, 20); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7654, MARTIN, SALESMAN, 7698, 1981-09-28, 1250, 1400, 30); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO emp VALUES (7698, BLAKE, MANAGER, 7839, 1981-05-01, 2850, NULL, 30); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7782, CLARK, MANAGER, 7839, 1981-06-09, 2450, NULL, 10); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7788, SCOTT, ANALYST, 7566, 1987-04-19, 3000, NULL, 20); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO emp VALUES (7839, KING, PRESIDENT, NULL, 1981-11-17, 5000, NULL, 10); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7844, TURNER, SALESMAN, 7698, 1981-09-08, 1500, 0, 30); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO emp VALUES (7876, ADAMS, CLERK, 7788, 1987-05-23, 1100, NULL, 20); Query OK, 1 row affected (0.01 sec) mysql INSERT INTO emp VALUES (7900, JAMES, CLERK, 7698, 1981-12-03, 950, NULL, 30); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7902, FORD, ANALYST, 7566, 1981-12-03, 3000, NULL, 20); Query OK, 1 row affected (0.00 sec) mysql INSERT INTO emp VALUES (7934, MILLER, CLERK, 7782, 1982-01-23, 1300, NULL, 10); Query OK, 1 row affected (0.01 sec) mysql SELECT * FROM dept; ------------------------------ | deptno | dname | loc | ------------------------------ | 10 | ACCOUNTING | NEW YORK | | 20 | RESEARCH | DALLAS | | 30 | SALES | CHICAGO | | 40 | OPERATIONS | BOSTON | ------------------------------ 4 rows in set (0.00 sec) mysql SELECT * FROM emp; ---------------------------------------------------------------------- | empno | ename | job | mgr | hiredate | sal | comm | deptno | ---------------------------------------------------------------------- | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 | | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 | | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 | | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 | | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 | | 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 | | 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 | | 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 | | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 | | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 | | 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 | | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 | | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 | | 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 | ---------------------------------------------------------------------- 14 rows in set (0.00 sec) mysql SELECT e.ename, e.job, e.sal, d.dname, d.loc - FROM emp e - JOIN dept d ON e.deptno d.deptno; -------------------------------------------------- | ename | job | sal | dname | loc | -------------------------------------------------- | CLARK | MANAGER | 2450.00 | ACCOUNTING | NEW YORK | | KING | PRESIDENT | 5000.00 | ACCOUNTING | NEW YORK | | MILLER | CLERK | 1300.00 | ACCOUNTING | NEW YORK | | SMITH | CLERK | 800.00 | RESEARCH | DALLAS | | JONES | MANAGER | 2975.00 | RESEARCH | DALLAS | | SCOTT | ANALYST | 3000.00 | RESEARCH | DALLAS | | ADAMS | CLERK | 1100.00 | RESEARCH | DALLAS | | FORD | ANALYST | 3000.00 | RESEARCH | DALLAS | | ALLEN | SALESMAN | 1600.00 | SALES | CHICAGO | | WARD | SALESMAN | 1250.00 | SALES | CHICAGO | | MARTIN | SALESMAN | 1250.00 | SALES | CHICAGO | | BLAKE | MANAGER | 2850.00 | SALES | CHICAGO | | TURNER | SALESMAN | 1500.00 | SALES | CHICAGO | | JAMES | CLERK | 950.00 | SALES | CHICAGO | -------------------------------------------------- 14 rows in set (0.00 sec)如何显示每个部门的平均工资和最高工资显示每个部门的每种岗位的平均工资和最低工资显示平均工资低于2000的部门和它的平均工资统计各个部门的平均工资having和group by 配合使用对group by结果进行过滤注本文更偏向于数据库增删改查的复习练习和笔记操作过程更偏向于会用就行。