MySQL基础2-增删改事务视图

3. DML(Data Manipulation Language)语言

3.1 插入(insert)语句

#插入语句
/*
语法:方式一:insert into 表名(列名,...)
values(值,...);
方式二:insert into 表名
set 列名=值,列名=值....;
*/

#方式一支持插入多行,方式二不支持
#方式一支持子查询,方式二不支持

3.2 修改(update)语句

#修改语句
#1.修改单表
/*
语法:update 表名   ①
set 列=新值,....    ③
where 条件;         ②
*/


#2.修改多表
/*
语法 :sql92
update 表1 别名,表2 别名
set 列=新值,....
where 连接条件
and 筛选条件;
sql99
update 表1 别名 
连接类型[inner|left|right] join 表2 别名
 on 连接条件
 set 列=新值,....
 where 条件;
*/

3.3 删除(delete)语句

#删除语句
/*1.方式一:
单表:
delete from 表名 where 筛选条件;
多表:
sql92:delete 表1的别名 from 表1 别名,表2 别名
where 连接条件 and 筛选记录;
sql99:delete 表1的别名,表2的别名
from 表1 别名
inner|left|right join 表2 别名 on 连接条件
where 筛选条件;
2.方式二:
truncate table 表名;
对比:truncate 不能加where条件,效率高一些
有自增长列,delete删除后,再插入从断点处开始,truncate从1开始
truncate没有返回值,delete有返回值
truncate删除不能回滚,delete可以回滚
*/

4. DDL(Data Definition Language)语言

4.1 库和表的管理

/*
库的管理:
创建、修改、删除
表的管理:
创建、修改、删除
创建:create
修改:alter
删除:drop
*/
#1.库的创建
#语法:create database 库名;
CREATE DATABASE IF NOT EXISTS bookstore;

#2.库的修改
#更改库的字符集
ALTER DATABASE bookstore CHARACTER SET gbk;

#3.库的删除
DROP DATABASE IF EXISTS bookstore;

#1.表的创建
/*
语法:create table 表名(
	列名 列的类型[(长度) 约束],
	....
);
*/
CREATE TABLE book(
	id INT,
	bName VARCHAR(20),
	price DOUBLE,
	authorId INT,
	publishDate DATETIME
);
CREATE TABLE IF NOT EXISTS author(
	id INT,
	au_name VARCHAR(20),
	nation VARCHAR(10)
);
DESC book;

#2.表的修改
/*
语法:alter table 表名 add|drop|modify|change colum 列名 列类型 约束;
*/
#修改列名
ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME;
#修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;
#添加列
ALTER TABLE author ADD COLUMN annual DOUBLE;
#删除列
ALTER TABLE author DROP COLUMN annual;
#修改表名
ALTER TABLE author RENAME TO book_author;

#3.表的删除
DROP TABLE IF EXISTS book_author;

#4.表的复制
INSERT INTO author VALUES
(1,'chunshu','Japan'),(2,'moyan','China'),(3,'fengtang','China'),(4,'jinyong','China');
SELECT * FROM author
#仅复制表结构
CREATE TABLE copy LIKE author;
#复制表的所有
CREATE TABLE copyright
SELECT * FROM author;
#复制部分数据
CREATE TABLE copyleft
SELECT id,au_name
FROM author
WHERE nation='China';
#仅复制某些字段结构
CREATE TABLE copycopy
SELECT id,au_name
FROM author 
WHERE 1=2;

4.2 常见数据类型介绍

/*
常见的数据类型
数值型:
	整形
	小数
		定点数DEC(M,D),DECIMAL(M,D)
		浮点数float,double
字符型:
	短文本:char,varchar
	长文本:text,blob(二进制)
日期型:
	
*/
#1.整型
/*
分类:
tinyint,smallint,mediumint,int/integer,bigint
1	2	3	    4		8
①不设置无符号还是有符号,默认有符号,unsigned设置有符号
②如果插入的数值超过范围,out of range异常,插入临界值
③如果不设置长度,有默认长度。设置的长度是显示的最大宽度,zerofill用0填充
*/
DROP TABLE tab_int;
CREATE TABLE tab_int(
	t1 INT,
	t2 INT UNSIGNED
);
DESC tab_int
INSERT INTO tab_int VALUES(-1234,-1234);
#2.小数
/*
分类:
float(M,D),double(M,D)
dec(M,D),decimal(M,D)
①M是总长度,D小数部位,超过范围,插入临界值
①M,D可以省略,decimal默认(10,0),float和double根据插入的数值决定
③定点型精确度较高
*/
DROP TABLE tab_float;
CREATE TABLE tab_float(
	f1 FLOAT(5,2),
	f2 DOUBLE(5,2),
	f3 DECIMAL(5,2)
);
INSERT INTO tab_float VALUES(1253.4,1235.4,1253.4);

