MySQL代码实际操作笔记


一、MYSQL约束

提示:以下是本篇文章正文内容,下面案例可供参考

create database mybd;
USE mybd;
CREATE TABLE IF NOT EXISTS stt(
	sid INT PRIMARY KEY AUTO_INCREMENT,   -- 主键约束  后面是自增长约束 两者一起使用
	NAME VARCHAR(20) NOT NULL,  -- 非空约束
	age INT ZEROFILL,     -- 零填充约束 自动变为无符号,数值范围变大
	address  VARCHAR(20) DEFAULT '北京',   -- 默认约束
	dir VARCHAR(20) UNIQUE    -- 唯一约束
	-- primary key(sid,name)  联合主键
)AUTO_INCREMENT = 100;

ALTER TABLE stt DROP bir;
ALTER TABLE stt ADD bir INT;

ALTER TABLE stt ADD PRIMARY KEY( sid);    -- 增加主键约束 
ALTER TABLE stt DROP PRIMARY KEY(sid);     -- 删除主键约束
ALTER TABLE stt AUTO_INCREMENT = 100;       -- 设定自增长初始值   不设定则默认从1开始

ALTER TABLE stt MODIFY NAME VARCHAR(20) NOT NULL;    -- 增加非空约束
ALTER TABLE stt MODIFY NAME VARCHAR(20);      -- 删除非空约束 
ALTER TABLE stt MODIFY age INT;      -- 删除零填充约束 

ALTER TABLE stt ADD CONSTRAINT 约束名 UNIQUE(NAME);   -- 增加唯一约束 约束名随便写
ALTER TABLE stt DROP INDEX 约束名;     -- 删除唯一约束  要是在创建表上直接创建,约束名就是用约束的列名

ALTER TABLE stt MODIFY address VARCHAR(20) DEFAULT '北京';   -- 增加默认约束
ALTER TABLE stt MODIFY address VARCHAR(20) DEFAULT NULL;     -- 删除默认约束

INSERT INTO stt VALUES (1,'shjask',1,'3');
INSERT INTO stt(sid,NAME,age,dir) VALUES (1,'shjask',1,'3'),(2,'shjask',3,'4');

delete from stt;
truncate stt;

desc stt;

二、MYSQL数据库基本操作

USE mybd;
CREATE TABLE IF NOT EXISTS product(
	pid INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20) NOT NULL,
	price DOUBLE,
	category_id VARCHAR(20)
);

INSERT INTO product VALUES(NULL,'海尔',5000,'c001');
INSERT INTO product VALUES(NULL,'美的',3000,'c001');
INSERT INTO product VALUES(NULL,'衬衣',300,'c002');
INSERT INTO product VALUES(NULL,'西裤',800,'c002');
INSERT INTO product VALUES(NULL,'面霜',300,'c003');
INSERT INTO product VALUES(NULL,'精华水',200,'c003');
INSERT INTO product VALUES(NULL,'坚果',88,NULL);

SELECT * FROM product;     -- 查询所有信息,*代表所有列
SELECT DISTINCT price FROM product;  -- 删除 price 重复值
SELECT panme,price+10 AS new_price FROM product;-- 查询结果为表达式(例如所有price+10)as后面跟的是别名,as可省略

SELECT * FROM product WHERE price = 300;  -- 不等于!= 或者<>
SELECT * FROM product WHERE price BETWEEN 200 AND 1000; -- 查询价格2001000的商品
SELECT * FROM product WHERE price IN(300,1000);  -- 查询价格为3001000的商品

SELECT * FROM product WHERE pname LIKE '%裤';  -- %用于匹配任意字符,_用于匹配单个字符
SELECT * FROM product WHERE pname LIKE '_华%';
SELECT * FROM product WHERE pname REGEXP  '^海'-- ^海 代表以海开头的 在字符串开头匹配
SELECT * FROM product WHERE pname REGEXP  '面$'--  在字符串末尾匹配
SELECT * FROM product WHERE pname REGEXP  '面.'-- 任意单个字符

