数据库编程----MySQL中的增删改查和事务
一、MySQL中的增(insert)
1.1、全部插入
#使用全部插入的时候,需要一一对应 , 字段和值对应
#如果主键设置了自动增长的话,需要使用default或者null或者0占位(只是占位子哦)
#INSERT INTO 表名 VALUES (值一, 值二,...);
insert into departments values ( null ,default , "1006")
1.2、选择插入
#INSERT INTO 表名(字段一,字段二) VALUES (值一, 值二)
insert into departments(department_name,location_id) values (default, "1001")
1.3、 自动增长 (auto_incement)
补充:自动增长(auto_increment)
1.一个表中只能有一个自动增长
2.要求类型为整数类型
3.只能添加到主键约束和唯一约束的列上
4.删除主键约束或者唯一约束,如果该列拥有自动增长能力,需要删除自动增长然后删除约束
1.4、 默认值(default)
补充:默认值处理
在mysql中可以使用default为自端设定一个默认值
如果在插入数据时并未指定该列的值
那么MySQL会将默认值添加到该列来
二、MySQL中的删(delete)
2.1 、使用delete关键字删除
# delete from 表名 where 条件
#删除部门名字为服务部门
delete from departments
where department_name = "服务部"
2.2、 使用truncate关键字删除
#3.2 truncate table 表名 删除表中的所有数据
TRUNCATE TABLE departments
2.3、 delete和truncate的区别
delete 和 truncate 区别:
1、truncate是整体删除(速度比较快) ,delete是逐条删除(速度较慢)
2、truncate不写服务器log,delete写服务器log,也就是truncate效率比delete高的原因
3、truncate是会重置自增值 ,相当于自增列会被重置为初始值,又重新从1开始记录
而不是接着原来的值 而是delete删除以后 自增仍然会继续增加
#三、删
#3.1 delete from 表名 where 条件
#删除部门名字为服务部门
delete from departments
where department_name = “服务部”
#3.2 truncate table 表名 删除表中的所有数据
truncate table departments
三、MySQL中的改(update)
#update 表名 set 字段名一 = 值
#where 字段名二 = 值
#将部门编号为4的部门名称改为商学院
UPDATE departments SET department_name = "商学院"
where department_id;
在这里使用查询语句的结果集 作为别名(SELECT department_name FROM departments WHERE department_id = 1 ) o
作用是:将将部门编号为4的部门名 赋值给部门编号为1
将部门编号一的部门名称改成部门编号四的部门名称
使用查询语句作为参数
update departments d ,(SELECT department_name FROM departments WHERE department_id = 1 ) o
set d.department_name = o.department_name
where d.department_id = 4
四、MySQL中的查(select)
4.1、单表查询
4.1.1、 基础查询
#select * from 表名 查询表的所有列;
SELECT * FROM employees ;
4.1.2 、条件查询
#select *|投影列 from 表名 where 条件 ;
#投影设备将影像投射到了屏幕上 --->表中的字段投影到查询中(投影列)
SELECT employees_id FROM employees WHERE employees_id = 1 ;
4.1.3、 模糊查询
#在手机购物中在输入框输入一个手机 是不是会出现各种各样的手机
#这是怎么实现的呢?
#没错就是我们的like关键字实现的
#查询employees中雇员名字带有e的雇员信息
select * from employees where last_name like '%e%'
#占位符: % , _
#% :代表前面多个字符
#_ :代表前面只有一个字符
4.2、多表查询
4.2.1、等值连接
#查询雇佣表中员工名为abc的所属部门信息
SELECT employees_id ,last_name ,department_id , department_name, location_id
FROM employees e , departments d
WHERE dept_id = department_id AND last_name = "abc" ;
注意:
#等值连接会去空值
SELECT e.last_name , d.department_name FROM employees e ,
departments d
WHERE e.dept_id = d.department_id
4.2.2、非等值连接
#查询员工的薪资水平
SELECT e.last_name , s.lever FROM employees e , sal_lever s
WHERE e.salary BETWEEN s.lowest_sal AND s.highest_sal
4.2.3、外连接
4.2.3.1 、左外连接
#查询所有雇员的名称以及他们部门名称包括那些没有部门的雇员
SELECT e.last_name , d.department_name FROM employees e
LEFT OUTER JOIN departments d
ON e.dept_id = d.department_id
特点: 左外连接(左边表中的数据全部显示, 右表中数据为空也显示)
4.2.3.2 、右外连接
#4.2.4 右外连接(右边表中的数据全部显示, 左表中数据为空也显示)
#查询所有部门的名称以及他们员工名称包括那些没有员工的部门
SELECT e.last_name , d.department_name FROM employees e
RIGHT OUTER JOIN departments d
ON e.dept_id = d.department_id
特点: 右外连接(右边表中的数据全部显示, 左表中数据为空也显示)
4.2.3.3 、 全外连接
#查询所有部门的名称以及他们员工名称(包括那些没有员工的部门和没有部门的员工)
SELECT e.last_name , d.department_name FROM employees e
LEFT OUTER JOIN departments d ON e.dept_id = d.department_id
UNION
SELECT e.last_name , d.department_name FROM employees e
RIGHT OUTER JOIN departments d
ON e.dept_id = d.department_id
特点:(mysql不支持full outer join连接 但是使用union可以实现完全连接)
4.2.4、 SQL99、标准中查询
4.2.4.1、 交叉连接
#SQL99中的交叉连接 cross join
#(相当于departments表中的记录数 * employees表中的记录数做乘法)
SELECT e.`last_name` , d.department_name FROM employees e CROSS JOIN departments d
4.2.4.2、 自然连接
#SQL99中的自然连接 natural join
SELECT e.`last_name` , d.department_name FROM employees e NATURAL JOIN departments d
SELECT * FROM employees e INNER JOIN departments d
ON e.dept_id = d. department_id WHERE e.last_name = "ddd";
特点: :
使用自然连接查询雇员a的所有信息(内连接和等值连接效果一样的)
(如果查询列中有值为null或者为空会导致查询不出来)
4.2.4.3、 内连接
# SQL99中的内连接 inner join
select * from departments d inner join employees e
on e.`dept_id` = d.`department_id`;
4.3、子查询
可以将子查询放在许多的sql子句中包括:
where子句
having子句
from子句
规则 1、子查询放在圆括号中
2、将子查询放在比较条件的右边
3、在单行子查询中用单行运算符 ,在多行子查询中使用多行运算符
4.3.1、单行子查询
#查询薪水比aaa高的人(圆括号包括子查询 子查询放在比较运算符的后面 )
SELECT last_name FROM employees
WHERE salary > (SELECT salary FROM employees WHERE last_name = "aaa") ;
4.3.2、多行子查询(返回多个查询子集时,需要使用in all any)
#查找各部门收入为部门中最低的那些员工 显示他们的名称 薪水以及部门id
SELECT e.last_name , e.salary , e.dept_id FROM employees e
WHERE e.salary IN
#查询薪水最低 以部门编号分组 (分组了每小组薪水最低的)
(SELECT MIN(e_salary.salary) FROM employees e_salary GROUP BY e_salary .dept_id )
4.4、 MySQL中的分页查询
mysql分页查询原则#
在MySQL数据库中使用limit子句进行分页查询
mysql分页中开位置为0
分页子句中在查询语句的最后测(如果在分页中中limit是放在最后的)
#语法格式select 投影列 from 表 where 条件 order by limit 开始位置 ,查询数量
开始位置是0 查询数量为2 (从取开始位置+1)
SELECT * FROM employees ORDER BY employees_id LIMIT 0 ,2
4.5、分组查询***
#显示最高薪水大于5000的部门的部门号和最高薪水
#group by分组
#约束分组结界(Having)
select e.dept_id , max(e.salary) from employees e
group by e.dept_id
having max(e.salary>5000)
五、其他
5.1、别名
#mysql中的别名
#select 列名 as 列名 from 表名 where 条件
SELECT employees_id , last_name , email ,salary-10000 AS addSalary FROM employees
5.2、连接字符
#Mysql中的连接字符
#mysql中并不支持||作为连字符,需要使用concat字符
#Concat(值一,'' ,值二)
SELECT CONCAT(email , '#' , employees_id) AS newString FROM employees
5.3、去除重复
#去除重复行
#SELECT DISTINCT 列名 FROM 表名 ;
SELECT DISTINCT location_id FROM departments ;
5.4、运算符
#数字运算符
#在mysql中可以使用 + - * / % 操作
#查询所有人在涨工资1000元后情况(使用了+)
SELECT employees_id , last_name , email ,salary-10000 AS addSalary FROM employees
#比较运算符
#= , > >= , <= , != /<>
#主要看看不等于
#查询departments表中不为开发部门的部门有哪些?
#select * from departments where department_name <> "开发部门"
#逻辑运算符
#and or not
#查询雇佣表中雇佣名是带有e,邮件名是带有e的 使用了and
SELECT * FROM employees WHERE last_name LIKE "%e%" AND email LIKE "%e%"
#查询范围
#between....and 表示在一个连续的范围内
#in 表示在一个非连续的范围内
#查询工资是3000元和7000元的员工的信息
SELECT * FROM employees WHERE salary IN (3000,7000)
#看出区别了嘛? 这个不是3000到7000 而是只有3000和7000哦
#查询工资是3000元到7000元的员工的信息
SELECT * FROM employees WHERE salary BETWEEN 3000 AND 7000
#判空和判非空查询
#null 和 is not null
#查询员工的邮箱为空的信息
SELECT * FROM employees WHERE email IS NULL
#查询员工的邮箱不为空的信息
SELECT * FROM employees WHERE email IS NOT NULL
#占位符: % , _
#% :代表前面多个字符
#_ :代表前面只有一个字符
5.5、 排序
#order by 排序
#asc 升序
#desc 降序
#按照薪水排序(降序) (排序一般默认为升序)
SELECT * FROM employees ORDER BY salary DESC
六、事务
事务处理 (比如银行中你ATM机中存入了2000元,此时停电了、这个时候存入了嘛?可能存入可能没存入)
事务就是一个完整的业务 (只有在用户存钱和银行存入用户存钱信息之后才能执行)
如果遇到以上事情,没有事务是很麻烦的
定义:在mysql中 默认情况下 事物是自动提交的 也加上说 只要执行一条DML语句就会开启事务
并且提交了事务
关闭MySQL的事务自动提交
事务处理
定义:在mysql中 默认情况下 事物是自动提交的 也加上说 只要执行一条DML语句就会开启事务
并且提交了事务
关闭MySQL的事务自动提交
#语法: start transaction
# ......
# commit | rollback
#插入数据 提交 (提交了就会去执行里面的操作了)
start transaction
INSERT INTO departments VALUES ( NULL ,DEFAULT , "1006")
commit
#插入数据 回滚 (回滚了就不会执行里面的操作了)
start transaction
INSERT INTO departments VALUES ( NULL ,DEFAULT , "1006")
rollback
总结
关于数据的增删改查,是比较基础和核心的内容,不要觉得简单就不练习,每天看一看练一练,练到那种说出sql语句,很快能写出来的水平才算过关,一起加油