数据库编程----MySQL中的增删改查和事务

数据库编程----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语句,很快能写出来的水平才算过关,一起加油

Guess you like

Origin blog.csdn.net/qq_48788523/article/details/121634058