SELECT * FROM product WHERE category_id is null;  -- 查询内容是否为null
SELECT * FROM product WHERE category_id is not null;  -- 查询内容是否不是null

select * from product order by price;  -- 默认是升序(asc),降序是desc 改题是根据price进行排序
select * from product order by price desc,category_id desc; -- 在第一个条件的基础上,进行第二个条件的排序

select count(*) from product;  -- 查询商品总条数,不计算null
select sum(price) sum_price from product where category_id='c001'; -- 计算c001商品价格的总和
select avg(price) from product;  -- 计算平均值
select max(price) max_price, min(price) min_price from product;

select count(category_id) from product group by category_id;  -- 根据category_id数组是否相同进行分组 ,并统计个数
select category_id,count(pid) cut from product group by category_id having cut>1;  -- having是对group by进行筛选,where是对from进行筛选

select * from product limit 5;  -- 查询product前五条消息
select * from product limit 3,5;  -- 从第四条开始显示,显示五条

insert into table2 select * from table1; -- 将table1的数据导入table2中,二者接收数据类似必须一致且table2必须存在
ifnull(category_id,0) 是如果category_id的值是null,则当场0 

三、多表操作

USE mybd;
CREATE TABLE IF NOT EXISTS dept(
	detpno VARCHAR(20) PRIMARY KEY,
	NAME VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS emp(
	eid VARCHAR(20) PRIMARY KEY,
	ename VARCHAR(20),
	age INT,			
	dept_id  VARCHAR(20),  -- 员工所属部门
	CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept (detpno)  -- emp_fk是外键名字,可以随便起
	--                               ^给哪一列设置外键        ^主表名和主键列
);
INSERT INTO dept VALUES('1001','研发部'),('1002','人事部'),('1003','销售部');

INSERT INTO emp VALUES('1','rhg',20,'1001');
INSERT INTO emp VALUES('2','zyf',20,'1002');
INSERT INTO emp VALUES('3','yym',19,'1002');


DELETE FROM dept WHERE detpno = '1001';  -- 不可以被删除,主表的数据被依赖时不能被删除
DELETE FROM dept WHERE detpno = '1003';  -- 可以被删除
DELETE FROM emp WHERE eid = '2';  -- 可以被删除,从表随便删

ALTER TABLE emp DROP FOREIGN KEY emp_fk;  -- 删除外键
ALTER TABLE emp ADD CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept (detpno);  -- 添加外键 

SELECT * FROM emp WHERE age = (SELECT MAX(age) FROM emp);  -- 子查询 查询年龄最大的
SELECT * FROM dept d JOIN emp e ON e.dept_id = d.detpno AND(NAME = '研发部' OR NAME = '人事部'); -- 关联查询

SELECT * FROM emp WHERE age > ALL(SELECT age FROM emp WHERE dept_id = '1001');  -- all 的用法举例
SELECT * FROM emp WHERE age > ANY(SELECT age FROM emp WHERE dept_id = '1001');  -- any 的用法举例,和some相同
SELECT * FROM emp e WHERE EXISTS(SELECT age FROM emp WHERE e.dept_id = '1001');  -- exists 的用法举例,存在则返回ture,外层查询执行 括号里面必须是查询语句
SELECT * FROM emp WHERE EXISTS(SELECT 1);  -- 全表输出

SELECT GROUP_CONCAT(ename ORDER BY age SEPARATOR ';') FROM emp GROUP BY dept_id;   -- group_concat使数据合并成一行,separator表示分隔符

四、各种函数(日期、数学、字符串)

SELECT ABS(-456);  -- 表示绝对值
SELECT CEIL(56.1);  -- 表示向上取整
SELECT FLOOR(56.9);  -- 表示向下取整
SELECT GREATEST(1,2.3,5);  -- 表示取列表最大值
SELECT LEAST(1,2.3,5);  -- 表示取列表最小值
SELECT MOD(5,2);  -- 表示取模,5除以2的余数
SELECT POW(2,2);  -- 返回22次方
SELECT RAND();  -- 返回01的随机数
SELECT ROUND(1.2555);   -- 四舍五入
SELECT ROUND(1.2555,3);   -- 四舍五入,保留3位小数
SELECT TRUNCATE(1.2555,3);   -- 不进行四舍五入,只保留3位小数

SELECT CHAR_LENGTH('Geass');    -- 返回字符的个数,是字节,一个汉字在utf—8里面是三个字节
SELECT CONCAT('Gode','Geass');   -- 将字符串合并,无间隔符
SELECT CONCAT_WS('-','Gode','Geass');   -- 将字符串合并,间隔符是第一个设定的字符
SELECT FIELD('c','a','b','c');   -- 返回第一个字符在列表中第一次出现的位置
SELECT LTRIM('			cc');  -- 去除字符串左边的空格
SELECT RTRIM('cc			a');  -- 去除字符串右边的空格
SELECT TRIM('		cca		');  -- 去除字符串两端的空格
SELECT MID('hello',2,3);      -- 从第2个字节开始截取字符串,截取3个
SELECT POSITION('abc' IN 'hello abc');   -- 获取字符串c在字符串abc中的位置
SELECT REPLACE('abc','a','z');    -- 将字符串abc的字符a替换成z
SELECT REVERSE('abcd');   -- 将字符串顺序反过来
SELECT RIGHT('MYSQL',3);  -- 返回字符串后三个字符
SELECT STRCMP('hello','world');  -- 字符串比较,比较在字典里面的位置
SELECT SUBSTR('hello',2,3);  -- 字符 串截取,从第二个字符开始,截取三个(substring也可以)
SELECT UPPER('hello world');  -- 将小写转换为大写(ucase也可以)
SELECT LOWER('HELLO WORLD');  -- 将大写转换为小写(lcase也可以)

-- 日期函数
SELECT UNIX_TIMESTAMP();  -- 获得时间串,毫秒级
SELECT FROM_UNIXTIME(1645363457,'%Y-%m-%d %H:%i:%s');  -- 将时间串毫秒值转化为指定格式的日期

SELECT CURDATE();    -- 获取当前年月日(current_date也可以)
SELECT CURTIME();   -- 获取当前时分秒(current_time也可以)
SELECT CURRENT_TIMESTAMP();   -- 获取当前日期和时间
SELECT NOW();                 -- 同上
SELECT DATE('2022-02-20 21:47:19');   -- 获取日期字符串中的年月日
SELECT DATEDIFF('2022-02-20','2020-08-23');   -- 获取日期之间的差值
SELECT TIMEDIFF('21:47:19',CURTIME());    -- 获取时间的差值
SELECT DATE_FORMAT('2022-02-20 1:7:9','%Y-%m-%d %r %H:%i:%s');    -- 日期格式化
SELECT STR_TO_DATE('August 10 2017','%M%d%Y');     -- 将字符串转变为日期 
SELECT DATE_SUB('2022-2-22',INTERVAL 2 DAY);    -- 将日期作减法
SELECT DATE_ADD('2022-2-22',INTERVAL 11 DAY);    -- 将日期作加法
SELECT EXTRACT(MINUTE FROM '2022-02-22 22:23:22');    --  获取日期中设定的值,minute是分钟
SELECT LAST_DAY('2022-2-22');    -- 获取给定日期的最后一天
SELECT MAKEDATE('2022',53);      -- 获取指定年份和天数的日期,2022年的第53天是几号
-- 根据日期获取相应信息
SELECT YEAR('2022-2-22');
SELECT MONTH('2022-2-22');
SELECT MINUTE('2022-2-22');
SELECT WEEK('2022-2-22');
SELECT QUARTER('2022-2-22');   -- 获取季度
SELECT MONTHNAME('2022-2-22');   -- 获取月的英文名
SELECT DAYNAME('2022-2-22');   -- 获取星期的英文名
SELECT DAYOFWEEK('2022-2-22');   -- 获取星期几(1是星期日,2是星期一)
SELECT DAYOFYEAR('2022-2-22');   -- 获取该天是该年的第几天

SELECT IF(1<0,'yes','no yes');
SELECT IFNULL(NULL,'no');  -- 判断v1是否为null,是则返回null,不是则返回v2
SELECT ISNULL(NULL);      -- 判断内容是否为null,是返回1,不是返回0
SELECT NULLIF(25,25);      -- 如果expr1与expr相等,返回null,否则返回expr1	

五、MYSQL排序、分组操作

USE mybd;

CREATE TABLE employee(
  dname VARCHAR(20),
  eid VARCHAR(20),
  ename VARCHAR(20),
  hiredate DATE,
  salary DOUBLE
);
INSERT INTO employee VALUES('研发部','1001','张飞','2022-02-03',3000);
INSERT INTO employee VALUES('研发部','1001','赵云','2022-02-04',3500);
INSERT INTO employee VALUES('研发部','1001','马超','2022-02-03',7200);
INSERT INTO employee VALUES('研发部','1001','黄忠','2022-02-05',5600);
INSERT INTO employee VALUES('研发部','1001','关羽','2022-02-06',4500);
INSERT INTO employee VALUES('研发部','1001','关平','2022-02-06',4500);
INSERT INTO employee VALUES('销售部','1002','曹操','2022-02-16',8500);
INSERT INTO employee VALUES('销售部','1002','张辽','2022-02-17',8500);
INSERT INTO employee VALUES('销售部','1002','典韦','2022-02-17',6500);
INSERT INTO employee VALUES('销售部','1002','许褚','2022-02-18',5500);
INSERT INTO employee VALUES('销售部','1002','徐晃','2022-02-18',5500);

-- 三种方法排序
SELECT dname,ename,salary, 
  row_number() over(PARTITION BY dname ORDER BY salary DESC) rn_row,
  rank() over(PARTITION BY dname ORDER BY salary DESC) rn_rank,
  dense_rank() over(PARTITION BY dname ORDER BY salary DESC) rn_dense 
FROM employee;

-- 求薪资排名前三的员工
SELECT * FROM(
  SELECT dname,ename,salary, 
  rank() over(PARTITION BY dname ORDER BY salary DESC) rn
  FROM employee
)t 
WHERE t.rn <=3;

-- 对所有员工进行排序
SELECT dname,ename,salary, rank() over(ORDER BY salary DESC) rn FROM employee;

-- 对员工工资进行相加
SELECT dname,ename,salary, SUM(salary) over(PARTITION BY dname ) SUM FROM employee;

SELECT dname,ename,salary, cume_dist() over(PARTITION BY dname ORDER BY salary DESC) cd FROM employee;  -- cume_dist():分组内小于等于当前值的行数除以总行数
SELECT dname,ename,salary, cume_dist() over(ORDER BY salary DESC) cd FROM employee;   -- 不加partition by 则所有分组的内容合并成一个大组
SELECT 
  dname,ename,salary,hiredate,
  lag(hiredate,1,'2001-1-1') over(PARTITION BY dname ORDER BY hiredate) time1,
  lag(hiredate,2) over(PARTITION BY dname ORDER BY hiredate) time2
FROM employee;  -- lag是返回当前行的前n行的expr的值,lag()填写的第三个值是默认值,不填写的话默认是0。lead是返回当前行的后n行的expr的值

SELECT 
  dname,ename,salary,hiredate,
  lead(hiredate,1,'2001-1-1') over(PARTITION BY dname ORDER BY hiredate) time1,
  lead(hiredate,2) over(PARTITION BY dname ORDER BY hiredate) time2
FROM employee;  -- lead是返回当前行的后n行的expr的值,注意点与lag相同

-- 查询第一个和最后一个入职人的薪资
SELECT 
  dname,ename,salary,hiredate,
  first_value(salary) over(PARTITION BY dname ORDER BY hiredate) frist,
  last_value(salary) over(PARTITION BY dname ORDER BY hiredate) LAST
FROM employee;  -- 返回第一个或最后一个expr的值

-- 查询特定位置的信息
SELECT 
  dname,ename,salary,hiredate,
  nth_value(salary,2) over(PARTITION BY dname ORDER BY hiredate) second_score,
  nth_value(salary,3) over(PARTITION BY dname ORDER BY hiredate) third_score
FROM employee;  -- 返回当前窗口第n个的expr的值

-- 将每门员工按照入职日期分组
SELECT 
  dname,ename,salary,hiredate,
  ntile(3) over(PARTITION BY dname ORDER BY hiredate) nti
FROM employee;  -- 将分区的有序数据分成n个等级,记录等级数

六、MYQSL视图和存储过程

此模块使用的表为emp,创建在模块三种


USE mybd;
CREATE OR REPLACE VIEW view1 AS SELECT eid,ename,age FROM emp;  -- 创建视图
SHOW FULL TABLES;  -- 查看表和视图 
SELECT * FROM view1;

-- 修改视图
ALTER VIEW view1 AS SELECT eid,ename,age,dept_id FROM emp;   

-- 重命名视图
RENAME TABLE view1 TO my_view;

-- 删除视图,只能删除视图的定义,不能删除数据
DROP VIEW IF EXISTS my_view ;

-- 创建存储过程
DELIMITER $   -- $ 可以换成任意符号 
CREATE PROCEDURE proc01() 
BEGIN 
  SELECT eid,ename,age,dept_id FROM emp;
END $         -- $ 该符号应该与上面的相同
DELIMITER ;

-- 调用存储过程
CALL proc01;

-- 定义变量
DELIMITER $$ 
CREATE PROCEDURE proc02 () 
BEGIN
  DECLARE my_name VARCHAR (20) ;   -- 定义局部变量
  SELECT ename INTO my_name FROM emp WHERE dept_id = 1001 ;   -- 给变量赋值
  SELECT my_name ;      -- 输出变量的值
END $$
DELIMITER ;

CALL proc02 ;

-- 用户变量
DELIMITER $$ 
CREATE PROCEDURE proc03() 
BEGIN
  SET @var_name01 = 'beijing';    -- 加了@是用户变量,出了存储过程也可以使用
  SELECT @var_name01;
END $$
DELIMITER ;
CALL proc03() ;
SELECT @var_name01;   -- 也可以使用用户变量

-- 查看全局变量,查看某个全局变量是select @@global.需要查询的变量名。修改是set global.需要查询的变量名= ;
SHOW GLOBAL VARIABLES;

-- 查看会话变量,操作与全局变量类似
SHOW SESSION VARIABLES;

-- 传入参数in 
DELIMITER $$
CREATE PROCEDURE proc04(IN peid VARCHAR(20))
BEGIN
  SELECT * FROM emp WHERE eid = peid;
END  $$
DELIMITER ;
CALL proc04('1');

-- 传出参数out
DELIMITER $$
CREATE PROCEDURE proc05(IN peid VARCHAR(20),OUT out_name VARCHAR(20))
BEGIN
  SELECT ename INTO out_name FROM emp WHERE eid = peid;   --  into是将ename的值赋予给out_name
END  $$
DELIMITER ;
CALL proc05('1',@ename);  --  利用用户变量来接受返回的值
SELECT @ename;

--  传参inout
DELIMITER $$
CREATE PROCEDURE proc06(INOUT num INT)
BEGIN
  SET num = num * 10;
END $$
DELIMITER ;
SET @inout_num = 2;  -- 要设置用户变量
CALL proc06(@inout_num);
SELECT @inout_num;

--  if
DELIMITER $$
CREATE PROCEDURE proc07 (IN score INT) 
BEGIN
  IF score < 60 
  THEN 
  SELECT 
    '不及格' ;
  ELSEIF score >= 60 AND score < 80 
  THEN 
  SELECT 
    '及格' ;
  ELSEIF score >= 80 AND score < 90 
  THEN 
  SELECT 
    '良好' ;
  ELSEIF score >= 90 AND score <= 100 
  THEN 
  SELECT 
    '优秀' ;
  ELSE 
  SELECT 
    '成绩错误' ;
  END IF ;
END $$
DELIMITER ;
CALL proc07(90);

-- switch
DELIMITER $$
CREATE PROCEDURE proc08(IN pay INT)
BEGIN
  CASE pay
    WHEN 1 THEN SELECT '微信支付';
    WHEN 2 THEN SELECT '支付宝支付';
    WHEN 3 THEN SELECT '银行卡支付';
    ELSE SELECT '其他方式支付';
  END CASE;
END $$
DELIMITER ;
CALL proc08(2);

七、MYSQL游标、函数

USE mybd;
CREATE TABLE USER (
  uid INT PRIMARY KEY,
  uname VARCHAR(20),
  PASSWORD VARCHAR(20)
);

DELIMITER $$
CREATE PROCEDURE proc09(IN ic INT)
BEGIN
  DECLARE i INT DEFAULT 1;  -- declare是要定义局部变量,default是要使用的默认值
  label:WHILE i<=ic DO
  INSERT INTO USER VALUES(i,CONCAT('user-',i),'123456');
  IF i = 5 THEN
    LEAVE label;             -- leave相当于break,而iterate相当于continue
  END IF;
  SET i = i+1;
  END WHILE label;          -- label是标签,可以去掉
  SELECT '循环结束';
END$$
DELIMITER ;

CALL proc09(6);

TRUNCATE TABLE USER;

-- repeat 相当与do while
DELIMITER $$
CREATE PROCEDURE proc10 (IN ic INT) 
BEGIN
  DECLARE i INT DEFAULT 1 ;
  label:REPEAT
    INSERT INTO USER VALUES(i, CONCAT('user-', i), '123456') ;
    SET i = i + 1 ;
    UNTIL i > ic       -- 当满足成功条件时退出循环
  END REPEAT label ;
  SELECT '循环结束';
END $$
DELIMITER ;

CALL proc10(10);

-- loop
DELIMITER $$
CREATE PROCEDURE proc11_loop (IN ic INT) 
BEGIN
  DECLARE i INT DEFAULT 1 ;
  label:LOOP
    INSERT INTO USER VALUES(i, CONCAT('user-', i), '123456') ;
    SET i = i + 1 ;
    IF i > ic
      THEN
        LEAVE lable;
    END IF;
    UNTIL i > ic       -- 当满足成功条件时退出循环
  END LOOP label ;
  SELECT '循环结束';
END $$
DELIMITER ;

-- 游标
  -- 声明游标
  DECLARE [游标名字] CURSOR FOR select_statement;
  -- 打开语法
  OPEN [游标名字];
  -- 取值语法
  FETCH [游标名字] INTO .....;
  -- 关闭语法
  CLOSE [游标名字];
  
-- 创建函数
DROP FUNCTION IF EXISTS myfunc_emp;
  -- 创建函数之前先要允许创建函数权限信任
  SET GLOBAL log_bin_trust_function_creators = TRUE;
DELIMITER $$
CREATE FUNCTION myfunc_emp(in_eid INT) RETURNS VARCHAR(20)
BEGIN
  DECLARE out_ename VARCHAR(20);
  SELECT ename INTO out_ename FROM emp WHERE eid = in_eid;
  RETURN out_ename;
END $$
DELIMITER ;

-- 调用函数
SELECT myfunc_emp(1);

八、MYSQL触发器、事务

CREATE DATABASE IF NOT EXISTS mybd2;
USE mybd2;
CREATE TABLE USER(
  uid INT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  PASSWORD VARCHAR(50) NOT NULL
);

CREATE TABLE user_logs(
  id INT PRIMARY KEY AUTO_INCREMENT,
  TIME TIMESTAMP,
  log_text VARCHAR(255)
);

-- 查看触发器
SHOW TRIGGERS;


-- 删除触发器
DROP TRIGGER IF EXISTS trigger_text2;


 -- 执行一条语句的写法(insert)
CREATE TRIGGER trigger_text1 AFTER INSERT  --  添加insert触发器 还可以添加drop和update
ON USER FOR EACH ROW
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有新用户添加,信息为:',new.uid,new.username,new.password));

INSERT INTO USER VALUES(2,'zyf','123456');

-- 执行多条语句的写法(update)
DELIMITER $$
CREATE TRIGGER trigger_text2 BEFORE UPDATE 
ON USER FOR EACH ROW
BEGIN
  INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有用户信息被修改,修改之前信息为:',old.uid,old.username,old.password));
END $$
DELIMITER ;

UPDATE USER SET PASSWORD = '899999' WHERE uid = 2;


-- 执行多条语句的写法(delete)
DELIMITER $$
CREATE TRIGGER trigger_text3 BEFORE DELETE 
ON USER FOR EACH ROW
BEGIN
  INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有用户信息被删除,删除用户信息为:',old.uid,old.username,old.password));
END $$
DELIMITER ;
DELETE FROM USER WHERE uid = 2;


SELECT @@autocommit;  -- 默认为1
-- 设置mysql事务为手动提交(关闭自动提交)
SET autocommit = 0; 
SET autocommit = 1;    -- 用完之后记得重新设置回1

-- 开启事务
BEGIN;
UPDATE employee SET salary = salary - 500 WHERE ename='张飞';
UPDATE employee SET salary = salary + 500 WHERE ename='赵云';

-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

SELECT * FROM employee;

作者个人小总结

  MYSQL学习也是在漫长的程序员道路上的一个路标,在学习并且熟知完以上的代码后,mysql的基本使用可以说是
掌握一些的。这些知识点记起来倒不困难,难的是隔一段时间之后使用起来的掌握程度。就像是学习一样,两天不学
就不爱学了;两周不学就全忘了一样。不是条轻松路。【搞得好像哪条路好走一样....】。

好好学吧小伙子们
以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CSDN是一个技术交流平台,里面有许多关于各种编程语言和数据库的学习资料和笔记。而MySQL是其中一种常用的关系型数据库管理系统,也是开放源代码软件之一。 在CSND上,MySQL笔记是指关于MySQL数据库的学习和使用的笔记和教程。这些笔记包含了MySQL数据库的基本概念、安装配置、SQL语句的使用、数据表的设计和管理、索引使用、数据备份和恢复等方面的知识。学习MySQL笔记可以帮助开发者更好地理解和应用MySQL数据库。 MySQL笔记主要可以分为以下几个方面来介绍和学习: 1. 数据库基础知识:学习数据库的基本概念和原理,了解关系型数据库的特点以及MySQL的特点。 2. 安装和配置:学习如何在不同操作系统上安装和配置MySQL数据库,包括设置用户名、密码和端口等。 3. SQL语句的使用:学习SQL语句的基本语法和常用命令,包括查询、插入、更新、删除等操作。 4. 数据表的设计和管理:学习如何设计和创建数据表,包括选择适当的数据类型、设置主键和外键等。 5. 索引的使用:学习如何创建和使用索引来提高查询效率和数据访问速度。 6. 数据备份和恢复:学习如何进行MySQL数据库的数据备份和恢复,包括全量备份和增量备份等。 通过学习MySQL笔记,开发者可以掌握MySQL数据库的基本操作和高级功能,提高数据管理和查询的效率。此外,还可以了解MySQL数据库的优化技巧和性能调优方法,提升数据库的性能和稳定性。 总之,通过CSDN上的MySQL笔记,开发者可以系统地学习和掌握MySQL数据库的相关知识,从而更好地应用于实际的项目开发中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值