#3.字符型
/*
短文本:char,varchar  binary,varbinary,enum,set
长文本:text,blob(较大的二进制)
char(M)默认1,varchar(M).M最大的字符数,char效率高,费空间。varchar效率低,省空间

*/

CREATE TABLE tab_char(
	c1 ENUM('a','b','c')
)
INSERT INTO tab_char VALUES('A');
CREATE TABLE tab_set(
	c1 SET('a','b','c','d')
)
INSERT INTO tab_set VALUES('a,b');
#4.日期型
/*
datetime,timestamp  date,time,year
datetime 8字节,1000-9999年,不受时区影响
timestamp 4字节,1970-2038年,受时区影响
*/
CREATE TABLE tab_date(
	t1 DATETIME,
	t2 TIMESTAMP
)
INSERT INTO tab_date VALUES(NOW(),NOW());
SHOW VARIABLES LIKE 'time_zone';
SET time_zone='+8:00';

4.3 常见约束

#常见约束
/*
为了保证表的可靠性,用于限制表中的数据
CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型,
	表级约束
	...
)
列级约束:外键约束没有效果
表级约束:除非空、默认约束,其他都支持
六大约束分类:
	1.NOT NULL:非空
	2.DEFAULT:默认
	3.PRIMARY KEY:主键,不能为空
	4.UNIQUE:唯一,可以为空
	5.CHECK:检查,mysql不支持
	6.FOREIGN KEY:外键
主键和唯一的对比:
   主键	唯一性,不能为空,一个表最多有1个,允许组合(不推荐)
   唯一	唯一性,可以为空,可以存在多个  ,允许组合(不推荐)
*/
#1.创建表时添加列级约束
CREATE TABLE stuinfo(
	id INT PRIMARY KEY,
	stuName VARCHAR(20) NOT NULL,
	gender CHAR(1) CHECK(gender='男' OR gender='女'),
	seat INT UNIQUE NOT NULL,
	age INT DEFAULT 18,
	majorId INT REFERENCES major(id)
);

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);

DESC stuinfo;
#查看表中所有的索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;


#2.添加表级约束
#[constraint 约束名] 约束类型(字段名)
DROP TABLE IF EXISTS stuinfo;

CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT,
		
	CONSTRAINT pk PRIMARY KEY(id),
	CONSTRAINT uq UNIQUE(seat),
	CONSTRAINT ck CHECK(gender='男' OR gender='女'),
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);

#2.修改表时添加约束
/*
alter table 表名 modify column 字段名 字段类型 新约束;
alter table 表名 add [constraint 约束名] 约束类型(字段名) [外键引用];
*/
#添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#添加主键
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#添加唯一
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
ALTER TABLE stuinfo ADD UNIQUE(seat);
#添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);


#3.修改表时删除约束
#删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#删除唯一
ALTER TABLE stuinfo DROP INDEX seat;

#标识列
/*
自增长列
1.创建表时设置标识列
2.修改表时设置标识列
特点:
   1.标识列不一定和主键搭配,但要求必须是一个key
   2.一个表最多一个表示列
   3.标识列额类型只能是数值型
   4.标识列可以设置步长
*/
#1、
CREATE TABLE tab_identity(
	id INT PRIMARY KEY AUTO_INCREMENT,
	nname VARCHAR(20)
);

SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment=3;

#2、
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
#删除标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT;

5. TCL(Transaction Control Language)语言

5.1 事务和事务处理

/*
事务;一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
存储引擎innodb支持事务,myisam、memory不支持事务
事务的ACID属性:
    1.原子性(Atomicity)一个事务不可再分割,要么都执行要么都不执行
    2.一致性(Consistency)一个事务执行会使数据从一个一致状态切换到另外一个一致状态
    3.隔离性(Isoltion)一个事务的执行不受其他事务的干扰
    4.持久性(Durability)一个事务一旦提交,永久的改变数据库的数据
事务的创建:
    1.隐式事务,没有明显的开始和结束的标记,比如insert、update、delete语句
    2.显式事务,具有明显开始和结束的标记,前提是必须设置自动提交为no
    start transaction;可选
    语句1增删改查;
    ......
    commit;提交事务
    rollback;回滚事务
多个事务访问数据库中相同的数据时,没有必要的隔离机制,就到导致各种并发问题:
    1.脏读(Dirty Reads),一个事务读取了其他事务还没有提交的数据
    2.不可重复读(Non-Repeatable Reads),一个事务多次读取,结果不一样
    3.幻读(Phantom Reads),读到其他事务“插入”的数据
数据库提供4种事务隔离级别
    1.READ UNCOMMITTED(读未提交数据)出现脏读、不可重复读、幻读
    2.READ COMMITED(读已提交数据)Oracle默认,避免脏读,出现不可重复读、幻读
    3.REPEATABLE READ(可重复读)mysql默认,避免脏读、不可重复读,出现幻读
    4.SERIALIZABLE(串行化),避免所有,性能低
*/
SHOW ENGINES;

