数据库系列(二) 数据的增、删、改、查

课堂练习

需求:

           向学生表中插入5行数据,用以模拟完成学生注册时向数据库中写入的数据

           每个学生向项目库中提交两个项目(一个立项,一个未立项)

分析:

           首先建立学生表(student),包含字段id(主键)、name;

           然后建立项目表(project),包含项目号(pid)、项目名(pname)、项目简介(pdesc)、提交人(tijiaoren);

           这两个表之间存在一对多的关系,一个同学可负责多个项目,学生id与提交人对应,存在外键关系

一、创建学生表、项目表,并添加外键关系

-- 创建学生表
CREATE TABLE student(id INT PRIMARY KEY COMMENT '主键',
NAME VARCHAR(10) NOT NULL COMMENT '姓名'
)

-- 创建项目表
CREATE TABLE project(pid INT PRIMARY KEY COMMENT '项目id主键',
pname VARCHAR(20) NOT NULL COMMENT '项目名称',
pdesc VARCHAR(100) NULL,
tijiaoren INT )

-- 添加表之间的关系
ALTER TABLE project ADD FOREIGN KEY fk_project_student(tijiaoren) REFERENCES student(id)

二、向学生表、项目表中插入数据

--向学生表中插入数据
INSERT INTO student(id,NAME) VALUES(1,'学生1');
INSERT INTO student(id,NAME) VALUES(2,'学生2');
INSERT INTO student(id,NAME) VALUES(3,'学生3');
INSERT INTO student(id,NAME) VALUES(4,'学生4');
INSERT INTO student(id,NAME) VALUES(5,'学生5');

--向项目表中插入数据
INSERT INTO project(pid,pname,tijiaoren) VALUES(1,'项目11',1);
INSERT INTO project(pid,pname,tijiaoren) VALUES(2,'项目12',1);
INSERT INTO project(pid,pname,tijiaoren) VALUES(3,'项目21',2);
INSERT INTO project(pid,pname,tijiaoren) VALUES(4,'项目22',2);
INSERT INTO project(pid,pname,tijiaoren) VALUES(5,'项目31',3);
INSERT INTO project(pid,pname,tijiaoren) VALUES(6,'项目32',3);
INSERT INTO project(pid,pname,tijiaoren) VALUES(7,'项目41',4);
INSERT INTO project(pid,pname,tijiaoren) VALUES(8,'项目42',4);
INSERT INTO project(pid,pname,tijiaoren) VALUES(9,'项目51',5);
INSERT INTO project(pid,pname,tijiaoren) VALUES(10,'项目52',5);

--设置默认值
ALTER TABLE project ADD COLUMN lixiang VARCHAR(10) DEFAULT '否'

-- 一次插入多个值
INSERT INTO project(pid,pname,tijiaoren) VALUES(12,'项目53',5),(13,'项目55',5);
SHOW TABLES

 插入操作:包含自增长类型(不建议使用),id必须由大到小

三、查询操作示例

SELECT 1+2 FROM DUAL

-- 查询项目表中的所有字段
SELECT pname,pid,tijiaoren,lixiang FROM project
-- 使用通配符*代表表中的所有字段
SELECT * FROM project
-- 查询学生3 提交的项目
SELECT pname,pid,tijiaoren,lixiang FROM project 
WHERE tijiaoren=3

-- 统计一下每个学生提交了几个项目
SELECT tijiaoren,COUNT(*) FROM project
GROUP BY tijiaoren 

-- 找出项目提交数量不足3个的学生id

SELECT tijiaoren,COUNT(*) FROM project
GROUP BY tijiaoren 
HAVING COUNT(*)<3

-- 按照学生编号从大到小的顺序显示其提交的项目
SELECT * FROM project 
ORDER BY tijiaoren DESC

-- 按照学生编号从小到大的顺序显示项目,一次最多显示3行
SELECT * FROM project
ORDER BY tijiaoren ASC LIMIT 3

-- 内连接
SELECT * FROM project , student WHERE project.tijiaoren=student.id;
SELECT * FROM project INNER JOIN student ON project.tijiaoren=student.id

SELECT t.id AS tid,t.name AS tname,student.id AS sid,student.name AS sname FROM t INNER JOIN student ON t.id=student.id

-- 表的别名
SELECT * FROM project a,student b WHERE a.tijiaoren=b.id;

CREATE TABLE tba(a1 INT,a2 INT)
CREATE TABLE tbb(b1 INT,b2 INT)

INSERT INTO tba(a1,a2) VALUES(1,2),(3,4)
INSERT INTO tbb(b1,b2) VALUES(1,5),(8,10)
-- 笛卡尔积
SELECT * FROM tba,tbb
-- 内连接
SELECT * FROM tba INNER JOIN tbb ON tba.a1=tbb.b1;
-- 左外连接
SELECT * FROM tba LEFT JOIN tbb ON tba.a1=tbb.b1
-- 右外连接
SELECT * FROM tba RIGHT JOIN tbb ON tba.a1=tbb.b1
-- 全外连接
SELECT * FROM tba LEFT JOIN tbb ON tba.a1=tbb.b1
UNION
SELECT * FROM tba RIGHT JOIN tbb ON tba.a1=tbb.b1

