1 索引
2 触发器
3 存储过程和函数
4 视图
5 基本的数据库建表语句练习
1 索引
(1)基本概念
https://blog.csdn.net/buhuikanjian/article/details/52966039
(2)建立索引的原则
https://www.cnblogs.com/aspwebchh/p/6652855.html
(3)具体操作语句
步骤1 创建表test_table1,添加三个索引
CREATE TABLE test_table1(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
NAME CHAR(100) NOT NULL,
address CHAR(100) NOT NULL,
description CHAR(100) NOT NULL,
UNIQUE INDEX UniqIdx(id),
INDEX MultiColIdx(NAME(20), address(30)),
INDEX ComIdx(description(30))
);
步骤2 创建表test_table1,添加三个索引创建表test_table2,存储引擎为MyISAM
CREATE TABLE test_table2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
firstname CHAR(100) NOT NULL,
middlename CHAR(100) NOT NULL,
lastname CHAR(100) NOT NULL,
birth DATE NOT NULL,
title CHAR(100) NULL
) ENGINE=MYISAM;
步骤3 创建表test_table1,添加三个索引使用ALTER TABLE语句在表test_table2的birth字段上,建立名称为ComDateIdx的普通索引
ALTER TABLE test_table2 ADD INDEX ComDateIdx(birth);
步骤4 创建表test_table1,添加三个索引使用ALTER TABLE语句在表test_table2的id字段上,添加名称为UniqIdx2的唯一索引,并以降序排列
ALTER TABLE test_table2 ADD UNIQUE INDEX UniqIdx2 (id DESC);
步骤5 创建表test_table1,添加三个索引使用CREATE INDEX在firstname、middlename和lastname3个字段上建立名称为MultiColIdx2的组合索引
CREATE INDEX MultiColIdx2 ON test_table2(firstname, middlename, lastname);
步骤6 创建表test_table1,添加三个索引使用CREATE INDEX在title字段上建立名称为FTIdx的全文索引
CREATE FULLTEXT INDEX FTIdx ON test_table2(title);
步骤7 创建表test_table1,添加三个索引使用ALTER TABLE语句删除表test_table1中名称为UniqIdx的唯一索引
ALTER TABLE test_table1 DROP INDEX UniqIdx;
步骤8 创建表test_table1,添加三个索引使用DROP INDEX语句删除表test_table2中名称为MultiColIdx2的组合索引
DROP INDEX MultiColIdx2 ON test_table2;
2 触发器
image.pngimage.png
(2)触发器使用
https://www.cnblogs.com/yank/p/4193820.html
3 存储过程和函数
(1)存储过程优缺点
https://blog.csdn.net/jackmacro/article/details/5688687
(2)存储过程、函数、游标
https://www.cnblogs.com/doudouxiaoye/p/5811836.html
https://www.cnblogs.com/jacketlin/p/7874009.html
(3)代码详解
1 创建查看fruits表的存储过程,创建了一个查看fruits表的存储过程,每次调用这个存储过程的时候都会执行SELECT语句查看表的内容。
CREATE PROCEDURE Proc()
BEGIN
SELECT * FROM fruits;
END ;
2 创建名称为CountProc的存储过程,获取fruits表记录条数。COUNT(*) 计算后把结果放入参数param1中。
当使用DELIMITER命令时,应该避免使用反斜杠(’\’)字符,因为反斜线是MySQL的转义字符。
CREATE PROCEDURE CountProc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM fruits;
END;
3 创建存储函数NameByZip,该函数返回SELECT语句的查询结果,数值类型为字符串型。
CREATE FUNCTION NameByZip ()
RETURNS CHAR(50)
RETURN (SELECT s_name FROM suppliers WHERE s_call= '48075');
4 定义名称为myparam的变量,类型为INT类型,默认值为100。
DECLARE myparam INT DEFAULT 100;
5 声明3个变量,分别为var1、var2和var3,数据类型为INT,使用SET为变量赋值。
DECLARE var1, var2, var3 INT;
SET var1 = 10, var2 = 20;
SET var3 = var1 + var2;
MySQL中还可以通过SELECT ... INTO为一个或多个变量赋值,语法如下:
SELECT col_name[,...] INTO var_name[,...] table_expr;
这个SELECT语法把选定的列直接存储到对应位置的变量。col_name表示字段名称;var_name表示定义的变量名称;table_expr表示查询条件表达式,包括表名称和WHERE子句。
6 声明变量fruitname和fruitprice,通过SELECT,INTO语句查询指定记录并为变量赋值。
DECLARE fruitname CHAR(50);
DECLARE fruitprice DECIMAL(8,2);
SELECT f_name,f_price INTO fruitname, fruitprice
FROM fruits WHERE f_id ='a1';
7 声明名称为cursor_fruit的光标
DECLARE cursor_fruit CURSOR FOR SELECT f_name, f_price FROM fruits ;
8 使用名称为cursor_fruit的光标。将查询出来的数据存入fruit_name和fruit_price这两个变量中。
FETCH cursor_fruit INTO fruit_name, fruit_price ;
9 IF语句的示例
IF val IS NULL
THEN SELECT 'val is NULL';
ELSE SELECT 'val is not NULL';
END IF;
10 使用CASE流程控制语句的第1种格式,判断val值等于1、等于2,或者两者都不等。
CASE val
WHEN 1 THEN SELECT 'val is 1';
WHEN 2 THEN SELECT 'val is 2';
ELSE SELECT 'val is not 1 or 2';
END CASE;
11 使用LOOP语句进行循环操作,id值小于等于10之前,将重复执行循环过程。
DECLARE id INT DEFAULT 0;
add_loop: LOOP
SET id = id + 1;
IF id >= 10 THEN LEAVE add_loop;
END IF;
END LOOP add_ loop;
12 使用LEAVE语句退出循环。循环执行count加1的操作。当count的值等于50时,使用LEAVE语句跳出循环。
add_num: LOOP
SET @count=@count+1;
IF @count=50 THEN LEAVE add_num ;
END LOOP add_num ;
13 ITERATE语句示例。
CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
my_loop: LOOP
SET p1= p1 + 1;
IF p1 < 10 THEN ITERATE my_loop;
ELSEIF p1 > 20 THEN LEAVE my_loop;
END IF;
SELECT 'p1 is between 10 and 20';
END LOOP my_loop;
END
14 REPEAT语句示例,id值小于等于10之前,将重复执行循环过程。
该示例循环执行id加1的操作。当id值小于10时,循环重复执行;当id值大于或者等于10时,使用LEAVE语句退出循环。REPEAT循环都以END REPEAT结束。
DECLARE id INT DEFAULT 0;
REPEAT
SET id = id + 1;
UNTIL id >= 10
END REPEAT;
15 WHILE语句示例,id值小于等于10之前,将重复执行循环过程。
DECLARE i INT DEFAULT 0;
WHILE i < 10 DO
SET i = i + 1;
END WHILE;
16 定义名为CountProc1的存储过程,然后调用这个存储过程。
CREATE PROCEDURE CountProc1 (IN sid INT, OUT num INT)
BEGIN
SELECT COUNT(*) INTO num FROM fruits WHERE s_id = sid;
END //
4 视图
(1)视图的含义和作用
视图是数据库中的一个虚拟表。同真实的表一样,视图包含一系列的行和列数据。行和列数据来源于自由定义视图查询所引用的表,并且在引用视图是动态生成。
(2)视图和表的联系、区别
image.png(3)视图基本操作
步骤1:创建学生表stu,插入3条记录。
CREATE TABLE stu
(
s_id INT PRIMARY KEY,
s_name VARCHAR(20),
addr VARCHAR(50),
tel VARCHAR(50)
);
INSERT INTO stu
VALUES(1,'XiaoWang','Henan','0371-12345678'),
(2,'XiaoLi','Hebei','13889072345'),
(3,'XiaoTian','Henan','0371-12345670');
步骤2:创建报名表sign,插入3条记录。
CREATE TABLE sign
(
s_id INT PRIMARY KEY,
s_name VARCHAR(20),
s_sch VARCHAR(50),
s_sign_sch VARCHAR(50)
);
INSERT INTO sign
VALUES(1,'XiaoWang','Middle School1','Peking University'),
(2,'XiaoLi','Middle School2','Tsinghua University'),
(3,'XiaoTian','Middle School3','Tsinghua University');
步骤3:创建成绩表stu_mark,插入3条记录。
CREATE TABLE stu_mark (s_id INT PRIMARY KEY ,s_name VARCHAR(20) ,mark int );
INSERT INTO stu_mark VALUES(1,'XiaoWang',80),(2,'XiaoLi',71),(3,'XiaoTian',70);
步骤4:创建考上Peking University的学生的视图
CREATE VIEW beida (id,name,mark,sch)
AS SELECT stu_mark.s_id,stu_mark.s_name,stu_mark.mark, sign.s_sign_sch
FROM stu_mark ,sign
WHERE stu_mark.s_id=sign.s_id AND stu_mark.mark>=41
AND sign.s_sign_sch='Peking University';
步骤5:创建考上qinghua University的学生的视图
CREATE VIEW qinghua (id,name,mark,sch)
AS SELECT stu_mark.s_id, stu_mark.s_name, stu_mark.mark, sign.s_sign_sch
FROM stu_mark ,sign
WHERE stu_mark.s_id=sign.s_id AND stu_mark.mark>=40
AND sign.s_sign_sch='Tsinghua University';
步骤6:XiaoTian的成绩在录入的时候录入错误多录了50分,对其录入成绩进行更正。
UPDATE stu_mark SET mark = mark-50 WHERE stu_mark.s_name ='XiaoTian';
步骤7:查看更新过后视图和表的情况。
SELECT * FROM stu_mark;
SELECT * FROM qinghua;
SELECT * FROM beida;
步骤8:查看视图的创建信息。
SELECT * FROM information_schema.views
步骤9:删除创建的视图。
DROP VIEW beida;
DROP VIEW qinghua;
5 基本的数据库建表语句练习(这个好像我真的是不会......)
建立一个数据库,逻辑名称为Student,包含1个数据文件和1个日志文件。数据文件初始大小为10M
if exists(select * from sys.sysdatabases where name='Student')
begin
use master
drop database Student
end
go
create database Student
on
--路径根据实际情况自行修改
(name=N'Student',filename=N'E:\Student.mdf',size=10mb,maxsize=unlimited,filegrowth=1)
log on
(name=N'Student',filename=N'E:\Student_log.ldf',size=10mb,maxsize=unlimited,filegrowth=1)
https://www.cnblogs.com/accumulater/p/6158294.html
创建表,增加约束。包括:主键约束、非空约束、性别范围约束、出生日期约束、年龄约束、外键约束、唯一性约束、评论约束、默认关键词约束
下面的语句可能不通顺,但是这些约束都有。check也可以使用enum代替。
CREATE TABLE tblstudent(
stuID BIGINT PRIMARY KEY NOT NULL,
stuName NVARCHAR(10) NOT NULL,
stuSex NCHAR(1) NOT NULL DEFAULT '男' CHECK (stuSex IN ('男','女')),
stuBirth DATETIME CHECK (stuBirth < getdate()) COMMENT '出生日期',
stuNum NVARCHAR(18) UNIQUE
Math INT CHECK(Sage > 18 AND Sage < 30) COMMENT '数学'
stuID BIGINT REFERENCES tblstudent(stuID)
)
https://www.cnblogs.com/ghost-xyx/p/3795679.html
drop,alter,insert,update,delete
https://blog.csdn.net/leftwukaixing/article/details/44415875
这个东西属于基础知识,可能不需要深入了解,但是不知道一定会有问题。
END
网友评论