MySQL学习笔记2
Posted 冷雨落
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习笔记2相关的知识,希望对你有一定的参考价值。
表的相关操作
1 ALTER TABLE 表名 ADD 字段名 数据类型 约束 属性(字段) ; 1添加字段
2 ALTER TABLE 表名 DROP 字段名 ; 2 删除字段
3 ALTER TABLE 表名 MODIFY 字段名 数据类型 字符集; 3修改字段
4 ALTER TABLE 旧表名 RENAME TO 新表名 ; 4 更改表名
5 ALTER TABLE CHANGE 旧字段名 新字段名 数据类型 ; 5 更改字段名
6 SHOW VARIABLES LIKE “%char%” ; 6查看当前数据库
7 ALTER DATABASE 库名 CHARSET 字符集 7更改库的字符集
8 ALTER DATABASES 库名 engin=引擎 8更改引擎
9 SHOW CREATE TABLE 表名 ; 9查看字段
10 ALTER TABLE 表名 CHARSET 字符集 ; 10 更改表的字符集11mysql> DELETE FROM loaddata; #删除表的所有内容
外键
设置外键准备工作
1,查看主表的连接 字段、数据类型、字段字符集、表的字符集、存储引擎(设置外键字段)
2.建立从表或者查看从表字段、数据类型、字段字符集、表的字符集、存储引擎 与主表一致
3,添加外键
ALTER TABLE laborclub ADD CONSTRAINT fk_laboclou_teacher FOREIGN KEY (tno) REFERENCES reacher(tn)
库的导入
source f:\\MySQL\\mysqldump\\books.sql
库的导出
C:\\Users\\小赖>d:
D:>cd D:\\Wampserver\\wamp\\BIN\\mysql\\mysql5.6.12\\BIN
D:\\Wampserver\\wamp\\BIN\\mysql\\mysql5.6.12\\BIN>mysqldump -u root -p software2 books>“f:/MySQL/mysqldump/books.sql”
Enter PASSWORD:
D:\\Wampserver\\wamp\\BIN\\mysql\\mysql5.6.12\\BIN>
-A dao
表的导出
mysql> SELECT * FROM student INTO OUTFILE “f:/MySQL/outfile/student10.txt”
-> CHARSET utf8
-> FIELDS
-> TERMINATED BY “\\t” #制表符
-> LINES
-> TERMINATED BY “\\r\\t”; # 换行符
表的导入
LOAD DATA INFILE ‘F:/MySQL/infile/test.txt’ INTO TABLE loaddata
CHARSET utf8
FIELDS
TERMINATED BY “\\t” # 制表符一定要写上
IGNORE 1 LINES;
transaction事物
1 START TRANSACTION 1开启事物
2 ROLLBACK 2回滚事物
3 COMMIT 3 提交事物
view视图
1 CREATE VIEW view_degree; 1创建视图
2 SELECT * FROM view_degree; 2.调用视图
3 DROP VIEW view_degree; 3删除视图
4 SELECT * FROM information_schema.VIEWS
; $ 查看所有视图
#例1:创建成绩>90的视图 view_degree,再在该视图中查询>95的成绩信息(sc)
CREATE VIEW view_degree
AS
SELECT * FROM sc WHERE degree>95;
#例2创建一个选修了”大学英语”的学生的学号,名字,系别,成绩的视图,视图名为view_English;
CREATE VIEW view_english
AS
SELECT student.sno,sname,sdept,degree FROM student,sc,course WHERE student.sno
=sc.sno
AND
sc.cno=course.cno
AND cname=“大学英语”;
SELECT * FROM stuent; #(视图设计到多表连接)
SELECT * FROM sc;
SELECT * FROM course;
#例3创建视图
CREATE VIEW view_grils
AS
SELECT * FROM student;
# 插入记录
INSERT INTO view_grils
(sno,sname,ssex)
VALUES
(‘2020200111’,‘李媛媛’,‘女’);
procedure存储过程
1 creae PROCEDURE proce_sno(ssno VARCHAR(10) CHARSET gbk)
2 DROP PROCEDURE proce_sno; 2删除存储过程
3 CALL proce_sno(“2007010104”) 3调用存储函数
4 SHOW CREATE PROCEDURE proce_sno; 4查看存储过程
5 SHOW PROCEDURE STATUS; 查看数据库所有的存储函数
#例1储存函数
#conat用法,创建一个存储过程根据输入的学号,读出该学生的所有选修课的平均分,如果
平均分不小于90分,显示:恭喜您“”名字,您的平均成绩为:如果平均分小90分显示很遗憾
“名字”,您的平均成绩为:“平均分”
DELIMITER //
CREATE PROCEDURE proce_sno(ssno VARCHAR(10) CHARSET gbk)
BEGIN
DECLARE avg_degree FLOAT;
DECLARE NAME VARCHAR(10) CHARSET gbk;
SELECT AVG(degree) INTO avg_degree FROM sc WHERE sno=ssno;
SELECT sname INTO NAME FROM student WHERE sno=ssno;
IF avg_degree>90 THEN
SELECT CONCAT(“恭喜你”,NAME,“您的平均成绩为:”,avg_degree) AS 成绩;
ELSE
SELECT CONCAT(“很遗憾”,NAME,“您的平均成绩为:”,avg_degree)AS 成绩;
END IF;
END //
function存储函数
1 CREATE FUNCTION func_lass(sno INT(10)) 创建存储函数
2 DROP FUNCTION func_class; 删除存储函数
3 SHOW CREATE FUNCTION func_class; 查看存储函数
#列2创建存储函数,根据输入学生的学号,返回该省的班级编号 #存储函数一定有返回值
DELIMITER //
CREATE FUNCTION func_saddress(ssno INT(10))
RETURNS VARCHAR(8) CHARSET utf8
READS SQL DATA
BEGIN
DECLARE dress VARCHAR(50) CHARSET utf8;
SELECT saddress INTO dress FROM student WHERE sno=ssno;
RETURN dress ;
END //
DELIMITER ;
#列二创建存储函数,求1到n的和
DELIMITER //
CREATE FUNCTION func_qiuhe(num INT)
RETURNS INT(10)
READS SQL DATA
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE j INT DEFAULT 0;
WHILE i<num DO
SET j=j+i;
SET i=i+1;
END WHILE;
RETURN j;
END //
trigger触发器
1,SHOW TRIGGERS; 查看所有的触发器
2,DROP TRIGGER trg_update ; 删除触发器
#1建表
create table trade(
商品编号 int(10) primary key,
商品名称 varchar(10),
库存数量 int(10))charset utf8;
#2插入数据
insert into trade
values
(1,“小白兔”,5),
(2,“糖宝”,20),
(3,“小黄人”,100),
(4,“小胡巴”,30),
(5,“小娜扎”,60),
(6,“葫芦娃”,50),
(7,“皮卡丘”,200);
#3订单表indent
create table indent(
订单编号 int primary key auto_increment,
商品编号 int(10),
订单数量 int(10))charset utf8;
#4创建触发器
问题1:订单表(indent)中现有购买2号商品记录,购买了8件,
购买后,对trade表有什么影响?
#5插入数据触发器 问题1:订单表(indent)中现有购买2号商品记录,购买了8件,
delimiter //
create trigger trg_insert
after insert on indent
for each row
begin
update trade set 库存数量=库存数量-new.订单数量 where 商品编号=new.商品编号;
end //
delimiter ;
#6删除触发器 问题2 买家由于特殊原因要取消订单1,对trade表有什么影响?
delimiter //
create trigger trg_delete
after delete on indent
for each row
begin
update trade set 库存数量=库存数量+old.订单数量 where 商品编号=old.商品编号;
end //
delimiter ;
#7更改触发器 问题3 本来购买2号商品8件,但现在要增加到10件,对trade表有什么影响?
delimiter //
create trigger trg_update
after update on indent
for each row
begin
update trade set 库存数量=库存数量+old.订单数量-new.订单数量 where 商品编号=new.商品编号;
end //
delimiter ;
#更改触发器 问题3 原先订单数量购买7号商品100件,现在改为购买5号商品10件,触发器创建
#9插入记录
insert into indent
(商品编号,订单数量)
values
(2,8);
#10更改记录
update indent
set 商品编号=3,订单数量=50;
#11触发器before 分两步走 1.前 后
DELIMITER //
CREATE TRIGGER trg_4
BEFORE INSERT ON indent
FOR EACH ROW
BEGIN
SELECT 库存数量 INTO @num FROM trade WHERE 商品编号=new.商品编号; #1查看库存量
IF new.订单数量>@num THEN
SET new.订单数量=@num; # 2更改插入数据
END IF;
UPDATE trade SET 库存数量=库存数量-new.订单数量 # 3进跟新
WHERE 商品编号=new.商品编号;
END //
DELIMITER ;
#12题目1:
现有数据表trade和indent表(上课测试用的两张表),现在该商店限购,每件购买数量不
能超过20件,又考虑到实际的需求,购买数量也不能超过库存。请根据题目要求,创建一个触发器,
使得购买数量既不超过限购数量又不超过库存数量;
delimiter //
create trigger trg_insert
before insert on indent
for each row
begin
declare num int(4);
SELECT 库存数量 INTO num FROM trade WHERE 商品编号=new.商品编号;
IF num>20 THEN
if new.订单数量>20 then
set new.订单数量=20;
end if;
else
if new.订单数量>num then
set new.订单数量=num;
end if;
end if ;
update trade set 库存数量=库存数量-new.订单数量 where 商品编号=new.商品编号;
end //
delimiter ;
#13题目2
现有一个记录商品信息的商品表tb_dity,该表包含的字段有商品号(cno)、商品名(cname)、商品类型(ctype)、
产地(origin)、生产日期(birth)、价格(price)。
1.请创建一个名为tri_price的触发器,再插入新的商品记录时,能够根据商品的品名和产地自动设置商品的价格,
具体规则如下:若商品为上海的电视机,则价格设置为2800,其他商品价格的设置可为缺省。
DELIMITER $$
CREATE TRIGGER tri_price
BEFORE INSERT ON tb_dity
FOR EACH ROW
BEGIN
IF new.cname=“电视机” AND new.origin=“上海” THEN
SET new.price=2800;
END IF;
END $$
DELIMITER ;
#题目3
现有两个数据表职工表tb_employee和部门表tb_dept.
1.表的备份文件分别为tb_employee.sql和tb_dept.sql(在给你的文件夹当中),请将备份文件还原到数据库中.
Source 路径
2.设计一个名为tr_empt的触发器,完成的功能为:当删除部门表中某个部门的记录时,将职工表中该部门信息置空。
DELIMITER //
CREATE TRIGGER tr_empt
AFTER DELETE ON tb_dept
FOR EACH ROW
BEGIN
UPDATE tb_employee SET deptno=""
WHERE deptno=old.deptno;
END //
DELIMITER ;
3.测试该触发器的效果。
event事件===
#创建事件1
例1:创建一个事件lsj_ent,将员工表student的数据备份
到f:\\MySQL\\student.txt文件夹下;
delimiter //
create event lsj_event
on schedule every 1 minute
do
begin
select * from student into outfile “f:/MySQL/student.txt”
charset utf8
fields
terminated by “;”;
end //
DELIMITER //
例2:创建一个事件lsj_event2,2分钟后将员工表course的数据备份
到f:\\MySQL\\course.txt文件夹下;
#创建事件2
delimiter //
create event lsj_event2
on schedule at current_timestamp+interval 1 minute
on completion preserve
do
begin
select * from course into outfile “F:/MySQL/course.txt”
charset utf8;
end //
delimiter ;
1.事件创建 CREATE EVENT 事件名
2.select @@event_scheduler; 查看事件总开关
3.set global event_scheduler=1; 开启事件总开关
4.show events ; 查看事件
5.drop event lsj_event; 删除事件
6.alter event lsj_event disable; 停用事件
7.on completion preserve ; 事件处理后不会删除表
=index索引================
#创建创表索引1
create table lsj_index(
sno varchar(10) PRIMARY KEY comment “学号”,
nam varchar(10) comment “名字”,
age int(4),event_name``event_name1
INDEX lsj_index(sno(10)))CHARSET utf8;
#创建创表后索引2
alter table sshome add index lsj_index2(Id(18));
1.show index from sshome; 1.查看索引
2.alter table sshome drop index lsj_index2; 2删除索引
3.alter table sshome drop primary key; 3删除主键
以上是关于MySQL学习笔记2的主要内容,如果未能解决你的问题,请参考以下文章