SHOW VARIABLES LIKE 'autocommit';
SET autocommit=0;

CREATE TABLE account(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	balance DOUBLE
);
INSERT INTO account(username,balance)VALUES('zhang',1000),('zhao',1000);

START TRANSACTION;
UPDATE account SET balance =1000 WHERE id=1;
UPDATE account SET balance = 1000 WHERE id=2;
ROLLBACK;
COMMIT;
#savepoint的使用,搭配rollback使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=1;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=2;
ROLLBACK a;



#查询默认隔离级别
SELECT @@tx_isolation;
#设置隔离级别
SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL 级别;

#delete和truncate在事务使用时的区别
#truncate不支持回滚

6. 视图

#视图
/*
含义:虚拟表,和普通表一样使用
mysql5.1后出现新特性,是通过表动态生成的数据,只保存sql逻辑,不保存查询结果
视图和表的对比:
视图  create view   没有实际占用物理空间  一般不能增删改
表    create table  占用                  都可以
*/

CREATE VIEW v1
AS 
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.majorid=m.id;
SELECT * FROM v1;

#1.创建视图
/*
create view 视图名
as
查询语句;
*/
CREATE VIEW v1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id=d.department_id
JOIN jobs j ON j.job_id=e.job_id;

SELECT * FROM v1 WHERE last_name LIKE '%a%';

CREATE VIEW v2
AS 
SELECT AVG(salary)
FROM employees
GROUP BY department_id;
SELECT v2.`avg(salary)`,g.grade_level FROM v2
JOIN job_grades g
ON v2.`avg(salary)` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

#2.视图的修改
/*
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句;
*/

#3.删除视图
/*
语法:drop view 视图名,视图名...;
*/
DESC v2;
SHOW CREATE VIEW v2;
DROP VIEW v1;

#4.视图的更新
CREATE OR REPLACE VIEW myv1
AS 
SELECT last_name,email
FROM employees;
#插入
INSERT INTO myv1 VALUES('zhang','qqcom');

#修改
UPDATE myv1 SET last_name='lisi' WHERE last_name='zhang';

#删除
DELETE FROM myv1 WHERE last_name='lisi';
 

7. 变量

#变量
/*分类:
1.系统变量:
    全局变量
    会话变量
2.自定义变量:
    用户变量
    局部变量
*/
#1.系统变量,由系统提供,不是用户定义,属于服务器层面
#查看语法
SHOW SESSION|GLOBAL VARIABLES [LIKE '%char%'];
SELECT @@global.变量名;

#赋值
SET GLOBAL 变量名=;
SET @@global.变量名=;

#2.自定义变量,用户自定义的
#用户变量声明,初始化
SET @用户变量名=;
SET @用户变量名:=;
SELECT @用户变量名:=;

#赋值
SELECT 字段 INTO 变量名 FROM;

#使用
SELECT @用户变量名;


#局部变量声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT;

#赋值
SET 局部变量名=;
SET 局部变量名:=;
SELECT @局部变量名:=;
SELECT 字段 INTO 局部变量名 FROM;

#使用
SELECT 局部变量名;

/*
用户变量和局部变量的对比:
用户变量    作用域当前对话      会话中的任何地方      声明语法不同,加@     不用限定类型
局部变量        begin end中     begin end中第一句话            一般不加      需要
*/

SET @m=1;
SET @n=2;
SET @sum=@m+@n;
SELECT @sum;

DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 2;
DECLARE mn INT;
SET mn=m+n;
SELECT mn;

9. 存储过程和函数

/*
存储过程和函数,类似于java中的方法
存储过程:一组预先编译好的SQL语句的集合
语法:
1.创建
create procedure 存储过程名(参数列表)
begin
	存储过程体(一组合法的sql语句)
end
注意:
    1.参数列表包含三部分:参数模式 in、out、inout
			  参数名
			  参数类型
    2.如果存储过程体只有一句话,begin end可以省略,结尾用delimiter重新设置 delimiter 结束标记
2.调用
call 存储过程名(实参列表);
3.删除存储过程
drop procedure 存储过程名
4.查看存储过程的信息
show create procedure 存储过程名
*/
#空参列表
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
	INSERT INTO admin(username,`password`)
	VALUES ('aa','000'),('bb','111'),('cc','222');
