diff --git "a/05 \350\260\242\351\223\226\346\265\251/20230928.md" "b/05 \350\260\242\351\223\226\346\265\251/20230928.md" new file mode 100644 index 0000000000000000000000000000000000000000..4ad1dcb365434fe984eb4d1a16d1c4d3f029761a --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251/20230928.md" @@ -0,0 +1,320 @@ +存储过程[[1\]](https://gitee.com/link?target=https%3A%2F%2Fbaike.sogou.com%2Fv449738.htm%3FfromTitle%3D%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%23quote1)(Stored [Procedure](https://gitee.com/link?target=https%3A%2F%2Fbaike.sogou.com%2Flemma%2FShowInnerLink.htm%3FlemmaId%3D66045%26ss_c%3Dssc.citiao.link)),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。 + +``` +格式 +delimiter // +CREATE PROCEDURE 存储过程名() 无参 +begin +sql语句 +...; +end // +delimiter ; + +调用 +call 存储过程名(); + +其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数 + +(SQL Server 7.0以上版本),参数的使用方法如下: + +@参数名数据类型[VARYING] [=内定值] [OUTPUT] +``` + +每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。 + +[=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。 + +## 作业 + +```mysql + /* +SQLyog Ultimate v12.08 (64 bit) +MySQL - 5.7.28-log : Database - view_db +********************************************************************* +*/ + + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`view_db` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `view_db`; + +/*Table structure for table `countries` */ + +DROP TABLE IF EXISTS `countries`; + +CREATE TABLE `countries` ( + `country_id` char(2) NOT NULL, + `country_name` varchar(40) DEFAULT NULL, + `region_id` int(11) DEFAULT NULL, + PRIMARY KEY (`country_id`), + KEY `countr_reg_fk` (`region_id`), + CONSTRAINT `countr_reg_fk` FOREIGN KEY (`region_id`) REFERENCES `regions` (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `countries` */ + +insert into `countries`(`country_id`,`country_name`,`region_id`) values ('AR','Argentina',2),('AU','Australia',3),('BE','Belgium',1),('BR','Brazil',2),('CA','Canada',2),('CH','Switzerland',1),('CN','China',3),('DE','Germany',1),('DK','Denmark',1),('EG','Egypt',4),('FR','France',1),('HK','HongKong',3),('IL','Israel',4),('IN','India',3),('IT','Italy',1),('JP','Japan',3),('KW','Kuwait',4),('MX','Mexico',2),('NG','Nigeria',4),('NL','Netherlands',1),('SG','Singapore',3),('UK','United Kingdom',1),('US','United States of America',2),('ZM','Zambia',4),('ZW','Zimbabwe',4); + +/*Table structure for table `departments` */ + +DROP TABLE IF EXISTS `departments`; + +CREATE TABLE `departments` ( + `department_id` int(4) NOT NULL DEFAULT '0', + `department_name` varchar(30) NOT NULL, + `manager_id` int(6) DEFAULT NULL, + `location_id` int(4) DEFAULT NULL, + PRIMARY KEY (`department_id`), + UNIQUE KEY `dept_id_pk` (`department_id`), + KEY `dept_loc_fk` (`location_id`), + KEY `dept_mgr_fk` (`manager_id`), + CONSTRAINT `dept_loc_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`), + CONSTRAINT `dept_mgr_fk` FOREIGN KEY (`manager_id`) REFERENCES `employees` (`employee_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `departments` */ + +insert into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Administration',200,1700),(20,'Marketing',201,1800),(30,'Purchasing',114,1700),(40,'Human Resources',203,2400),(50,'Shipping',121,1500),(60,'IT',103,1400),(70,'Public Relations',204,2700),(80,'Sales',145,2500),(90,'Executive',100,1700),(100,'Finance',108,1700),(110,'Accounting',205,1700),(120,'Treasury',NULL,1700),(130,'Corporate Tax',NULL,1700),(140,'Control And Credit',NULL,1700),(150,'Shareholder Services',NULL,1700),(160,'Benefits',NULL,1700),(170,'Manufacturing',NULL,1700),(180,'Construction',NULL,1700),(190,'Contracting',NULL,1700),(200,'Operations',NULL,1700),(210,'IT Support',NULL,1700),(220,'NOC',NULL,1700),(230,'IT Helpdesk',NULL,1700),(240,'Government Sales',NULL,1700),(250,'Retail Sales',NULL,1700),(260,'Recruiting',NULL,1700),(270,'Payroll',NULL,1700); + +/*Table structure for table `employees` */ + +DROP TABLE IF EXISTS `employees`; + +CREATE TABLE `employees` ( + `employee_id` int(6) NOT NULL DEFAULT '0', + `first_name` varchar(20) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `email` varchar(25) NOT NULL, + `phone_number` varchar(20) DEFAULT NULL, + `hire_date` date NOT NULL, + `job_id` varchar(10) NOT NULL, + `salary` double(8,2) DEFAULT NULL, + `commission_pct` double(2,2) DEFAULT NULL, + `manager_id` int(6) DEFAULT NULL, + `department_id` int(4) DEFAULT NULL, + PRIMARY KEY (`employee_id`), + UNIQUE KEY `emp_email_uk` (`email`), + UNIQUE KEY `emp_emp_id_pk` (`employee_id`), + KEY `emp_dept_fk` (`department_id`), + KEY `emp_job_fk` (`job_id`), + KEY `emp_manager_fk` (`manager_id`), + CONSTRAINT `emp_dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`), + CONSTRAINT `emp_job_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`), + CONSTRAINT `emp_manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `employees` (`employee_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `employees` */ + +insert into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`hire_date`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`) values (100,'Steven','King','SKING','515.123.4567','1987-06-17','AD_PRES',24000.00,NULL,NULL,90),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','1989-09-21','AD_VP',17000.00,NULL,100,90),(102,'Lex','De Haan','LDEHAAN','515.123.4569','1993-01-13','AD_VP',17000.00,NULL,100,90),(103,'Alexander','Hunold','AHUNOLD','590.423.4567','1990-01-03','IT_PROG',9000.00,NULL,102,60),(104,'Bruce','Ernst','BERNST','590.423.4568','1991-05-21','IT_PROG',6000.00,NULL,103,60),(105,'David','Austin','DAUSTIN','590.423.4569','1997-06-25','IT_PROG',4800.00,NULL,103,60),(106,'Valli','Pataballa','VPATABAL','590.423.4560','1998-02-05','IT_PROG',4800.00,NULL,103,60),(107,'Diana','Lorentz','DLORENTZ','590.423.5567','1999-02-07','IT_PROG',4200.00,NULL,103,60),(108,'Nancy','Greenberg','NGREENBE','515.124.4569','1994-08-17','FI_MGR',12000.00,NULL,101,100),(109,'Daniel','Faviet','DFAVIET','515.124.4169','1994-08-16','FI_ACCOUNT',9000.00,NULL,108,100),(110,'John','Chen','JCHEN','515.124.4269','1997-09-28','FI_ACCOUNT',8200.00,NULL,108,100),(111,'Ismael','Sciarra','ISCIARRA','515.124.4369','1997-09-30','FI_ACCOUNT',7700.00,NULL,108,100),(112,'Jose Manuel','Urman','JMURMAN','515.124.4469','1998-03-07','FI_ACCOUNT',7800.00,NULL,108,100),(113,'Luis','Popp','LPOPP','515.124.4567','1999-12-07','FI_ACCOUNT',6900.00,NULL,108,100),(114,'Den','Raphaely','DRAPHEAL','515.127.4561','1994-12-07','PU_MAN',11000.00,NULL,100,30),(115,'Alexander','Khoo','AKHOO','515.127.4562','1995-05-18','PU_CLERK',3100.00,NULL,114,30),(116,'Shelli','Baida','SBAIDA','515.127.4563','1997-12-24','PU_CLERK',2900.00,NULL,114,30),(117,'Sigal','Tobias','STOBIAS','515.127.4564','1997-07-24','PU_CLERK',2800.00,NULL,114,30),(118,'Guy','Himuro','GHIMURO','515.127.4565','1998-11-15','PU_CLERK',2600.00,NULL,114,30),(119,'Karen','Colmenares','KCOLMENA','515.127.4566','1999-08-10','PU_CLERK',2500.00,NULL,114,30),(120,'Matthew','Weiss','MWEISS','650.123.1234','1996-07-18','ST_MAN',8000.00,NULL,100,50),(121,'Adam','Fripp','AFRIPP','650.123.2234','1997-04-10','ST_MAN',8200.00,NULL,100,50),(122,'Payam','Kaufling','PKAUFLIN','650.123.3234','1995-05-01','ST_MAN',7900.00,NULL,100,50),(123,'Shanta','Vollman','SVOLLMAN','650.123.4234','1997-10-10','ST_MAN',6500.00,NULL,100,50),(124,'Kevin','Mourgos','KMOURGOS','650.123.5234','1999-11-16','ST_MAN',5800.00,NULL,100,50),(125,'Julia','Nayer','JNAYER','650.124.1214','1997-07-16','ST_CLERK',3200.00,NULL,120,50),(126,'Irene','Mikkilineni','IMIKKILI','650.124.1224','1998-09-28','ST_CLERK',2700.00,NULL,120,50),(127,'James','Landry','JLANDRY','650.124.1334','1999-01-14','ST_CLERK',2400.00,NULL,120,50),(128,'Steven','Markle','SMARKLE','650.124.1434','2000-03-08','ST_CLERK',2200.00,NULL,120,50),(129,'Laura','Bissot','LBISSOT','650.124.5234','1997-08-20','ST_CLERK',3300.00,NULL,121,50),(130,'Mozhe','Atkinson','MATKINSO','650.124.6234','1997-10-30','ST_CLERK',2800.00,NULL,121,50),(131,'James','Marlow','JAMRLOW','650.124.7234','1997-02-16','ST_CLERK',2500.00,NULL,121,50),(132,'TJ','Olson','TJOLSON','650.124.8234','1999-04-10','ST_CLERK',2100.00,NULL,121,50),(133,'Jason','Mallin','JMALLIN','650.127.1934','1996-06-14','ST_CLERK',3300.00,NULL,122,50),(134,'Michael','Rogers','MROGERS','650.127.1834','1998-08-26','ST_CLERK',2900.00,NULL,122,50),(135,'Ki','Gee','KGEE','650.127.1734','1999-12-12','ST_CLERK',2400.00,NULL,122,50),(136,'Hazel','Philtanker','HPHILTAN','650.127.1634','2000-02-06','ST_CLERK',2200.00,NULL,122,50),(137,'Renske','Ladwig','RLADWIG','650.121.1234','1995-07-14','ST_CLERK',3600.00,NULL,123,50),(138,'Stephen','Stiles','SSTILES','650.121.2034','1997-10-26','ST_CLERK',3200.00,NULL,123,50),(139,'John','Seo','JSEO','650.121.2019','1998-02-12','ST_CLERK',2700.00,NULL,123,50),(140,'Joshua','Patel','JPATEL','650.121.1834','1998-04-06','ST_CLERK',2500.00,NULL,123,50),(141,'Trenna','Rajs','TRAJS','650.121.8009','1995-10-17','ST_CLERK',3500.00,NULL,124,50),(142,'Curtis','Davies','CDAVIES','650.121.2994','1997-01-29','ST_CLERK',3100.00,NULL,124,50),(143,'Randall','Matos','RMATOS','650.121.2874','1998-03-15','ST_CLERK',2600.00,NULL,124,50),(144,'Peter','Vargas','PVARGAS','650.121.2004','1998-07-09','ST_CLERK',2500.00,NULL,124,50),(145,'John','Russell','JRUSSEL','011.44.1344.429268','1996-10-01','SA_MAN',14000.00,0.40,100,80),(146,'Karen','Partners','KPARTNER','011.44.1344.467268','1997-01-05','SA_MAN',13500.00,0.30,100,80),(147,'Alberto','Errazuriz','AERRAZUR','011.44.1344.429278','1997-03-10','SA_MAN',12000.00,0.30,100,80),(148,'Gerald','Cambrault','GCAMBRAU','011.44.1344.619268','1999-10-15','SA_MAN',11000.00,0.30,100,80),(149,'Eleni','Zlotkey','EZLOTKEY','011.44.1344.429018','2000-01-29','SA_MAN',10500.00,0.20,100,80),(150,'Peter','Tucker','PTUCKER','011.44.1344.129268','1997-01-30','SA_REP',10000.00,0.30,145,80),(151,'David','Bernstein','DBERNSTE','011.44.1344.345268','1997-03-24','SA_REP',9500.00,0.25,145,80),(152,'Peter','Hall','PHALL','011.44.1344.478968','1997-08-20','SA_REP',9000.00,0.25,145,80),(153,'Christopher','Olsen','COLSEN','011.44.1344.498718','1998-03-30','SA_REP',8000.00,0.20,145,80),(154,'Nanette','Cambrault','NCAMBRAU','011.44.1344.987668','1998-12-09','SA_REP',7500.00,0.20,145,80),(155,'Oliver','Tuvault','OTUVAULT','011.44.1344.486508','1999-11-23','SA_REP',7000.00,0.15,145,80),(156,'Janette','King','JKING','011.44.1345.429268','1996-01-30','SA_REP',10000.00,0.35,146,80),(157,'Patrick','Sully','PSULLY','011.44.1345.929268','1996-03-04','SA_REP',9500.00,0.35,146,80),(158,'Allan','McEwen','AMCEWEN','011.44.1345.829268','1996-08-01','SA_REP',9000.00,0.35,146,80),(159,'Lindsey','Smith','LSMITH','011.44.1345.729268','1997-03-10','SA_REP',8000.00,0.30,146,80),(160,'Louise','Doran','LDORAN','011.44.1345.629268','1997-12-15','SA_REP',7500.00,0.30,146,80),(161,'Sarath','Sewall','SSEWALL','011.44.1345.529268','1998-11-03','SA_REP',7000.00,0.25,146,80),(162,'Clara','Vishney','CVISHNEY','011.44.1346.129268','1997-11-11','SA_REP',10500.00,0.25,147,80),(163,'Danielle','Greene','DGREENE','011.44.1346.229268','1999-03-19','SA_REP',9500.00,0.15,147,80),(164,'Mattea','Marvins','MMARVINS','011.44.1346.329268','2000-01-24','SA_REP',7200.00,0.10,147,80),(165,'David','Lee','DLEE','011.44.1346.529268','2000-02-23','SA_REP',6800.00,0.10,147,80),(166,'Sundar','Ande','SANDE','011.44.1346.629268','2000-03-24','SA_REP',6400.00,0.10,147,80),(167,'Amit','Banda','ABANDA','011.44.1346.729268','2000-04-21','SA_REP',6200.00,0.10,147,80),(168,'Lisa','Ozer','LOZER','011.44.1343.929268','1997-03-11','SA_REP',11500.00,0.25,148,80),(169,'Harrison','Bloom','HBLOOM','011.44.1343.829268','1998-03-23','SA_REP',10000.00,0.20,148,80),(170,'Tayler','Fox','TFOX','011.44.1343.729268','1998-01-24','SA_REP',9600.00,0.20,148,80),(171,'William','Smith','WSMITH','011.44.1343.629268','1999-02-23','SA_REP',7400.00,0.15,148,80),(172,'Elizabeth','Bates','EBATES','011.44.1343.529268','1999-03-24','SA_REP',7300.00,0.15,148,80),(173,'Sundita','Kumar','SKUMAR','011.44.1343.329268','2000-04-21','SA_REP',6100.00,0.10,148,80),(174,'Ellen','Abel','EABEL','011.44.1644.429267','1996-05-11','SA_REP',11000.00,0.30,149,80),(175,'Alyssa','Hutton','AHUTTON','011.44.1644.429266','1997-03-19','SA_REP',8800.00,0.25,149,80),(176,'Jonathon','Taylor','JTAYLOR','011.44.1644.429265','1998-03-24','SA_REP',8600.00,0.20,149,80),(177,'Jack','Livingston','JLIVINGS','011.44.1644.429264','1998-04-23','SA_REP',8400.00,0.20,149,80),(178,'Kimberely','Grant','KGRANT','011.44.1644.429263','1999-05-24','SA_REP',7000.00,0.15,149,NULL),(179,'Charles','Johnson','CJOHNSON','011.44.1644.429262','2000-01-04','SA_REP',6200.00,0.10,149,80),(180,'Winston','Taylor','WTAYLOR','650.507.9876','1998-01-24','SH_CLERK',3200.00,NULL,120,50),(181,'Jean','Fleaur','JFLEAUR','650.507.9877','1998-02-23','SH_CLERK',3100.00,NULL,120,50),(182,'Martha','Sullivan','MSULLIVA','650.507.9878','1999-06-21','SH_CLERK',2500.00,NULL,120,50),(183,'Girard','Geoni','GGEONI','650.507.9879','2000-02-03','SH_CLERK',2800.00,NULL,120,50),(184,'Nandita','Sarchand','NSARCHAN','650.509.1876','1996-01-27','SH_CLERK',4200.00,NULL,121,50),(185,'Alexis','Bull','ABULL','650.509.2876','1997-02-20','SH_CLERK',4100.00,NULL,121,50),(186,'Julia','Dellinger','JDELLING','650.509.3876','1998-06-24','SH_CLERK',3400.00,NULL,121,50),(187,'Anthony','Cabrio','ACABRIO','650.509.4876','1999-02-07','SH_CLERK',3000.00,NULL,121,50),(188,'Kelly','Chung','KCHUNG','650.505.1876','1997-06-14','SH_CLERK',3800.00,NULL,122,50),(189,'Jennifer','Dilly','JDILLY','650.505.2876','1997-08-13','SH_CLERK',3600.00,NULL,122,50),(190,'Timothy','Gates','TGATES','650.505.3876','1998-07-11','SH_CLERK',2900.00,NULL,122,50),(191,'Randall','Perkins','RPERKINS','650.505.4876','1999-12-19','SH_CLERK',2500.00,NULL,122,50),(192,'Sarah','Bell','SBELL','650.501.1876','1996-02-04','SH_CLERK',4000.00,NULL,123,50),(193,'Britney','Everett','BEVERETT','650.501.2876','1997-03-03','SH_CLERK',3900.00,NULL,123,50),(194,'Samuel','McCain','SMCCAIN','650.501.3876','1998-07-01','SH_CLERK',3200.00,NULL,123,50),(195,'Vance','Jones','VJONES','650.501.4876','1999-03-17','SH_CLERK',2800.00,NULL,123,50),(196,'Alana','Walsh','AWALSH','650.507.9811','1998-04-24','SH_CLERK',3100.00,NULL,124,50),(197,'Kevin','Feeney','KFEENEY','650.507.9822','1998-05-23','SH_CLERK',3000.00,NULL,124,50),(198,'Donald','OConnell','DOCONNEL','650.507.9833','1999-06-21','SH_CLERK',2600.00,NULL,124,50),(199,'Douglas','Grant','DGRANT','650.507.9844','2000-01-13','SH_CLERK',2600.00,NULL,124,50),(200,'Jennifer','Whalen','JWHALEN','515.123.4444','1987-09-17','AD_ASST',4400.00,NULL,101,10),(201,'Michael','Hartstein','MHARTSTE','515.123.5555','1996-02-17','MK_MAN',13000.00,NULL,100,20),(202,'Pat','Fay','PFAY','603.123.6666','1997-08-17','MK_REP',6000.00,NULL,201,20),(203,'Susan','Mavris','SMAVRIS','515.123.7777','1994-06-07','HR_REP',6500.00,NULL,101,40),(204,'Hermann','Baer','HBAER','515.123.8888','1994-06-07','PR_REP',10000.00,NULL,101,70),(205,'Shelley','Higgins','SHIGGINS','515.123.8080','1994-06-07','AC_MGR',12000.00,NULL,101,110),(206,'William','Gietz','WGIETZ','515.123.8181','1994-06-07','AC_ACCOUNT',8300.00,NULL,205,110); + +/*Table structure for table `job_grades` */ + +DROP TABLE IF EXISTS `job_grades`; + +CREATE TABLE `job_grades` ( + `grade_level` varchar(3) DEFAULT NULL, + `lowest_sal` int(11) DEFAULT NULL, + `highest_sal` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `job_grades` */ + +insert into `job_grades`(`grade_level`,`lowest_sal`,`highest_sal`) values ('A',1000,2999),('B',3000,5999),('C',6000,9999),('D',10000,14999),('E',15000,24999),('F',25000,40000); + +/*Table structure for table `job_history` */ + +DROP TABLE IF EXISTS `job_history`; + +CREATE TABLE `job_history` ( + `employee_id` int(6) NOT NULL, + `start_date` date NOT NULL, + `end_date` date NOT NULL, + `job_id` varchar(10) NOT NULL, + `department_id` int(4) DEFAULT NULL, + PRIMARY KEY (`employee_id`,`start_date`), + UNIQUE KEY `jhist_emp_id_st_date_pk` (`employee_id`,`start_date`), + KEY `jhist_job_fk` (`job_id`), + KEY `jhist_dept_fk` (`department_id`), + CONSTRAINT `jhist_dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`), + CONSTRAINT `jhist_emp_fk` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`employee_id`), + CONSTRAINT `jhist_job_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `job_history` */ + +insert into `job_history`(`employee_id`,`start_date`,`end_date`,`job_id`,`department_id`) values (101,'1989-09-21','1993-10-27','AC_ACCOUNT',110),(101,'1993-10-28','1997-03-15','AC_MGR',110),(102,'1993-01-13','1998-07-24','IT_PROG',60),(114,'1998-03-24','1999-12-31','ST_CLERK',50),(122,'1999-01-01','1999-12-31','ST_CLERK',50),(176,'1998-03-24','1998-12-31','SA_REP',80),(176,'1999-01-01','1999-12-31','SA_MAN',80),(200,'1987-09-17','1993-06-17','AD_ASST',90),(200,'1994-07-01','1998-12-31','AC_ACCOUNT',90),(201,'1996-02-17','1999-12-19','MK_REP',20); + +/*Table structure for table `jobs` */ + +DROP TABLE IF EXISTS `jobs`; + +CREATE TABLE `jobs` ( + `job_id` varchar(10) NOT NULL DEFAULT '', + `job_title` varchar(35) NOT NULL, + `min_salary` int(6) DEFAULT NULL, + `max_salary` int(6) DEFAULT NULL, + PRIMARY KEY (`job_id`), + UNIQUE KEY `job_id_pk` (`job_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `jobs` */ + +insert into `jobs`(`job_id`,`job_title`,`min_salary`,`max_salary`) values ('AC_ACCOUNT','Public Accountant',4200,9000),('AC_MGR','Accounting Manager',8200,16000),('AD_ASST','Administration Assistant',3000,6000),('AD_PRES','President',20000,40000),('AD_VP','Administration Vice President',15000,30000),('FI_ACCOUNT','Accountant',4200,9000),('FI_MGR','Finance Manager',8200,16000),('HR_REP','Human Resources Representative',4000,9000),('IT_PROG','Programmer',4000,10000),('MK_MAN','Marketing Manager',9000,15000),('MK_REP','Marketing Representative',4000,9000),('PR_REP','Public Relations Representative',4500,10500),('PU_CLERK','Purchasing Clerk',2500,5500),('PU_MAN','Purchasing Manager',8000,15000),('SA_MAN','Sales Manager',10000,20000),('SA_REP','Sales Representative',6000,12000),('SH_CLERK','Shipping Clerk',2500,5500),('ST_CLERK','Stock Clerk',2000,5000),('ST_MAN','Stock Manager',5500,8500); + +/*Table structure for table `locations` */ + +DROP TABLE IF EXISTS `locations`; + +CREATE TABLE `locations` ( + `location_id` int(4) NOT NULL DEFAULT '0', + `street_address` varchar(40) DEFAULT NULL, + `postal_code` varchar(12) DEFAULT NULL, + `city` varchar(30) NOT NULL, + `state_province` varchar(25) DEFAULT NULL, + `country_id` char(2) DEFAULT NULL, + PRIMARY KEY (`location_id`), + UNIQUE KEY `loc_id_pk` (`location_id`), + KEY `loc_c_id_fk` (`country_id`), + CONSTRAINT `loc_c_id_fk` FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `locations` */ + +insert into `locations`(`location_id`,`street_address`,`postal_code`,`city`,`state_province`,`country_id`) values (1000,'1297 Via Cola di Rie','00989','Roma',NULL,'IT'),(1100,'93091 Calle della Testa','10934','Venice',NULL,'IT'),(1200,'2017 Shinjuku-ku','1689','Tokyo','Tokyo Prefecture','JP'),(1300,'9450 Kamiya-cho','6823','Hiroshima',NULL,'JP'),(1400,'2014 Jabberwocky Rd','26192','Southlake','Texas','US'),(1500,'2011 Interiors Blvd','99236','South San Francisco','California','US'),(1600,'2007 Zagora St','50090','South Brunswick','New Jersey','US'),(1700,'2004 Charade Rd','98199','Seattle','Washington','US'),(1800,'147 Spadina Ave','M5V 2L7','Toronto','Ontario','CA'),(1900,'6092 Boxwood St','YSW 9T2','Whitehorse','Yukon','CA'),(2000,'40-5-12 Laogianggen','190518','Beijing',NULL,'CN'),(2100,'1298 Vileparle (E)','490231','Bombay','Maharashtra','IN'),(2200,'12-98 Victoria Street','2901','Sydney','New South Wales','AU'),(2300,'198 Clementi North','540198','Singapore',NULL,'SG'),(2400,'8204 Arthur St',NULL,'London',NULL,'UK'),(2500,'Magdalen Centre, The Oxford Science Park','OX9 9ZB','Oxford','Oxford','UK'),(2600,'9702 Chester Road','09629850293','Stretford','Manchester','UK'),(2700,'Schwanthalerstr. 7031','80925','Munich','Bavaria','DE'),(2800,'Rua Frei Caneca 1360 ','01307-002','Sao Paulo','Sao Paulo','BR'),(2900,'20 Rue des Corps-Saints','1730','Geneva','Geneve','CH'),(3000,'Murtenstrasse 921','3095','Bern','BE','CH'),(3100,'Pieter Breughelstraat 837','3029SK','Utrecht','Utrecht','NL'),(3200,'Mariano Escobedo 9991','11932','Mexico City','Distrito Federal,','MX'); + +/*Table structure for table `order` */ + +DROP TABLE IF EXISTS `order`; + +CREATE TABLE `order` ( + `order_id` int(11) DEFAULT NULL, + `order_name` varchar(15) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `order` */ + +insert into `order`(`order_id`,`order_name`) values (1,'shkstart'),(2,'tomcat'),(3,'dubbo'); + +/*Table structure for table `regions` */ + +DROP TABLE IF EXISTS `regions`; + +CREATE TABLE `regions` ( + `region_id` int(11) NOT NULL, + `region_name` varchar(25) DEFAULT NULL, + PRIMARY KEY (`region_id`), + UNIQUE KEY `reg_id_pk` (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `regions` */ + +insert into `regions`(`region_id`,`region_name`) values (1,'Europe'),(2,'Americas'),(3,'Asia'),(4,'Middle East and Africa'); + +/*Table structure for table `emp_details_view` */ + +DROP TABLE IF EXISTS `emp_details_view`; + +/*!50001 DROP VIEW IF EXISTS `emp_details_view` */; +/*!50001 DROP TABLE IF EXISTS `emp_details_view` */; + +/*!50001 CREATE TABLE `emp_details_view`( + `employee_id` int(6) , + `job_id` varchar(10) , + `manager_id` int(6) , + `department_id` int(4) , + `location_id` int(4) , + `country_id` char(2) , + `first_name` varchar(20) , + `last_name` varchar(25) , + `salary` double(8,2) , + `commission_pct` double(2,2) , + `department_name` varchar(30) , + `job_title` varchar(35) , + `city` varchar(30) , + `state_province` varchar(25) , + `country_name` varchar(40) , + `region_name` varchar(25) +)*/; + +/*View structure for view emp_details_view */ + +/*!50001 DROP TABLE IF EXISTS `emp_details_view` */; +/*!50001 DROP VIEW IF EXISTS `emp_details_view` */; + +/*!50001 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `emp_details_view` AS select `e`.`employee_id` AS `employee_id`,`e`.`job_id` AS `job_id`,`e`.`manager_id` AS `manager_id`,`e`.`department_id` AS `department_id`,`d`.`location_id` AS `location_id`,`l`.`country_id` AS `country_id`,`e`.`first_name` AS `first_name`,`e`.`last_name` AS `last_name`,`e`.`salary` AS `salary`,`e`.`commission_pct` AS `commission_pct`,`d`.`department_name` AS `department_name`,`j`.`job_title` AS `job_title`,`l`.`city` AS `city`,`l`.`state_province` AS `state_province`,`c`.`country_name` AS `country_name`,`r`.`region_name` AS `region_name` from (((((`employees` `e` join `departments` `d`) join `jobs` `j`) join `locations` `l`) join `countries` `c`) join `regions` `r`) where ((`e`.`department_id` = `d`.`department_id`) and (`d`.`location_id` = `l`.`location_id`) and (`l`.`country_id` = `c`.`country_id`) and (`c`.`region_id` = `r`.`region_id`) and (`j`.`job_id` = `e`.`job_id`)) */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- 定义一个无参数的存储过程(查) +delimiter // +create procedure work1() +begin +select * from employees; +select * from departments; +select * from countries; +select * from `order`; +select * from locations; +select * from regionsp; +end // +delimiter; + + +-- 调用存储过程 +call work1; + + +-- 定义一个无参数的存储过程(添加数据) +delimiter // +create procedure work2() +begin +insert into countries values ('ZP','beikehanmu',2); +insert into `order` values (4,'mate60pro'); +select * from countries; +select * from `order`; +end // +delimiter ; + +-- 调用 +call work2; + + +-- 创建一个无参数的存储过程(修改) +delimiter // +create procedure work3() +begin +alter table employees change salary employe_salary double(8,2); +alter table employees modify hire_date date after first_name; +select * from employees; +end // +delimiter ; + +-- 调用 + +call work3; + + +-- 创建一个无参数的存储过程(删除) +delimiter // +create procedure work4() +begin +delete from `order` where order_id = 4; +delete from job_grades where grade_level='C'; +select * from `order`; +select * from job_grades; +end // +delimiter ; + +-- 调用 +call work4; +``` \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251/20231008.md" "b/05 \350\260\242\351\223\226\346\265\251/20231008.md" new file mode 100644 index 0000000000000000000000000000000000000000..d1e12ee1f38ed0b625ac8db4ccb39338ec538dad --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251/20231008.md" @@ -0,0 +1,405 @@ +mysql存储过程的参数类型有三种:1、输入参数,用“IN”关键字标识,可以传递给一个存储过程;2、输出参数,用“OUT”关键字标识,用于存储过程需要返回一个操作结果的情形;3、输入输出参数,用“INOUT”关键字标识。 + +**3种参数类型:** + +- IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量) +- OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量) +- INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量) + +存储过程可以有0个或多个参数,用于存储过程的定义。 + +## 作业1 + +``` +/* +SQLyog Ultimate v12.08 (64 bit) +MySQL - 5.7.28-log : Database - view_db +********************************************************************* +*/ + + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`view_db` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `view_db`; + +/*Table structure for table `countries` */ + +DROP TABLE IF EXISTS `countries`; + +CREATE TABLE `countries` ( + `country_id` char(2) NOT NULL, + `country_name` varchar(40) DEFAULT NULL, + `region_id` int(11) DEFAULT NULL, + PRIMARY KEY (`country_id`), + KEY `countr_reg_fk` (`region_id`), + CONSTRAINT `countr_reg_fk` FOREIGN KEY (`region_id`) REFERENCES `regions` (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `countries` */ + +insert into `countries`(`country_id`,`country_name`,`region_id`) values ('AR','Argentina',2),('AU','Australia',3),('BE','Belgium',1),('BR','Brazil',2),('CA','Canada',2),('CH','Switzerland',1),('CN','China',3),('DE','Germany',1),('DK','Denmark',1),('EG','Egypt',4),('FR','France',1),('HK','HongKong',3),('IL','Israel',4),('IN','India',3),('IT','Italy',1),('JP','Japan',3),('KW','Kuwait',4),('MX','Mexico',2),('NG','Nigeria',4),('NL','Netherlands',1),('SG','Singapore',3),('UK','United Kingdom',1),('US','United States of America',2),('ZM','Zambia',4),('ZW','Zimbabwe',4); + +/*Table structure for table `departments` */ + +DROP TABLE IF EXISTS `departments`; + +CREATE TABLE `departments` ( + `department_id` int(4) NOT NULL DEFAULT '0', + `department_name` varchar(30) NOT NULL, + `manager_id` int(6) DEFAULT NULL, + `location_id` int(4) DEFAULT NULL, + PRIMARY KEY (`department_id`), + UNIQUE KEY `dept_id_pk` (`department_id`), + KEY `dept_loc_fk` (`location_id`), + KEY `dept_mgr_fk` (`manager_id`), + CONSTRAINT `dept_loc_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`), + CONSTRAINT `dept_mgr_fk` FOREIGN KEY (`manager_id`) REFERENCES `employees` (`employee_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `departments` */ + +insert into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Administration',200,1700),(20,'Marketing',201,1800),(30,'Purchasing',114,1700),(40,'Human Resources',203,2400),(50,'Shipping',121,1500),(60,'IT',103,1400),(70,'Public Relations',204,2700),(80,'Sales',145,2500),(90,'Executive',100,1700),(100,'Finance',108,1700),(110,'Accounting',205,1700),(120,'Treasury',NULL,1700),(130,'Corporate Tax',NULL,1700),(140,'Control And Credit',NULL,1700),(150,'Shareholder Services',NULL,1700),(160,'Benefits',NULL,1700),(170,'Manufacturing',NULL,1700),(180,'Construction',NULL,1700),(190,'Contracting',NULL,1700),(200,'Operations',NULL,1700),(210,'IT Support',NULL,1700),(220,'NOC',NULL,1700),(230,'IT Helpdesk',NULL,1700),(240,'Government Sales',NULL,1700),(250,'Retail Sales',NULL,1700),(260,'Recruiting',NULL,1700),(270,'Payroll',NULL,1700); + +/*Table structure for table `employees` */ + +DROP TABLE IF EXISTS `employees`; + +CREATE TABLE `employees` ( + `employee_id` int(6) NOT NULL DEFAULT '0', + `first_name` varchar(20) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `email` varchar(25) NOT NULL, + `phone_number` varchar(20) DEFAULT NULL, + `hire_date` date NOT NULL, + `job_id` varchar(10) NOT NULL, + `salary` double(8,2) DEFAULT NULL, + `commission_pct` double(2,2) DEFAULT NULL, + `manager_id` int(6) DEFAULT NULL, + `department_id` int(4) DEFAULT NULL, + PRIMARY KEY (`employee_id`), + UNIQUE KEY `emp_email_uk` (`email`), + UNIQUE KEY `emp_emp_id_pk` (`employee_id`), + KEY `emp_dept_fk` (`department_id`), + KEY `emp_job_fk` (`job_id`), + KEY `emp_manager_fk` (`manager_id`), + CONSTRAINT `emp_dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`), + CONSTRAINT `emp_job_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`), + CONSTRAINT `emp_manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `employees` (`employee_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `employees` */ + +insert into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`hire_date`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`) values (100,'Steven','King','SKING','515.123.4567','1987-06-17','AD_PRES',24000.00,NULL,NULL,90),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','1989-09-21','AD_VP',17000.00,NULL,100,90),(102,'Lex','De Haan','LDEHAAN','515.123.4569','1993-01-13','AD_VP',17000.00,NULL,100,90),(103,'Alexander','Hunold','AHUNOLD','590.423.4567','1990-01-03','IT_PROG',9000.00,NULL,102,60),(104,'Bruce','Ernst','BERNST','590.423.4568','1991-05-21','IT_PROG',6000.00,NULL,103,60),(105,'David','Austin','DAUSTIN','590.423.4569','1997-06-25','IT_PROG',4800.00,NULL,103,60),(106,'Valli','Pataballa','VPATABAL','590.423.4560','1998-02-05','IT_PROG',4800.00,NULL,103,60),(107,'Diana','Lorentz','DLORENTZ','590.423.5567','1999-02-07','IT_PROG',4200.00,NULL,103,60),(108,'Nancy','Greenberg','NGREENBE','515.124.4569','1994-08-17','FI_MGR',12000.00,NULL,101,100),(109,'Daniel','Faviet','DFAVIET','515.124.4169','1994-08-16','FI_ACCOUNT',9000.00,NULL,108,100),(110,'John','Chen','JCHEN','515.124.4269','1997-09-28','FI_ACCOUNT',8200.00,NULL,108,100),(111,'Ismael','Sciarra','ISCIARRA','515.124.4369','1997-09-30','FI_ACCOUNT',7700.00,NULL,108,100),(112,'Jose Manuel','Urman','JMURMAN','515.124.4469','1998-03-07','FI_ACCOUNT',7800.00,NULL,108,100),(113,'Luis','Popp','LPOPP','515.124.4567','1999-12-07','FI_ACCOUNT',6900.00,NULL,108,100),(114,'Den','Raphaely','DRAPHEAL','515.127.4561','1994-12-07','PU_MAN',11000.00,NULL,100,30),(115,'Alexander','Khoo','AKHOO','515.127.4562','1995-05-18','PU_CLERK',3100.00,NULL,114,30),(116,'Shelli','Baida','SBAIDA','515.127.4563','1997-12-24','PU_CLERK',2900.00,NULL,114,30),(117,'Sigal','Tobias','STOBIAS','515.127.4564','1997-07-24','PU_CLERK',2800.00,NULL,114,30),(118,'Guy','Himuro','GHIMURO','515.127.4565','1998-11-15','PU_CLERK',2600.00,NULL,114,30),(119,'Karen','Colmenares','KCOLMENA','515.127.4566','1999-08-10','PU_CLERK',2500.00,NULL,114,30),(120,'Matthew','Weiss','MWEISS','650.123.1234','1996-07-18','ST_MAN',8000.00,NULL,100,50),(121,'Adam','Fripp','AFRIPP','650.123.2234','1997-04-10','ST_MAN',8200.00,NULL,100,50),(122,'Payam','Kaufling','PKAUFLIN','650.123.3234','1995-05-01','ST_MAN',7900.00,NULL,100,50),(123,'Shanta','Vollman','SVOLLMAN','650.123.4234','1997-10-10','ST_MAN',6500.00,NULL,100,50),(124,'Kevin','Mourgos','KMOURGOS','650.123.5234','1999-11-16','ST_MAN',5800.00,NULL,100,50),(125,'Julia','Nayer','JNAYER','650.124.1214','1997-07-16','ST_CLERK',3200.00,NULL,120,50),(126,'Irene','Mikkilineni','IMIKKILI','650.124.1224','1998-09-28','ST_CLERK',2700.00,NULL,120,50),(127,'James','Landry','JLANDRY','650.124.1334','1999-01-14','ST_CLERK',2400.00,NULL,120,50),(128,'Steven','Markle','SMARKLE','650.124.1434','2000-03-08','ST_CLERK',2200.00,NULL,120,50),(129,'Laura','Bissot','LBISSOT','650.124.5234','1997-08-20','ST_CLERK',3300.00,NULL,121,50),(130,'Mozhe','Atkinson','MATKINSO','650.124.6234','1997-10-30','ST_CLERK',2800.00,NULL,121,50),(131,'James','Marlow','JAMRLOW','650.124.7234','1997-02-16','ST_CLERK',2500.00,NULL,121,50),(132,'TJ','Olson','TJOLSON','650.124.8234','1999-04-10','ST_CLERK',2100.00,NULL,121,50),(133,'Jason','Mallin','JMALLIN','650.127.1934','1996-06-14','ST_CLERK',3300.00,NULL,122,50),(134,'Michael','Rogers','MROGERS','650.127.1834','1998-08-26','ST_CLERK',2900.00,NULL,122,50),(135,'Ki','Gee','KGEE','650.127.1734','1999-12-12','ST_CLERK',2400.00,NULL,122,50),(136,'Hazel','Philtanker','HPHILTAN','650.127.1634','2000-02-06','ST_CLERK',2200.00,NULL,122,50),(137,'Renske','Ladwig','RLADWIG','650.121.1234','1995-07-14','ST_CLERK',3600.00,NULL,123,50),(138,'Stephen','Stiles','SSTILES','650.121.2034','1997-10-26','ST_CLERK',3200.00,NULL,123,50),(139,'John','Seo','JSEO','650.121.2019','1998-02-12','ST_CLERK',2700.00,NULL,123,50),(140,'Joshua','Patel','JPATEL','650.121.1834','1998-04-06','ST_CLERK',2500.00,NULL,123,50),(141,'Trenna','Rajs','TRAJS','650.121.8009','1995-10-17','ST_CLERK',3500.00,NULL,124,50),(142,'Curtis','Davies','CDAVIES','650.121.2994','1997-01-29','ST_CLERK',3100.00,NULL,124,50),(143,'Randall','Matos','RMATOS','650.121.2874','1998-03-15','ST_CLERK',2600.00,NULL,124,50),(144,'Peter','Vargas','PVARGAS','650.121.2004','1998-07-09','ST_CLERK',2500.00,NULL,124,50),(145,'John','Russell','JRUSSEL','011.44.1344.429268','1996-10-01','SA_MAN',14000.00,0.40,100,80),(146,'Karen','Partners','KPARTNER','011.44.1344.467268','1997-01-05','SA_MAN',13500.00,0.30,100,80),(147,'Alberto','Errazuriz','AERRAZUR','011.44.1344.429278','1997-03-10','SA_MAN',12000.00,0.30,100,80),(148,'Gerald','Cambrault','GCAMBRAU','011.44.1344.619268','1999-10-15','SA_MAN',11000.00,0.30,100,80),(149,'Eleni','Zlotkey','EZLOTKEY','011.44.1344.429018','2000-01-29','SA_MAN',10500.00,0.20,100,80),(150,'Peter','Tucker','PTUCKER','011.44.1344.129268','1997-01-30','SA_REP',10000.00,0.30,145,80),(151,'David','Bernstein','DBERNSTE','011.44.1344.345268','1997-03-24','SA_REP',9500.00,0.25,145,80),(152,'Peter','Hall','PHALL','011.44.1344.478968','1997-08-20','SA_REP',9000.00,0.25,145,80),(153,'Christopher','Olsen','COLSEN','011.44.1344.498718','1998-03-30','SA_REP',8000.00,0.20,145,80),(154,'Nanette','Cambrault','NCAMBRAU','011.44.1344.987668','1998-12-09','SA_REP',7500.00,0.20,145,80),(155,'Oliver','Tuvault','OTUVAULT','011.44.1344.486508','1999-11-23','SA_REP',7000.00,0.15,145,80),(156,'Janette','King','JKING','011.44.1345.429268','1996-01-30','SA_REP',10000.00,0.35,146,80),(157,'Patrick','Sully','PSULLY','011.44.1345.929268','1996-03-04','SA_REP',9500.00,0.35,146,80),(158,'Allan','McEwen','AMCEWEN','011.44.1345.829268','1996-08-01','SA_REP',9000.00,0.35,146,80),(159,'Lindsey','Smith','LSMITH','011.44.1345.729268','1997-03-10','SA_REP',8000.00,0.30,146,80),(160,'Louise','Doran','LDORAN','011.44.1345.629268','1997-12-15','SA_REP',7500.00,0.30,146,80),(161,'Sarath','Sewall','SSEWALL','011.44.1345.529268','1998-11-03','SA_REP',7000.00,0.25,146,80),(162,'Clara','Vishney','CVISHNEY','011.44.1346.129268','1997-11-11','SA_REP',10500.00,0.25,147,80),(163,'Danielle','Greene','DGREENE','011.44.1346.229268','1999-03-19','SA_REP',9500.00,0.15,147,80),(164,'Mattea','Marvins','MMARVINS','011.44.1346.329268','2000-01-24','SA_REP',7200.00,0.10,147,80),(165,'David','Lee','DLEE','011.44.1346.529268','2000-02-23','SA_REP',6800.00,0.10,147,80),(166,'Sundar','Ande','SANDE','011.44.1346.629268','2000-03-24','SA_REP',6400.00,0.10,147,80),(167,'Amit','Banda','ABANDA','011.44.1346.729268','2000-04-21','SA_REP',6200.00,0.10,147,80),(168,'Lisa','Ozer','LOZER','011.44.1343.929268','1997-03-11','SA_REP',11500.00,0.25,148,80),(169,'Harrison','Bloom','HBLOOM','011.44.1343.829268','1998-03-23','SA_REP',10000.00,0.20,148,80),(170,'Tayler','Fox','TFOX','011.44.1343.729268','1998-01-24','SA_REP',9600.00,0.20,148,80),(171,'William','Smith','WSMITH','011.44.1343.629268','1999-02-23','SA_REP',7400.00,0.15,148,80),(172,'Elizabeth','Bates','EBATES','011.44.1343.529268','1999-03-24','SA_REP',7300.00,0.15,148,80),(173,'Sundita','Kumar','SKUMAR','011.44.1343.329268','2000-04-21','SA_REP',6100.00,0.10,148,80),(174,'Ellen','Abel','EABEL','011.44.1644.429267','1996-05-11','SA_REP',11000.00,0.30,149,80),(175,'Alyssa','Hutton','AHUTTON','011.44.1644.429266','1997-03-19','SA_REP',8800.00,0.25,149,80),(176,'Jonathon','Taylor','JTAYLOR','011.44.1644.429265','1998-03-24','SA_REP',8600.00,0.20,149,80),(177,'Jack','Livingston','JLIVINGS','011.44.1644.429264','1998-04-23','SA_REP',8400.00,0.20,149,80),(178,'Kimberely','Grant','KGRANT','011.44.1644.429263','1999-05-24','SA_REP',7000.00,0.15,149,NULL),(179,'Charles','Johnson','CJOHNSON','011.44.1644.429262','2000-01-04','SA_REP',6200.00,0.10,149,80),(180,'Winston','Taylor','WTAYLOR','650.507.9876','1998-01-24','SH_CLERK',3200.00,NULL,120,50),(181,'Jean','Fleaur','JFLEAUR','650.507.9877','1998-02-23','SH_CLERK',3100.00,NULL,120,50),(182,'Martha','Sullivan','MSULLIVA','650.507.9878','1999-06-21','SH_CLERK',2500.00,NULL,120,50),(183,'Girard','Geoni','GGEONI','650.507.9879','2000-02-03','SH_CLERK',2800.00,NULL,120,50),(184,'Nandita','Sarchand','NSARCHAN','650.509.1876','1996-01-27','SH_CLERK',4200.00,NULL,121,50),(185,'Alexis','Bull','ABULL','650.509.2876','1997-02-20','SH_CLERK',4100.00,NULL,121,50),(186,'Julia','Dellinger','JDELLING','650.509.3876','1998-06-24','SH_CLERK',3400.00,NULL,121,50),(187,'Anthony','Cabrio','ACABRIO','650.509.4876','1999-02-07','SH_CLERK',3000.00,NULL,121,50),(188,'Kelly','Chung','KCHUNG','650.505.1876','1997-06-14','SH_CLERK',3800.00,NULL,122,50),(189,'Jennifer','Dilly','JDILLY','650.505.2876','1997-08-13','SH_CLERK',3600.00,NULL,122,50),(190,'Timothy','Gates','TGATES','650.505.3876','1998-07-11','SH_CLERK',2900.00,NULL,122,50),(191,'Randall','Perkins','RPERKINS','650.505.4876','1999-12-19','SH_CLERK',2500.00,NULL,122,50),(192,'Sarah','Bell','SBELL','650.501.1876','1996-02-04','SH_CLERK',4000.00,NULL,123,50),(193,'Britney','Everett','BEVERETT','650.501.2876','1997-03-03','SH_CLERK',3900.00,NULL,123,50),(194,'Samuel','McCain','SMCCAIN','650.501.3876','1998-07-01','SH_CLERK',3200.00,NULL,123,50),(195,'Vance','Jones','VJONES','650.501.4876','1999-03-17','SH_CLERK',2800.00,NULL,123,50),(196,'Alana','Walsh','AWALSH','650.507.9811','1998-04-24','SH_CLERK',3100.00,NULL,124,50),(197,'Kevin','Feeney','KFEENEY','650.507.9822','1998-05-23','SH_CLERK',3000.00,NULL,124,50),(198,'Donald','OConnell','DOCONNEL','650.507.9833','1999-06-21','SH_CLERK',2600.00,NULL,124,50),(199,'Douglas','Grant','DGRANT','650.507.9844','2000-01-13','SH_CLERK',2600.00,NULL,124,50),(200,'Jennifer','Whalen','JWHALEN','515.123.4444','1987-09-17','AD_ASST',4400.00,NULL,101,10),(201,'Michael','Hartstein','MHARTSTE','515.123.5555','1996-02-17','MK_MAN',13000.00,NULL,100,20),(202,'Pat','Fay','PFAY','603.123.6666','1997-08-17','MK_REP',6000.00,NULL,201,20),(203,'Susan','Mavris','SMAVRIS','515.123.7777','1994-06-07','HR_REP',6500.00,NULL,101,40),(204,'Hermann','Baer','HBAER','515.123.8888','1994-06-07','PR_REP',10000.00,NULL,101,70),(205,'Shelley','Higgins','SHIGGINS','515.123.8080','1994-06-07','AC_MGR',12000.00,NULL,101,110),(206,'William','Gietz','WGIETZ','515.123.8181','1994-06-07','AC_ACCOUNT',8300.00,NULL,205,110); + +/*Table structure for table `job_grades` */ + +DROP TABLE IF EXISTS `job_grades`; + +CREATE TABLE `job_grades` ( + `grade_level` varchar(3) DEFAULT NULL, + `lowest_sal` int(11) DEFAULT NULL, + `highest_sal` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `job_grades` */ + +insert into `job_grades`(`grade_level`,`lowest_sal`,`highest_sal`) values ('A',1000,2999),('B',3000,5999),('C',6000,9999),('D',10000,14999),('E',15000,24999),('F',25000,40000); + +/*Table structure for table `job_history` */ + +DROP TABLE IF EXISTS `job_history`; + +CREATE TABLE `job_history` ( + `employee_id` int(6) NOT NULL, + `start_date` date NOT NULL, + `end_date` date NOT NULL, + `job_id` varchar(10) NOT NULL, + `department_id` int(4) DEFAULT NULL, + PRIMARY KEY (`employee_id`,`start_date`), + UNIQUE KEY `jhist_emp_id_st_date_pk` (`employee_id`,`start_date`), + KEY `jhist_job_fk` (`job_id`), + KEY `jhist_dept_fk` (`department_id`), + CONSTRAINT `jhist_dept_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`), + CONSTRAINT `jhist_emp_fk` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`employee_id`), + CONSTRAINT `jhist_job_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `job_history` */ + +insert into `job_history`(`employee_id`,`start_date`,`end_date`,`job_id`,`department_id`) values (101,'1989-09-21','1993-10-27','AC_ACCOUNT',110),(101,'1993-10-28','1997-03-15','AC_MGR',110),(102,'1993-01-13','1998-07-24','IT_PROG',60),(114,'1998-03-24','1999-12-31','ST_CLERK',50),(122,'1999-01-01','1999-12-31','ST_CLERK',50),(176,'1998-03-24','1998-12-31','SA_REP',80),(176,'1999-01-01','1999-12-31','SA_MAN',80),(200,'1987-09-17','1993-06-17','AD_ASST',90),(200,'1994-07-01','1998-12-31','AC_ACCOUNT',90),(201,'1996-02-17','1999-12-19','MK_REP',20); + +/*Table structure for table `jobs` */ + +DROP TABLE IF EXISTS `jobs`; + +CREATE TABLE `jobs` ( + `job_id` varchar(10) NOT NULL DEFAULT '', + `job_title` varchar(35) NOT NULL, + `min_salary` int(6) DEFAULT NULL, + `max_salary` int(6) DEFAULT NULL, + PRIMARY KEY (`job_id`), + UNIQUE KEY `job_id_pk` (`job_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `jobs` */ + +insert into `jobs`(`job_id`,`job_title`,`min_salary`,`max_salary`) values ('AC_ACCOUNT','Public Accountant',4200,9000),('AC_MGR','Accounting Manager',8200,16000),('AD_ASST','Administration Assistant',3000,6000),('AD_PRES','President',20000,40000),('AD_VP','Administration Vice President',15000,30000),('FI_ACCOUNT','Accountant',4200,9000),('FI_MGR','Finance Manager',8200,16000),('HR_REP','Human Resources Representative',4000,9000),('IT_PROG','Programmer',4000,10000),('MK_MAN','Marketing Manager',9000,15000),('MK_REP','Marketing Representative',4000,9000),('PR_REP','Public Relations Representative',4500,10500),('PU_CLERK','Purchasing Clerk',2500,5500),('PU_MAN','Purchasing Manager',8000,15000),('SA_MAN','Sales Manager',10000,20000),('SA_REP','Sales Representative',6000,12000),('SH_CLERK','Shipping Clerk',2500,5500),('ST_CLERK','Stock Clerk',2000,5000),('ST_MAN','Stock Manager',5500,8500); + +/*Table structure for table `locations` */ + +DROP TABLE IF EXISTS `locations`; + +CREATE TABLE `locations` ( + `location_id` int(4) NOT NULL DEFAULT '0', + `street_address` varchar(40) DEFAULT NULL, + `postal_code` varchar(12) DEFAULT NULL, + `city` varchar(30) NOT NULL, + `state_province` varchar(25) DEFAULT NULL, + `country_id` char(2) DEFAULT NULL, + PRIMARY KEY (`location_id`), + UNIQUE KEY `loc_id_pk` (`location_id`), + KEY `loc_c_id_fk` (`country_id`), + CONSTRAINT `loc_c_id_fk` FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `locations` */ + +insert into `locations`(`location_id`,`street_address`,`postal_code`,`city`,`state_province`,`country_id`) values (1000,'1297 Via Cola di Rie','00989','Roma',NULL,'IT'),(1100,'93091 Calle della Testa','10934','Venice',NULL,'IT'),(1200,'2017 Shinjuku-ku','1689','Tokyo','Tokyo Prefecture','JP'),(1300,'9450 Kamiya-cho','6823','Hiroshima',NULL,'JP'),(1400,'2014 Jabberwocky Rd','26192','Southlake','Texas','US'),(1500,'2011 Interiors Blvd','99236','South San Francisco','California','US'),(1600,'2007 Zagora St','50090','South Brunswick','New Jersey','US'),(1700,'2004 Charade Rd','98199','Seattle','Washington','US'),(1800,'147 Spadina Ave','M5V 2L7','Toronto','Ontario','CA'),(1900,'6092 Boxwood St','YSW 9T2','Whitehorse','Yukon','CA'),(2000,'40-5-12 Laogianggen','190518','Beijing',NULL,'CN'),(2100,'1298 Vileparle (E)','490231','Bombay','Maharashtra','IN'),(2200,'12-98 Victoria Street','2901','Sydney','New South Wales','AU'),(2300,'198 Clementi North','540198','Singapore',NULL,'SG'),(2400,'8204 Arthur St',NULL,'London',NULL,'UK'),(2500,'Magdalen Centre, The Oxford Science Park','OX9 9ZB','Oxford','Oxford','UK'),(2600,'9702 Chester Road','09629850293','Stretford','Manchester','UK'),(2700,'Schwanthalerstr. 7031','80925','Munich','Bavaria','DE'),(2800,'Rua Frei Caneca 1360 ','01307-002','Sao Paulo','Sao Paulo','BR'),(2900,'20 Rue des Corps-Saints','1730','Geneva','Geneve','CH'),(3000,'Murtenstrasse 921','3095','Bern','BE','CH'),(3100,'Pieter Breughelstraat 837','3029SK','Utrecht','Utrecht','NL'),(3200,'Mariano Escobedo 9991','11932','Mexico City','Distrito Federal,','MX'); + +/*Table structure for table `order` */ + +DROP TABLE IF EXISTS `order`; + +CREATE TABLE `order` ( + `order_id` int(11) DEFAULT NULL, + `order_name` varchar(15) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `order` */ + +insert into `order`(`order_id`,`order_name`) values (1,'shkstart'),(2,'tomcat'),(3,'dubbo'); + +/*Table structure for table `regions` */ + +DROP TABLE IF EXISTS `regions`; + +CREATE TABLE `regions` ( + `region_id` int(11) NOT NULL, + `region_name` varchar(25) DEFAULT NULL, + PRIMARY KEY (`region_id`), + UNIQUE KEY `reg_id_pk` (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `regions` */ + +insert into `regions`(`region_id`,`region_name`) values (1,'Europe'),(2,'Americas'),(3,'Asia'),(4,'Middle East and Africa'); + +/*Table structure for table `emp_details_view` */ + +DROP TABLE IF EXISTS `emp_details_view`; + +/*!50001 DROP VIEW IF EXISTS `emp_details_view` */; +/*!50001 DROP TABLE IF EXISTS `emp_details_view` */; + +/*!50001 CREATE TABLE `emp_details_view`( + `employee_id` int(6) , + `job_id` varchar(10) , + `manager_id` int(6) , + `department_id` int(4) , + `location_id` int(4) , + `country_id` char(2) , + `first_name` varchar(20) , + `last_name` varchar(25) , + `salary` double(8,2) , + `commission_pct` double(2,2) , + `department_name` varchar(30) , + `job_title` varchar(35) , + `city` varchar(30) , + `state_province` varchar(25) , + `country_name` varchar(40) , + `region_name` varchar(25) +)*/; + +/*View structure for view emp_details_view */ + +/*!50001 DROP TABLE IF EXISTS `emp_details_view` */; +/*!50001 DROP VIEW IF EXISTS `emp_details_view` */; + +/*!50001 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `emp_details_view` AS select `e`.`employee_id` AS `employee_id`,`e`.`job_id` AS `job_id`,`e`.`manager_id` AS `manager_id`,`e`.`department_id` AS `department_id`,`d`.`location_id` AS `location_id`,`l`.`country_id` AS `country_id`,`e`.`first_name` AS `first_name`,`e`.`last_name` AS `last_name`,`e`.`salary` AS `salary`,`e`.`commission_pct` AS `commission_pct`,`d`.`department_name` AS `department_name`,`j`.`job_title` AS `job_title`,`l`.`city` AS `city`,`l`.`state_province` AS `state_province`,`c`.`country_name` AS `country_name`,`r`.`region_name` AS `region_name` from (((((`employees` `e` join `departments` `d`) join `jobs` `j`) join `locations` `l`) join `countries` `c`) join `regions` `r`) where ((`e`.`department_id` = `d`.`department_id`) and (`d`.`location_id` = `l`.`location_id`) and (`l`.`country_id` = `c`.`country_id`) and (`c`.`region_id` = `r`.`region_id`) and (`j`.`job_id` = `e`.`job_id`)) */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + + +-- 缁冧範锛屽畾涔変笉鍚屽弬鏁扮殑瀛樺偍杩囩▼锛? +-- 路1銆傛牴鎹憳宸ョ紪鍙凤紝鏌ヨ瀵瑰簲鐨勫憳宸ヤ俊鎭? + +delimiter // +create procedure p1(in myid int) +begin +select * from employees where employee_id =myid; +end // + +call p1(100); + +-- 2 鏍规嵁鍛樺伐缂栧彿锛屾煡璇㈠搴旂殑鍛樺伐淇℃伅鍜岄儴闂ㄤ俊鎭? +delimiter // +create procedure p2(in myid int) +begin +select * from employees e left join departments d on e.department_id=d.department_id where employee_id=myid; +end // + +call p2(100); + +-- 3 瀹氫箟涓€涓瓨鍌ㄨ繃绋?锛岃緭鍏ュ憳宸ョ紪鍙枫€傝緭鍑哄憳宸ョ殑鍏ヨ亴鏃ユ湡 +delimiter // +create procedure p3(in myid int,out edate date) +begin +select hire_date into edate from employees where employee_id=myid; +end // + +call p3(101,@edate); +select @edate; +-- 4 瀹氫箟涓€涓瓨鍌ㄧ浜嬶紝瀹炵幇浠ヤ笅鍔熻兘锛? +-- 灏嗘寚瀹氭潯浠剁殑job_id鏀规垚鏂颁竴job_id -- > ad_vp ,ad_vip + +delimiter // +create procedure p4(in myid varchar(10)) +begin +update employees set salary=salary*2 where job_id=myid; +select * from employees; +end // + +call p4('AD_VP'); +``` + +## 作业2 + +```mysql +create database work13 charset utf8; +use work13; + +# 0. 准备工作 + + create table student( + id int primary key auto_increment, + name varchar(15) not null, + phone varchar(15) unique, + birth date + ); + + insert into student(name,phone,birth) + values + ('朱茵','13201233453','1982-02-12'), + ('孙燕姿','13501233653','1980-12-09'), + ('田馥甄','13651238755','1983-08-21'), + ('邓紫棋','17843283452','1991-11-12'), + ('刘若英','18635575464','1989-05-18'), + ('杨超越','13761238755','1994-05-11'); + + +# 1. --------------第一题----------------------- + +# 创建存储过程add_student(),实现传入姓名和手机号和生日,插入到 student 表中 +delimiter // +create procedure add_student() +begin + + insert into student(name,phone,birth) + values + ('朱茵','13201233453','1982-02-12'), + ('孙燕姿','13501233653','1980-12-09'), + ('田馥甄','13651238755','1983-08-21'), + ('邓紫棋','17843283452','1991-11-12'), + ('刘若英','18635575464','1989-05-18'), + ('杨超越','13761238755','1994-05-11'); + +end // + + + +# 调用 +call add_student(); + +# 查看数据是否成功插入 +select * from student; + + + +# 2.--------------第二题----------------------- + + +# 创建存储过程get_tel(),实现传入学生编号,返回学生姓名和学生电话 +delimiter // +create procedure get_tel(in myid int,out myname varchar(5),out tel varchar(15)) +begin +select name into myname from student where id =myid; +select phone into tel from student where id =myid; +end // + + +# 调用 + +call get_tel(1,@myname,@tel); +select @myname,@tel; + + + +# 3.--------------第三题----------------------- + +# 创建存储过程birthday_battle(),实现传入两个学生编号,返回生日日期间隔大小(天数) + +delimiter // +create procedure birthday_battle(in id1 int,in id2 int,out mydate int) +begin +select datediff((select birth from student where id=id1),(select birth from student where id=id2)) into mydate; +end // +#调用 +call birthday_battle(1,2,@mydate); +select @mydate; + +# 4.--------------第四题----------------------- + +# 创建存储过程studen_limit(),根据传入的起始索引和条目数,查询学生表的记录 +delimiter // +create procedure studen_limit(in be int,in en int) +begin +select * from student limit be,en; +end // +# 调用 +call studen_limit(1,2); + + + +# 5.--------------第五题----------------------- + +# 使用inout模式参数创建存储过程get_double(),要求 传入a和b两个值,最终a和b都翻倍并返回 +delimiter // +create procedure get_double(inout a int,inout b int) +BEGIN +set a=a*2,b=b*2; +end // + +# 调用 +set @a=1,@b=2; +call get_double(@a,@b); +select @a,@b; + + +# 6. 删除第四题的存储过程 +drop procedure studen_limit; + + +# 7. 查看第五题中存储过程的信息 +show create procedure get_double; +``` \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251/20231009.md" "b/05 \350\260\242\351\223\226\346\265\251/20231009.md" new file mode 100644 index 0000000000000000000000000000000000000000..f9bd986bd26eff66687771c1179feecf77da209c --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251/20231009.md" @@ -0,0 +1,292 @@ +### 分支结构之 IF + +- IF 语句的语法结构是: + +``` +IF 表达式1 THEN 操作1 sql语句 +[ELSEIF 表达式2 THEN 操作2]…… +[ELSE 操作N] +END IF +``` + +根据表达式的结果为TRUE或FALSE执行相应的语句。这里“[]”中的内容是可选的。 + +- 特点:① 不同的表达式对应不同的操作 ② 使用在begin end中 +- 举例1: + +``` +IF val IS NULL + THEN SELECT 'val is null'; +ELSE SELECT 'val is not null'; +END IF; +``` + +- 举例2:声明存储过程“update_salary_by_eid1”,定义IN参数emp_id,输入员工编号。判断该员工薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。 + +``` +DELIMITER // +CREATE PROCEDURE update_salary_by_eid1(IN emp_id INT) +BEGIN + DECLARE emp_salary DOUBLE; + DECLARE hire_year DOUBLE; + SELECT salary INTO emp_salary FROM employees WHERE employee_id = emp_id; + SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year + FROM employees WHERE employee_id = emp_id; + IF emp_salary < 8000 AND hire_year > 5 + THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id; + END IF; +END // +DELIMITER ; +``` + +### 2) 分支结构之 CASE + +- CASE 语句的语法结构1: + +``` +#情况一:类似于switch +CASE 表达式 +WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号) +WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号) +... +ELSE 结果n或语句n(如果是语句,需要加分号) +END [case](如果是放在begin end中需要加上case,如果放在select后面不需要) +``` + +- CASE 语句的语法结构2: + +``` +#情况二:类似于多重if +CASE +WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号) +WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号) +... +ELSE 结果n或语句n(如果是语句,需要加分号) +END [case](如果是放在begin end中需要加上case,如果放在select后面不需要) +``` + +- 举例1:使用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; +``` + +- 举例2:声明存储过程“update_salary_by_eid4”,定义IN参数emp_id,输入员工编号。判断该员工 薪资如果低于9000元,就更新薪资为9000元;薪资大于等于9000元且低于10000的,但是奖金比例 为NULL的,就更新奖金比例为0.01;其他的涨薪100元。 + +``` +DELIMITER // +CREATE PROCEDURE update_salary_by_eid4(IN emp_id INT) +BEGIN + DECLARE emp_sal DOUBLE; + DECLARE bonus DECIMAL(3,2); + SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id; + SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id; + CASE + WHEN emp_sal<9000 + THEN UPDATE employees SET salary=9000 WHERE employee_id = emp_id; + WHEN emp_sal<10000 AND bonus IS NULL + THEN UPDATE employees SET commission_pct=0.01 WHERE employee_id = emp_id; + ELSE + UPDATE employees SET salary=salary+100 WHERE employee_id = emp_id; + END CASE; +END // +DELIMITER ; +``` + +- 举例3:声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。判断该员工的 入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年, 薪资涨300;如果是4年,薪资涨400;其他的涨薪500。 + +``` +DELIMITER // +CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT) +BEGIN + DECLARE emp_sal DOUBLE; + DECLARE hire_year DOUBLE; + SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id; + SELECT ROUND(DATEDIFF(CURDATE(),hire_date)/365) INTO hire_year FROM employees + WHERE employee_id = emp_id; + CASE hire_year + WHEN 0 THEN UPDATE employees SET salary=salary+50 WHERE employee_id = emp_id; + WHEN 1 THEN UPDATE employees SET salary=salary+100 WHERE employee_id = emp_id; + WHEN 2 THEN UPDATE employees SET salary=salary+200 WHERE employee_id = emp_id; + WHEN 3 THEN UPDATE employees SET salary=salary+300 WHERE employee_id = emp_id; + WHEN 4 THEN UPDATE employees SET salary=salary+400 WHERE employee_id = emp_id; + ELSE UPDATE employees SET salary=salary+500 WHERE employee_id = emp_id; + END CASE; +END // +DELIMITER ; +``` + +### 3) 循环结构之LOOP + +LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子 句),跳出循环过程。 + +LOOP语句的基本格式如下: + +``` +[loop_label:] LOOP +循环执行的语句 +END LOOP [loop_label] +``` + +其中,loop_label表示LOOP语句的标注名称,该参数可以省略。 + +举例1:使用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; +``` + +举例2:当市场环境变好时,公司为了奖励大家,决定给大家涨工资。声明存储过程 “update_salary_loop()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家涨薪,薪资涨为 原来的1.1倍。直到全公司的平均薪资达到12000结束。并统计循环次数。 + +``` +DELIMITER // +CREATE PROCEDURE update_salary_loop(OUT num INT) +BEGIN + DECLARE avg_salary DOUBLE; + DECLARE loop_count INT DEFAULT 0; + SELECT AVG(salary) INTO avg_salary FROM employees; + label_loop:LOOP + IF avg_salary >= 12000 THEN LEAVE label_loop; + END IF; + UPDATE employees SET salary = salary * 1.1; + SET loop_count = loop_count + 1; + SELECT AVG(salary) INTO avg_salary FROM employees; + END LOOP label_loop; + SET num = loop_count; +END // +DELIMITER ; +``` + +### 4) 循环结构之WHILE + +WHILE语句创建一个带条件判断的循环过程。WHILE在执行语句执行时,先对指定的表达式进行判断,如 果为真,就执行循环内的语句,否则退出循环。WHILE语句的基本格式如下: + +``` +[while_label:] WHILE 循环条件 DO +循环体 +END WHILE [while_label]; +``` + +while_label为WHILE语句的标注名称;如果循环条件结果为真,WHILE语句内的语句或语句群被执行,直 至循环条件为假,退出循环。 + +- 举例1:WHILE语句示例,i值小于10时,将重复执行循环过程,代码如下: + +``` +DELIMITER // +CREATE PROCEDURE test_while() +BEGIN + DECLARE i INT DEFAULT 0; + WHILE i < 10 DO + SET i = i + 1; + END WHILE; + SELECT i; +END // +DELIMITER ; +#调用 +CALL test_while(); +``` + +- 举例2:市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程 “update_salary_while()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家降薪,薪资降 为原来的90%。直到全公司的平均薪资达到5000结束。并统计循环次数。 + +``` +DELIMITER // +CREATE PROCEDURE update_salary_while(OUT num INT) +BEGIN + DECLARE avg_sal DOUBLE ; + DECLARE while_count INT DEFAULT 0; + SELECT AVG(salary) INTO avg_sal FROM employees; + WHILE avg_sal > 5000 DO + UPDATE employees SET salary = salary * 0.9; + SET while_count = while_count + 1; + SELECT AVG(salary) INTO avg_sal FROM employees; + END WHILE; + SET num = while_count; +END // +DELIMITER ; +``` + +### ## 作业 + +```mysql +create database work17 charset utf8; +use work17; + + + create table student( + id int primary key auto_increment, + name varchar(15) not null, + phone varchar(15) unique, + birth date, + salary int + ); + + insert into student(name,phone,birth,salary) + values + ('朱茵','13201233453','1982-02-12',4500), + ('孙燕姿','13501233653','1980-12-09',48796), + ('田馥甄','13651238755','1983-08-21',4561), + ('邓紫棋','17843283452','1991-11-12',45500), + ('刘若英','18635575464','1989-05-18',12000), + ('杨超越','13761238755','1994-05-11',2000); + + + + +-#1. 创建函数test_if_case(),实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D +#要求:分别使用if结构和case结构实现 + +#方式1:if +delimiter // +create procedure test_if_case(in score double(4,1)) +begin +if score>90 then select 'A'; +elseif score >80 then select 'B'; +elseif score >60 then select 'C'; +else select 'D'; +end if ; +end // +delimiter ; + +call test_if_case(90); + + +#方式2:case when ... +delimiter // +create procedure test_if_case2(in s2 double(4,1)) +begin +case when s2>90 then select 'A'; +when s2>80 then select 'B'; +when s2>60 then select 'C'; +else select 'D'; +end case; +end // +delimiter ; + +call test_if_case2(67); + + +#2. 创建存储过程test_if_pro(),传入工资值,如果工资值<3000,则删除工资为此值的员工, +# 如果3000 <= 工资值 <= 5000,则修改此工资值的员工薪资涨1000,否则涨工资500 + +delimiter // +create procedure test_if_pro(in snum int) +begin +if snum<3000 then delete from student where salary=snum; +elseif 3000<=snum<=5000 then update student set salary=snum+1000; +elseif 3000>snum or snum>5000 then update student set salary=snum+500; +end if; +end // +delimiter ; +call test_if_pro(4561); +select * from student; +drop procedure test_if_pro; +``` \ No newline at end of file