--  根据学生名字查询该学生提交的项目
SELECT * FROM project , student WHERE project.tijiaoren=student.id AND student.name LIKE '%3%';
-- 使用子查询
SELECT * FROM project WHERE tijiaoren IN (SELECT id FROM student WHERE NAME LIKE '%3%');
-- 子查询作为操作数
SELECT (SELECT id FROM student WHERE id=1) FROM DUAL
-- 子查询作为条件
SELECT * FROM project WHERE tijiaoren>(SELECT 2 FROM DUAL)

SELECT * FROM project WHERE tijiaoren> ANY (SELECT id FROM student WHERE id>3)
SELECT * FROM project WHERE tijiaoren> ALL (SELECT id FROM student WHERE id>3)
-- 多列比较
SELECT (3,2)<(3,4) FROM DUAL

-- exists 和not exists
--  根据学生名字查询该学生提交的项目
SELECT * FROM project WHERE EXISTS ( SELECT id FROM student WHERE id=project.tijiaoren AND NAME LIKE '%3%')

-- 子查询作为数据表使用
SELECT * FROM (SELECT * FROM project , student WHERE project.tijiaoren=student.id)  a WHERE a.name LIKE '%3%'


SELECT * FROM project

四.修改操作

-- 修改数据
-- 将所有偶数项目id的状态变更为是
UPDATE project SET lixiang='是' WHERE MOD(pid,2)=0

-- 将项目序号5以内的项目介绍更新为项目名称+项目id
SELECT CONCAT(pname,CAST(pid AS CHAR)) FROM project
UPDATE project SET pdesc= CONCAT(pname,CAST(pid AS CHAR)) WHERE pid<5
SELECT * FROM project
-- update可以更新多列
UPDATE project SET pdesc='123',pname=CONCAT(pname,'123') WHERE pid BETWEEN 5 AND 8

五.删除操作

-- 删除表中项目id大于11的数据
DELETE FROM project WHERE pid>11

-- 删除或更新时的约束
UPDATE project tijiaoren=6 WHERE pid=11

DELETE FROM student WHERE id=5

DELETE FROM project WHERE tijiaoren=5
DELETE FROM student WHERE id=5

SELECT * FROM student

SELECT MOD(3,2),MOD(4,2) FROM DUAL

六.触发器

    触发器是指当表中的数据变化时由数据库管理系统自动调用执行的一段sql命令代码

    创建触发器--->  Create trigger <触发器名> <触发时机><触发事件>on <表名> for each row <触发器执行语句>
    删除触发器--->   Drop trigger <触发器名>

    触发时机          Before                after
    触发事件          Insert                 Update                        Delete
    触发器中对象                             New:插入或修改时该对象保存每行新的数据
                                                       Old:插入或修改时该行保存更新前的数据

   触发器的运用:

--创建基础表
CREATE TABLE dingdan(dingdanid INT PRIMARY KEY,zhuangtai VARCHAR(20));
CREATE TABLE mingxi(mingxiid INT PRIMARY KEY,shangpinid INT,lingyong INT,dingdanid INT);
CREATE TABLE shangpin(shangpinid INT NOT NULL PRIMARY KEY,shuliang INT);
--插入数据
INSERT INTO shangpin (shangpinid,shuliang)  VALUES(1,100);
INSERT INTO shangpin (shangpinid,shuliang)  VALUES(2,100);
INSERT INTO shangpin (shangpinid,shuliang)  VALUES(3,100);
INSERT INTO dingdan(dingdanid,zhuangtai) VALUES(1,'no')
INSERT INTO mingxi(mingxiid,shangpinid,lingyong,dingdanid) VALUES(1,1,5,1);
INSERT INTO mingxi(mingxiid,shangpinid,lingyong,dingdanid) VALUES(2,2,14,1);
SELECT * FROM dingdan

--创建触发器
DELIMITER $$
CREATE TRIGGER trg01 AFTER UPDATE ON dingdan
FOR EACH ROW BEGIN
    IF new.zhuangtai='yes' AND old.zhuangtai!='yes' THEN
       UPDATE shangpin a SET shuliang=shuliang-IFNULL((SELECT lingyong FROM mingxi b WHERE b.dingdanid=new.dingdanid AND b.shangpinid=a.shangpinid ),0);
    END IF;
END$$
DELIMITER ;
UPDATE dingdan SET zhuangtai='yes'
SELECT * FROM shangpin

七.事务

---->mysql数据演示

DELIMITER $$
CREATE PROCEDURE prc02() 
BEGIN
    DECLARE t_error INTEGER DEFAULT 0;  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 
  START TRANSACTION;
  INSERT INTO tb01(f1,f2) VALUES(3,3);
  INSERT INTO tb01(f1,f2) VALUES(1,1);
  IF t_error=1 THEN
	ROLLBACK;
  ELSE
    COMMIT;
  END IF;
END$$
DELIMITER ;

猜你喜欢

转载自blog.csdn.net/liuxiaofan_/article/details/81436748
今日推荐