END $
CALL myp1()$
#in模式的参数
CREATE PROCEDURE myp2(IN username VARCHAR(20),IN `password` VARCHAR(20))
BEGIN
	DECLARE result INT DEFAULT 0;
	SELECT COUNT(*) INTO result
	FROM admin
	WHERE admin.username=username AND admin.`password`=`password`;
	SELECT IF(result>0,'s','f');
END $
CALL myp2('zhang','111')$
#out模式的存储过程
CREATE PROCEDURE myp3(IN bName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
	SELECT bo.boyName INTO boyName
	FROM boys bo
	INNER JOIN beauty b ON bo.id=b.boyfriend_id
	WHERE b.name=beautyName;;
	
END $
SET @bName $
CALL myp3('zhang',@bName);
SELECT @bName$

#inout模式
CREATE PROCEDURE myp4(INOUT a INT,INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END$
SET @m=10$
SET @n=20$
CALL myp4(@m,@n)$
SELECT @m,@n$
#函数
/*
存储过程:可以有0个返回,也可以有多个返回。适合左批量出入、更新
函数:只能有1个返回。适合处理数据后返回一个结果
1.创建语法
CREATE FUNCTION	函数名(参数名 参数类型) RETURNS 返回类型
BEGIN
	函数体:肯定有return语句
END
使用delimiter语句设置结束标记
2.调用语法
select 函数名(参数列表)
3.查看函数
show create function 函数名;
4.删除函数
drop function myf2
*/
#无参有返回
CREATE FUNCTION myf1() RETURNS INT
BEGIN
	DECLARE c INT DEFAULT 0;
	SELECT COUNT(*) INTO c
	FROM employees;
	RETURN c;
END $
SELECT myf1() $

#有参有返回
CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	SET @sal=0;
	SELECT salary INTO @sal
	FROM employees
	WHERE last_name=empName;
	RETURN @sal;
END $ 
 SELECT myf2('kochhar') $

9. 流程控制结构

#流程控制结构
/*
1.顺序结构
2.分支结构
3.循环结构
*/
#2.分支结构
#if函数,实现简单的双分支
IF(表达式1,表达式2,表达式3)
#case结构,可以作为表达式,嵌套在其他语句中使用;也可以作为独立的语句去使用
CASE 变量|表达式|字段
WHEN 判断值 THEN 返回值1或语句;
WHEN 判断值 THEN 返回值2或语句;
....
ELSE 要返回的值n;
END [CASE];

CASE 
WHEN 判断条件1 THEN 返回值1或语句;
WHEN 判断值条件2 THEN 返回值2或语句;
....
ELSE 要返回的值n或语句N;
END [CASE];

CREATE PROCEDURE test_case(IN score INT)
BEGIN
	CASE 
	WHEN score>=90 AND score<=100 THEN SELECT 'A';
	WHEN score>=80 THEN SELECT 'B';
	WHEN score>=60 THEN SELECT 'C';
	ELSE SELECT 'D';
	END CASE;
END $
CALL test_case(95) $

#if结构,实现多重分支,应用在begin end中
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
...
[ELSE 语句n;]
END IF;

CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
	IF score>=90 AND score<=100 THEN RETURN 'A';
	ELSEIF score>=80 THEN RETURN 'B';
	ELSEIF score>=60 THEN RETURN 'C';
	ELSE RETURN 'D';
	END IF;
END $

SELECT test_if(86) $

#3.循环结构
/*
分类:while、loop、repeat
循环控制:iterate类似于continue,leave类似于break
*/
#while
[标签:]WHILE 循环条件 DO
	循环体;
END WHILE [标签;]
#loop,可以用来模拟简单的死循环
[标签:]LOOP 
	循环体;
END LOOP[标签];
#repeat
[标签:]REPEAT
	循环体;
UNTIL 结构循环的条件
END REPEAT[标签;]

#根据次数批量插入
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`)
		VALUES (CONCAT('rose',i),'666');
		IF i>=20 THEN LEAVE a;
		END IF;
		SET i=i+1;
	END WHILE a;
END $
CALL pro_while1(100) $
#向表中插入指定个数的随机字符串
CREATE PROCEDURE test_randstr_insert(IN insetCount INT)
BEGIN 
	DECLARE i INT DEFAULT 1;#定义一个循环变量i,表示插入次数
	DECLARE str VARCHAR(26) DEFAULT 'qwertyuiopasdfghjklmnvbcxz';
	DECLARE startIndex INT DEFAULT 1;
	DECLARE len INT DEFAULT 1;
	WHILE i<=insetCount DO 
		
		SET len=FLOOR(RAND()*(20-startIndex+1)+1);
		SET startIndex=FLOOR(RAND()*26+1);
		INSERT INTO `stringcontent`(content) VALUES (SUBSTR(str,startIndex,len));
		SET i=i+1;
	END WHILE;
END $
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值