MySql对数据的增删改查
SQL简介
SQL语言是一种数据库查询和程序设计语言。其主要用于存取数据、查询数据、更新 数据和管理关系数据库系统。SQL语言是IBM公司于1975年〜1979年之间开发出来的, 主要使用于IBM关系数据库原型System R。在20世纪80年代,SQL语言被美国国家标 准学会(American National Standards Institute,简称为 ANSI)和国际标准化组织(International Organization for Standardization,简称为丨SO)通过为关系数据库语言的标准。
SQL语言分为3个部分:
- 数据定义语言(Data Definition Language,简称为DDL)
- 数据操作语言(Data Manipulation Language,简称为DML)
- 数据控制语言(Data Control Language,简称为 DCL)。
DDL语句:数据定义语言主要用于定义数据库、表、视图、索引和触发器等。其 中包括CREATE语句、ALTER语句和DROP语句。CREATE语句主要用于创建 数据库、创建表和创建视图等。ALTER语句主要用于修改表的定义、修改视图的 定义等。DROP语句主要用于删除数据库、删除表和删除视图等。
DML语句:数据操纵语言主要用于插入数据、查询数据、更新数据和删除数据。 其中包括INSERT语句、SELECT语句、UPDATE语句和DELETE语句。INSERT 语句用于插入数据;SELECT语句用于查询数据;UPDATE语句用于更新数据; DELETE语句用于删除数据。
DCL语句:数据控制语言主要用于控制用户的访问权限。其中包括GRANT语句 和REVOKE语句。GRANT语句用于给用户增加权限;REVOKE语句用于收回用 户的权限。
数据库管理系统通过这些SQL语句可以操作数据库中的数据。在应用程序中,也可以 通过SQL语句来操作数据。例如,可以在Java语言中嵌入SQL语句。通过执行Java语言 来调用SQL语句,这样即可在数据库中插入数据、查询数据。SQL语句也可以嵌入到C# 语言、PHP语言等编程语言中。
插入数据
给指定列插入数据
Insert into 表(列1,列2…)values (值1,值2…);
没有赋值的字段,数据库系统会为其插入默认值。这个默认值是在创建表的时候定义的。如果没有定义默认值,那么就是NULL.
给所有列插入数据
Insert into 表 values(值1,值2…);
插入多个行
Insert into 表 (列1,列2…) values(值1,值2…),( 值1,值2…),( 值1,值2…)…;
练习:创建如下三张表,并且添加数据【重要,必须完成,否则后续课程无法继续】
查询数据
-
查询单个列
SELECT 列名称 FROM table; -
查询员工的姓名
SELECT ename FROM emp; -
查询多个列
SELECT 列1,列2,列3… FROM table; -
查询员工的姓名和工作
SELECT ename , job FROM emp; -
查询所有列
SELECT * FROM table; -
查询员工的所有信息
SELECT * FROM emp; -
去除重复数据
SELECT DISTINCT 列1,列2… FROM table; -
查询emp表中有哪些工种
SELECT DISTINCT job FROM emp;
查询中的四则运算
Mysql支持在查询中直接进行四则运算[ +、-、*、/ ] -
查询每个员工的年薪
SELECT ename,sal*12 FROM emp; -
查询用别名
Select 列1 AS 别名1,列2 别名2 … FROM 表; -
查询每个员工的年薪
SELECT ename 姓名,sal*12 AS 年薪 FROM emp; -
排序查询
SELECT * FROM 表 ORDER BY 列1 ASC,列2 DESC… -
查询员工的姓名和工资,按照工资降序排序
SELECT ename,sal FROM emp ORDER BY sal DESC; -
按照多个字段排序:查询员工的姓名,入职日期和工资,按照工资升序,入职日期升序排序
SELECT ename,emp.HIREDATE,sal FROM emp ORDER BY sal ASC, emp.HIREDATE ASC; -
分页查询
SELECT * FROM table LIMIT start,pagesize; -
查询员工表的前三条记录
SELECT ename,emp.HIREDATE,sal FROM emp LIMIT 3; – 取出来前3条记录 -
查询员工表中间的三条记录,从第五条开始取
SELECT ename,emp.HIREDATE,sal FROM emp LIMIT 4,3; – 5是行号,行号从0开始 -
查询员工表中间的10条记录,从第5条开始取,按照工资升序
SELECT ename,emp.HIREDATE,sal FROM emp ORDER BY sal LIMIT 5,10; -
使用全限定的列名查询
SELECT 表1.列1,表1.列2… FROM 表; -
查询员工姓名和工资
SELECT emp.ename ,emp.sal FROM emp; -
查用表别名查询
SELECT a.列1,a.列2… FROM 表 a; -
查询员工的姓名和工资
SELECT e.ename ,e.sal FROM emp e;
WHERE子句
Select * from 表 where 条件 order by column1…;
使用比较运算符查询
-
查询员工编号是7566的员工信息
SELECT * FROM emp e WHERE e.EMPNO = 7566; -
查询不是销售员的员工信息
SELECT * FROM emp e WHERE e.JOB != ‘SALESMAN’;
SELECT * FROM emp e WHERE e.JOB <> ‘SALESMAN’; -
查询工资小于3200的员工信息
SELECT * FROM emp e WHERE e.SAL < 3200; -
查询工资大于3200的员工信息
SELECT * FROM emp e WHERE e.SAL > 3200; -
查询工资小于等于2000的员工信息
SELECT * FROM emp e WHERE e.SAL <= 2000; -
查询工资大于等于2000的员工信息
SELECT * FROM emp e WHERE e.SAL >= 2000;
进行范围查询 -
查询工资在2000 - 3000之间的员工信息
SELECT * FROM emp e WHERE e.SAL BETWEEN 2000 AND 3000;
空值/非空查询 -
查询有奖金的员工信息
SELECT * FROM emp e WHERE e.COMM IS NOT NULL; -
查询没有奖金的员工信息
SELECT * FROM emp e WHERE e.COMM IS NULL;
多条件查询-AND -
查询销售员中工资大于1200的员工信息
SELECT * FROM emp e WHERE e.SAL > 1250 AND e.JOB = ‘salesman’; -
查询销售员中工资大于1200的员工信息入职日期在1981年5月之前的
SELECT * FROM emp e WHERE e.SAL > 1250 AND e.JOB = ‘salesman’ AND e.HIREDATE < ‘1981-5-1’;
多条件查询-OR -
查询工资大于4500或者是销售员的员工信息
SELECT * FROM emp e WHERE e.SAL > 4500 OR e.JOB = ‘salesman’; -
查询7566,7788,7956三个员工的信息
SELECT * FROM emp e WHERE e.EMPNO = 7566 OR e.EMPNO = 7788 OR e.EMPNO = 7839;
IN关键字查询 -
查询7566,7788,7956三个员工的信息
SELECT * FROM emp e WHERE e.EMPNO IN (7566,7788,7839,777);
NOT关键字查询 -
查询不是7566,7788,7956这三个员工的信息
SELECT * FROM emp e WHERE e.EMPNO NOT IN (7566,7788,7839);
模糊查询 -
查询姓名中带有A的员工信息
SELECT * FROM emp e WHERE e.ENAME LIKE ‘%a%’; -
查询姓名中以A结尾的员工信息
SELECT * FROM emp e WHERE e.ENAME LIKE ‘%a’; -
查询姓名中以A开头的员工信息
SELECT * FROM emp e WHERE e.ENAME LIKE ‘a%’; -
查询姓名中第二个字母是A的员工信息
SELECT * FROM emp e WHERE e.ENAME LIKE ‘_a%’; -
查询姓名中第三个字母是A的员工信息
SELECT * FROM emp e WHERE e.ENAME LIKE ‘__a%’; -
查询姓名中第二个字母是_的员工信息
SELECT * FROM emp e WHERE e.ENAME LIKE ‘/%’ ESCAPE ‘/’; -
组合查询-合并结果集
-
查询工资在1200以上的员工信息
SELECT ename,sal FROM emp e WHERE e.SAL > 1200; -
查询工资在3000以上的员工信息
SELECT ename,sal FROM emp e WHERE e.SAL > 3000; -
合并结果集: 去除重复数据
SELECT ename,sal FROM emp e WHERE e.SAL > 1200
UNION
SELECT ename,sal FROM emp e WHERE e.SAL > 3000; -
合并结果集:不去除重复数据
SELECT ename,sal FROM emp e WHERE e.SAL > 1200
UNION ALL
SELECT ename,sal FROM emp e WHERE e.SAL > 2000 ORDER BY sal; -
分组函数(聚合函数)
-
求和函数SUM() :求所有人的工资总和
SELECT SUM(sal) FROM emp ; -
求20号部门的工资总和
SELECT SUM(sal) FROM emp WHERE emp.DEPTNO = 20; -
求平均数的函数AVG():求所有人的平均工资
SELECT AVG(sal) FROM emp ; -
求20号部门的平均工资
SELECT AVG(sal) FROM emp WHERE emp.DEPTNO = 20; -
求最大值函数MAX():查询最高工资
SELECT MAX(sal) FROM emp ; -
查询20号部门的最高工资
SELECT MAX(sal) FROM emp WHERE emp.DEPTNO = 20; -
求最小值函数MIN():查询最低的工资
SELECT MIN(sal) FROM emp ; -
查询20号部门的最低工资
SELECT MIN(sal) FROM emp WHERE emp.DEPTNO = 20; -
求总行数的函数count():查询公司有多少名员工
SELECT COUNT(empno) FROM emp; -
查询20号部门的人数
SELECT COUNT(empno) FROM emp WHERE emp.DEPTNO = 20;
分组查询
- 查询每个部门的最低工资
SELECT deptno,MIN(sal) xyz FROM emp GROUP BY deptno; - 查询每个部门的最高工资
SELECT deptno,MAX(sal) xyz FROM emp GROUP BY deptno; - 查询每个部门的人数
SELECT deptno,COUNT(empno) xyz FROM emp GROUP BY deptno; - 查询每个部门下每个工种有多少人
SELECT deptno,job,COUNT(empno) FROM emp e GROUP BY e.DEPTNO,e.JOB; - 查询每个部门的最低工资以及部门号
SELECT deptno,MIN(sal) FROM emp e GROUP BY e.DEPTNO;
-分组函数练习:显示非销售人员工作名称以及从事同一工作的员工的月工资的总和
SELECT e.JOB,SUM(sal) FROM emp e WHERE e.JOB <> ‘salesman’ GROUP BY e.JOB;
- 分组查询:对分组条件筛选
对分组以后的数据进行筛选使用HAVING子句 - 显示非销售人员工作名称以及从事同一工作的员工的月工资的总和,
- 并且要满足从事同一工作月工资总和大于5000,结果按月工资总和的升序排列。取出来第一条记录
SELECT e.JOB,SUM(sal) 总和 FROM emp e WHERE e.JOB <> ‘salesman’
GROUP BY e.JOB HAVING SUM(sal) > 5000 ORDER BY 总和 DESC LIMIT 1;
小总结:
-
SQL语句顺序:
select 列1,列2… from tableName [WHERE 子句] [GROUP BY 子句] [HAVING 子句] [ORDER BY 子句] [limit x,y]
删除数据
格式:DELETE FROM tableName [WHERE 条件]; -
删除要带条件,否则删除整张表中的数据
DELETE FROM salgrade; -
删除编号是7369的员工
DELETE FROM emp WHERE empno = 7369; -
删除7521或者是20号部门的员工
DELETE FROM emp WHERE empno = 7521 OR deptno = 20; -
如果确实要清空表中的数据,那么使用截断表速度更快
TRUNCATE emp;
更新数据
格式:UPDATE tableName SET 列1 = 值1,列2 = 值2 [where 条件]
- 将所有的部门地址修改成上海
UPDATE dept SET loc = ‘上海’; – 更新也要带条件,否则更新全表 - 将10号部门地址修改成北京,部门名称修改成信息部
UPDATE dept SET dname = ‘信息部’,loc = ‘北京’ WHERE deptno = 10;