- 以下是测试使用的数据库表,请使用sql自动构建
/*
SQLyog Ultimate v10.00 Beta1
MySQL - 5.5.15 : Database - myemployees
*********************************************************************
*/
/*!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*/`myemployees` /*!40100 DEFAULT CHARACTER SET gb2312 */;
USE `myemployees`;
/*Table structure for table `departments` */
DROP TABLE IF EXISTS `departments`;
CREATE TABLE `departments` (
`department_id` int(4) NOT NULL AUTO_INCREMENT,
`department_name` varchar(3) DEFAULT NULL,
`manager_id` int(6) DEFAULT NULL,
`location_id` int(4) DEFAULT NULL,
PRIMARY KEY (`department_id`),
KEY `loc_id_fk` (`location_id`),
CONSTRAINT `loc_id_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`)
) ENGINE=InnoDB AUTO_INCREMENT=271 DEFAULT CHARSET=gb2312;
/*Data for the table `departments` */
insert into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Adm',200,1700),(20,'Mar',201,1800),(30,'Pur',114,1700),(40,'Hum',203,2400),(50,'Shi',121,1500),(60,'IT',103,1400),(70,'Pub',204,2700),(80,'Sal',145,2500),(90,'Exe',100,1700),(100,'Fin',108,1700),(110,'Acc',205,1700),(120,'Tre',NULL,1700),(130,'Cor',NULL,1700),(140,'Con',NULL,1700),(150,'Sha',NULL,1700),(160,'Ben',NULL,1700),(170,'Man',NULL,1700),(180,'Con',NULL,1700),(190,'Con',NULL,1700),(200,'Ope',NULL,1700),(210,'IT ',NULL,1700),(220,'NOC',NULL,1700),(230,'IT ',NULL,1700),(240,'Gov',NULL,1700),(250,'Ret',NULL,1700),(260,'Rec',NULL,1700),(270,'Pay',NULL,1700);
/*Table structure for table `employees` */
DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
`employee_id` int(6) NOT NULL AUTO_INCREMENT,
`first_name` varchar(20) DEFAULT NULL,
`last_name` varchar(25) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
`phone_number` varchar(20) DEFAULT NULL,
`job_id` varchar(10) DEFAULT NULL,
`salary` double(10,2) DEFAULT NULL,
`commission_pct` double(4,2) DEFAULT NULL,
`manager_id` int(6) DEFAULT NULL,
`department_id` int(4) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
PRIMARY KEY (`employee_id`),
KEY `dept_id_fk` (`department_id`),
KEY `job_id_fk` (`job_id`),
CONSTRAINT `dept_id_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
CONSTRAINT `job_id_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=gb2312;
/*Data for the table `employees` */
insert into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`) values (100,'Steven','K_ing','SKING','515.123.4567','AD_PRES',24000.00,NULL,NULL,90,'1992-04-03 00:00:00'),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),(102,'Lex','De Haan','LDEHAAN','515.123.4569','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),(103,'Alexander','Hunold','AHUNOLD','590.423.4567','IT_PROG',9000.00,NULL,102,60,'1992-04-03 00:00:00'),(104,'Bruce','Ernst','BERNST','590.423.4568','IT_PROG',6000.00,NULL,103,60,'1992-04-03 00:00:00'),(105,'David','Austin','DAUSTIN','590.423.4569','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00'),(106,'Valli','Pataballa','VPATABAL','590.423.4560','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00'),(107,'Diana','Lorentz','DLORENTZ','590.423.5567','IT_PROG',4200.00,NULL,103,60,'1998-03-03 00:00:00'),(108,'Nancy','Greenberg','NGREENBE','515.124.4569','FI_MGR',12000.00,NULL,101,100,'1998-03-03 00:00:00'),(109,'Daniel','Faviet','DFAVIET','515.124.4169','FI_ACCOUNT',9000.00,NULL,108,100,'1998-03-03 00:00:00'),(110,'John','Chen','JCHEN','515.124.4269','FI_ACCOUNT',8200.00,NULL,108,100,'2000-09-09 00:00:00'),(111,'Ismael','Sciarra','ISCIARRA','515.124.4369','FI_ACCOUNT',7700.00,NULL,108,100,'2000-09-09 00:00:00'),(112,'Jose Manuel','Urman','JMURMAN','515.124.4469','FI_ACCOUNT',7800.00,NULL,108,100,'2000-09-09 00:00:00'),(113,'Luis','Popp','LPOPP','515.124.4567','FI_ACCOUNT',6900.00,NULL,108,100,'2000-09-09 00:00:00'),(114,'Den','Raphaely','DRAPHEAL','515.127.4561','PU_MAN',11000.00,NULL,100,30,'2000-09-09 00:00:00'),(115,'Alexander','Khoo','AKHOO','515.127.4562','PU_CLERK',3100.00,NULL,114,30,'2000-09-09 00:00:00'),(116,'Shelli','Baida','SBAIDA','515.127.4563','PU_CLERK',2900.00,NULL,114,30,'2000-09-09 00:00:00'),(117,'Sigal','Tobias','STOBIAS','515.127.4564','PU_CLERK',2800.00,NULL,114,30,'2000-09-09 00:00:00'),(118,'Guy','Himuro','GHIMURO','515.127.4565','PU_CLERK',2600.00,NULL,114,30,'2000-09-09 00:00:00'),(119,'Karen','Colmenares','KCOLMENA','515.127.4566','PU_CLERK',2500.00,NULL,114,30,'2000-09-09 00:00:00'),(120,'Matthew','Weiss','MWEISS','650.123.1234','ST_MAN',8000.00,NULL,100,50,'2004-02-06 00:00:00'),(121,'Adam','Fripp','AFRIPP','650.123.2234','ST_MAN',8200.00,NULL,100,50,'2004-02-06 00:00:00'),(122,'Payam','Kaufling','PKAUFLIN','650.123.3234','ST_MAN',7900.00,NULL,100,50,'2004-02-06 00:00:00'),(123,'Shanta','Vollman','SVOLLMAN','650.123.4234','ST_MAN',6500.00,NULL,100,50,'2004-02-06 00:00:00'),(124,'Kevin','Mourgos','KMOURGOS','650.123.5234','ST_MAN',5800.00,NULL,100,50,'2004-02-06 00:00:00'),(125,'Julia','Nayer','JNAYER','650.124.1214','ST_CLERK',3200.00,NULL,120,50,'2004-02-06 00:00:00'),(126,'Irene','Mikkilineni','IMIKKILI','650.124.1224','ST_CLERK',2700.00,NULL,120,50,'2004-02-06 00:00:00'),(127,'James','Landry','JLANDRY','650.124.1334','ST_CLERK',2400.00,NULL,120,50,'2004-02-06 00:00:00'),(128,'Steven','Markle','SMARKLE','650.124.1434','ST_CLERK',2200.00,NULL,120,50,'2004-02-06 00:00:00'),(129,'Laura','Bissot','LBISSOT','650.124.5234','ST_CLERK',3300.00,NULL,121,50,'2004-02-06 00:00:00'),(130,'Mozhe','Atkinson','MATKINSO','650.124.6234','ST_CLERK',2800.00,NULL,121,50,'2004-02-06 00:00:00'),(131,'James','Marlow','JAMRLOW','650.124.7234','ST_CLERK',2500.00,NULL,121,50,'2004-02-06 00:00:00'),(132,'TJ','Olson','TJOLSON','650.124.8234','ST_CLERK',2100.00,NULL,121,50,'2004-02-06 00:00:00'),(133,'Jason','Mallin','JMALLIN','650.127.1934','ST_CLERK',3300.00,NULL,122,50,'2004-02-06 00:00:00'),(134,'Michael','Rogers','MROGERS','650.127.1834','ST_CLERK',2900.00,NULL,122,50,'2002-12-23 00:00:00'),(135,'Ki','Gee','KGEE','650.127.1734','ST_CLERK',2400.00,NULL,122,50,'2002-12-23 00:00:00'),(136,'Hazel','Philtanker','HPHILTAN','650.127.1634','ST_CLERK',2200.00,NULL,122,50,'2002-12-23 00:00:00'),(137,'Renske','Ladwig','RLADWIG','650.121.1234','ST_CLERK',3600.00,NULL,123,50,'2002-12-23 00:00:00'),(138,'Stephen','Stiles','SSTILES','650.121.2034','ST_CLERK',3200.00,NULL,123,50,'2002-12-23 00:00:00'),(139,'John','Seo','JSEO','650.121.2019','ST_CLERK',2700.00,NULL,123,50,'2002-12-23 00:00:00'),(140,'Joshua','Patel','JPATEL','650.121.1834','ST_CLERK',2500.00,NULL,123,50,'2002-12-23 00:00:00'),(141,'Trenna','Rajs','TRAJS','650.121.8009','ST_CLERK',3500.00,NULL,124,50,'2002-12-23 00:00:00'),(142,'Curtis','Davies','CDAVIES','650.121.2994','ST_CLERK',3100.00,NULL,124,50,'2002-12-23 00:00:00'),(143,'Randall','Matos','RMATOS','650.121.2874','ST_CLERK',2600.00,NULL,124,50,'2002-12-23 00:00:00'),(144,'Peter','Vargas','PVARGAS','650.121.2004','ST_CLERK',2500.00,NULL,124,50,'2002-12-23 00:00:00'),(145,'John','Russell','JRUSSEL','011.44.1344.429268','SA_MAN',14000.00,0.40,100,80,'2002-12-23 00:00:00'),(146,'Karen','Partners','KPARTNER','011.44.1344.467268','SA_MAN',13500.00,0.30,100,80,'2002-12-23 00:00:00'),(147,'Alberto','Errazuriz','AERRAZUR','011.44.1344.429278','SA_MAN',12000.00,0.30,100,80,'2002-12-23 00:00:00'),(148,'Gerald','Cambrault','GCAMBRAU','011.44.1344.619268','SA_MAN',11000.00,0.30,100,80,'2002-12-23 00:00:00'),(149,'Eleni','Zlotkey','EZLOTKEY','011.44.1344.429018','SA_MAN',10500.00,0.20,100,80,'2002-12-23 00:00:00'),(150,'Peter','Tucker','PTUCKER','011.44.1344.129268','SA_REP',10000.00,0.30,145,80,'2014-03-05 00:00:00'),(151,'David','Bernstein','DBERNSTE','011.44.1344.345268','SA_REP',9500.00,0.25,145,80,'2014-03-05 00:00:00'),(152,'Peter','Hall','PHALL','011.44.1344.478968','SA_REP',9000.00,0.25,145,80,'2014-03-05 00:00:00'),(153,'Christopher','Olsen','COLSEN','011.44.1344.498718','SA_REP',8000.00,0.20,145,80,'2014-03-05 00:00:00'),(154,'Nanette','Cambrault','NCAMBRAU','011.44.1344.987668','SA_REP',7500.00,0.20,145,80,'2014-03-05 00:00:00'),(155,'Oliver','Tuvault','OTUVAULT','011.44.1344.486508','SA_REP',7000.00,0.15,145,80,'2014-03-05 00:00:00'),(156,'Janette','K_ing','JKING','011.44.1345.429268','SA_REP',10000.00,0.35,146,80,'2014-03-05 00:00:00'),(157,'Patrick','Sully','PSULLY','011.44.1345.929268','SA_REP',9500.00,0.35,146,80,'2014-03-05 00:00:00'),(158,'Allan','McEwen','AMCEWEN','011.44.1345.829268','SA_REP',9000.00,0.35,146,80,'2014-03-05 00:00:00'),(159,'Lindsey','Smith','LSMITH','011.44.1345.729268','SA_REP',8000.00,0.30,146,80,'2014-03-05 00:00:00'),(160,'Louise','Doran','LDORAN','011.44.1345.629268','SA_REP',7500.00,0.30,146,80,'2014-03-05 00:00:00'),(161,'Sarath','Sewall','SSEWALL','011.44.1345.529268','SA_REP',7000.00,0.25,146,80,'2014-03-05 00:00:00'),(162,'Clara','Vishney','CVISHNEY','011.44.1346.129268','SA_REP',10500.00,0.25,147,80,'2014-03-05 00:00:00'),(163,'Danielle','Greene','DGREENE','011.44.1346.229268','SA_REP',9500.00,0.15,147,80,'2014-03-05 00:00:00'),(164,'Mattea','Marvins','MMARVINS','011.44.1346.329268','SA_REP',7200.00,0.10,147,80,'2014-03-05 00:00:00'),(165,'David','Lee','DLEE','011.44.1346.529268','SA_REP',6800.00,0.10,147,80,'2014-03-05 00:00:00'),(166,'Sundar','Ande','SANDE','011.44.1346.629268','SA_REP',6400.00,0.10,147,80,'2014-03-05 00:00:00'),(167,'Amit','Banda','ABANDA','011.44.1346.729268','SA_REP',6200.00,0.10,147,80,'2014-03-05 00:00:00'),(168,'Lisa','Ozer','LOZER','011.44.1343.929268','SA_REP',11500.00,0.25,148,80,'2014-03-05 00:00:00'),(169,'Harrison','Bloom','HBLOOM','011.44.1343.829268','SA_REP',10000.00,0.20,148,80,'2014-03-05 00:00:00'),(170,'Tayler','Fox','TFOX','011.44.1343.729268','SA_REP',9600.00,0.20,148,80,'2014-03-05 00:00:00'),(171,'William','Smith','WSMITH','011.44.1343.629268','SA_REP',7400.00,0.15,148,80,'2014-03-05 00:00:00'),(172,'Elizabeth','Bates','EBATES','011.44.1343.529268','SA_REP',7300.00,0.15,148,80,'2014-03-05 00:00:00'),(173,'Sundita','Kumar','SKUMAR','011.44.1343.329268','SA_REP',6100.00,0.10,148,80,'2014-03-05 00:00:00'),(174,'Ellen','Abel','EABEL','011.44.1644.429267','SA_REP',11000.00,0.30,149,80,'2014-03-05 00:00:00'),(175,'Alyssa','Hutton','AHUTTON','011.44.1644.429266','SA_REP',8800.00,0.25,149,80,'2014-03-05 00:00:00'),(176,'Jonathon','Taylor','JTAYLOR','011.44.1644.429265','SA_REP',8600.00,0.20,149,80,'2014-03-05 00:00:00'),(177,'Jack','Livingston','JLIVINGS','011.44.1644.429264','SA_REP',8400.00,0.20,149,80,'2014-03-05 00:00:00'),(178,'Kimberely','Grant','KGRANT','011.44.1644.429263','SA_REP',7000.00,0.15,149,NULL,'2014-03-05 00:00:00'),(179,'Charles','Johnson','CJOHNSON','011.44.1644.429262','SA_REP',6200.00,0.10,149,80,'2014-03-05 00:00:00'),(180,'Winston','Taylor','WTAYLOR','650.507.9876','SH_CLERK',3200.00,NULL,120,50,'2014-03-05 00:00:00'),(181,'Jean','Fleaur','JFLEAUR','650.507.9877','SH_CLERK',3100.00,NULL,120,50,'2014-03-05 00:00:00'),(182,'Martha','Sullivan','MSULLIVA','650.507.9878','SH_CLERK',2500.00,NULL,120,50,'2014-03-05 00:00:00'),(183,'Girard','Geoni','GGEONI','650.507.9879','SH_CLERK',2800.00,NULL,120,50,'2014-03-05 00:00:00'),(184,'Nandita','Sarchand','NSARCHAN','650.509.1876','SH_CLERK',4200.00,NULL,121,50,'2014-03-05 00:00:00'),(185,'Alexis','Bull','ABULL','650.509.2876','SH_CLERK',4100.00,NULL,121,50,'2014-03-05 00:00:00'),(186,'Julia','Dellinger','JDELLING','650.509.3876','SH_CLERK',3400.00,NULL,121,50,'2014-03-05 00:00:00'),(187,'Anthony','Cabrio','ACABRIO','650.509.4876','SH_CLERK',3000.00,NULL,121,50,'2014-03-05 00:00:00'),(188,'Kelly','Chung','KCHUNG','650.505.1876','SH_CLERK',3800.00,NULL,122,50,'2014-03-05 00:00:00'),(189,'Jennifer','Dilly','JDILLY','650.505.2876','SH_CLERK',3600.00,NULL,122,50,'2014-03-05 00:00:00'),(190,'Timothy','Gates','TGATES','650.505.3876','SH_CLERK',2900.00,NULL,122,50,'2014-03-05 00:00:00'),(191,'Randall','Perkins','RPERKINS','650.505.4876','SH_CLERK',2500.00,NULL,122,50,'2014-03-05 00:00:00'),(192,'Sarah','Bell','SBELL','650.501.1876','SH_CLERK',4000.00,NULL,123,50,'2014-03-05 00:00:00'),(193,'Britney','Everett','BEVERETT','650.501.2876','SH_CLERK',3900.00,NULL,123,50,'2014-03-05 00:00:00'),(194,'Samuel','McCain','SMCCAIN','650.501.3876','SH_CLERK',3200.00,NULL,123,50,'2014-03-05 00:00:00'),(195,'Vance','Jones','VJONES','650.501.4876','SH_CLERK',2800.00,NULL,123,50,'2014-03-05 00:00:00'),(196,'Alana','Walsh','AWALSH','650.507.9811','SH_CLERK',3100.00,NULL,124,50,'2014-03-05 00:00:00'),(197,'Kevin','Feeney','KFEENEY','650.507.9822','SH_CLERK',3000.00,NULL,124,50,'2014-03-05 00:00:00'),(198,'Donald','OConnell','DOCONNEL','650.507.9833','SH_CLERK',2600.00,NULL,124,50,'2014-03-05 00:00:00'),(199,'Douglas','Grant','DGRANT','650.507.9844','SH_CLERK',2600.00,NULL,124,50,'2014-03-05 00:00:00'),(200,'Jennifer','Whalen','JWHALEN','515.123.4444','AD_ASST',4400.00,NULL,101,10,'2016-03-03 00:00:00'),(201,'Michael','Hartstein','MHARTSTE','515.123.5555','MK_MAN',13000.00,NULL,100,20,'2016-03-03 00:00:00'),(202,'Pat','Fay','PFAY','603.123.6666','MK_REP',6000.00,NULL,201,20,'2016-03-03 00:00:00'),(203,'Susan','Mavris','SMAVRIS','515.123.7777','HR_REP',6500.00,NULL,101,40,'2016-03-03 00:00:00'),(204,'Hermann','Baer','HBAER','515.123.8888','PR_REP',10000.00,NULL,101,70,'2016-03-03 00:00:00'),(205,'Shelley','Higgins','SHIGGINS','515.123.8080','AC_MGR',12000.00,NULL,101,110,'2016-03-03 00:00:00'),(206,'William','Gietz','WGIETZ','515.123.8181','AC_ACCOUNT',8300.00,NULL,205,110,'2016-03-03 00:00:00');
/*Table structure for table `jobs` */
DROP TABLE IF EXISTS `jobs`;
CREATE TABLE `jobs` (
`job_id` varchar(10) NOT NULL,
`job_title` varchar(35) DEFAULT NULL,
`min_salary` int(6) DEFAULT NULL,
`max_salary` int(6) DEFAULT NULL,
PRIMARY KEY (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
/*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(11) NOT NULL AUTO_INCREMENT,
`street_address` varchar(40) DEFAULT NULL,
`postal_code` varchar(12) DEFAULT NULL,
`city` varchar(30) DEFAULT NULL,
`state_province` varchar(25) DEFAULT NULL,
`country_id` varchar(2) DEFAULT NULL,
PRIMARY KEY (`location_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3201 DEFAULT CHARSET=gb2312;
/*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');
/*!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 */;
文章目录
一、查询
本文章所有语句都可以放在查询中执行,结果请自己观察,我这里就不将结果展示出来了
查询总语法:
select 字段列表 #7
from 表名 #1
[连接类型 join 表名 #2
on 连接条件 #3
where 筛选条件 #4
group by 分组字段 #5
having 分组条件 #6
order by 排序字段 desc|asc] #8
limit [起始索引(从0开始,默认为0,可省略),]总记录数; #9
后面序号表示执行顺序
1、基础查询
use myemployees; # 表示此查询,使用的数据库是myemployees,当声明此语句时,它下面的sql语句都将针对myemployees数据库生效
desc employees; #显示指定表的结构
语法:select 查询列表 from 表名;
/*==================================================================================================================*/
查询列表:表中字段,常量值,表达式,函数
表名:要查询的表名
/*==================================================================================================================*/
# 查询employees表中所有的数据
select * from employees;
#查询employees表中所有数据,但只获取employees_id字段的数据
select employee_id from employees;
#查询表中所有数据,但只获取employee_id和first_name两个字段的数据
select employee_id,first_name from employees;
# 查询常量值
select 100;
select '字符串常量';
# 查询表达式
select 50*50;
# 函数
select count(.....); # 函数都是用 函数名(参数表)形式存在的
/*==================================================================================================================*/
使用 as 关键字起别名
有助于用户理解每个字段的意思
当执行多表查询(同时查询多个表的数据)时,可能出现字段名重复的问题,这时起别名可以进行区分。
/*==================================================================================================================*/
select 50*50 as 相乘结果;
select employee_id as 号码,first_name as 名 from employees;
# 起别名时,万一别名中有特殊符号或者关键字,可以使用双引号“”将别名括起来
select 50*50 as "out put";
select 50*50 "out put";# as关键字可省略,但这样失去了可读性
/*==================================================================================================================*/
去重:使用distinct关键字修饰的字段,将不显示多余的重复数据,重复数据只显示一次(只保留一条,多余重复的隐藏)
/*==================================================================================================================*/
select distinct department_id from employees;
/*==================================================================================================================*/
补充两个常用函数
concat(字符1,字符2,...) 拼接字符
ifnull(可能为null的字段,如果是null就换为指定字符) :监听可能为null的字段,如果值为null,则换为指定值
/*==================================================================================================================*/
# 查询每位员工的月工资和奖金
select concat("月工资为",salary,"奖金为",salary*12*ifnull(commission_pct,0)) as "月工资和奖金" from employees;
查询结果(随便复制了两条):
月工资为24000.00奖金为0.00
月工资为14000.00奖金为67200.00
解释: concat用于拼接内容,不同内容用,分隔
ifnull用于监听commission_pct,如果是null,就将其换成0进行运算
2、条件查询
语法: select
查询列表
from
表名
where
条件;
/*==================================================================================================================*/
条件:
1、逻辑运算符
>(大于) <(小于) >=(大于等于) <=(小于等于) =(等于) <>(不等于)
例:where score>50; 表示成绩大于50的数据
2、逻辑表达式
与:&&、and
或:||、or
非:!、not
推荐使用 and or not,与编程语言做区分(java等),Python用的也是英文,根据情况抉择
3、模糊查询
like 用于匹配字符串,类似正则表达式,比如 % 表示任意个字符
转义字符:用符号\修饰的字符
'__':想要匹配任意两个字符,需要用到两个下划线,这时mysql不认识,就需要写成'_\_'
推荐写法:'_任意字符_' escape '任意字符' :指定一个任意字符为转义字符
通配符:
% :匹配任意多个字符(包括0)
_ :匹配任意单个字符
between and 用于指定一个区间
比如between 100 and 200 表示在100到200之间(包含100和200)
in 用于指定一个列表,查看字段是否与列表中内容相符
比如:job_id in('IT_PROG','IT_ds') 如果有相符内容,就显示
相当于 job_id='IT_PROG' or job_id='IT_ds'
没错,它就是or 与 =这种形式的简化,所以使用时,必须遵循=号的规则
is null 判断字段值是否为空
is not null 判断字段值是否不为空
4、扩展形式
<=>:安全等于,一般使用is null 等运算符会触发全表扫描,降低效率,这时安全等于就可以解决,又可以对null进行运算,还兼容普通=号的功能
/*==================================================================================================================*/
# 查询工资大于12000的员工
select * from employees where salary>12000;
# 查询工资在10000到15000之间的员工信息
select * from employees where salary>10000 and salary<15000;
# 找姓中包含S的员工
select * from employees where first_name like '%S%';
# 查询工资在10000到15000之间的员工信息
select * from employees where salary between 10000 and 15000;
# 查询job_id字段值为IT_PROG或IT_ds的员工
select * from employees where job_id in('IT_PROG','IT_ds');
# 查询commission_pct为空的数据
select * from employees where commission_pct is null;
select * from employees where commission_pct <=> null;
3、排序查询
语法: select
查询列表
from
表名
[where
条件]
order by
排序列表 [asc升序|desc降序];
# 用[]括起来的内容表示可选项(可有可无)
# 排序列表:一般指按什么规则进行排序,比如按工资降序排列就可以写成 order by salary desc
/*==================================================================================================================*/
/*==================================================================================================================*/
# 查询员工的工资,按降序排列
select salary from employees order by salary desc;
# 按表达式排序
select salary*12 as "年薪" from employees order by salary*12 desc;
# 按别名排序
select salary*12 as "年薪" from employees order by "年薪" desc;
# 按函数排序(查询员工姓名,按名字长度降序排列)
select last_name as "姓名" from employees order by length(last_name) desc;
# 多字段排序(查询所有员工的姓名和年薪,名字按长度从小到大排,年薪按降序排列)
select last_name as "姓名",salary*12 as "年薪"
from employees
order by length(last_name) asc,salary*12 desc;
二、基础函数
1、字符串函数,参数是字符串的函数
1、length(str):字符串大小函数;获取指定字符串的字节长度
# 获取字符串的字节数
select length("123大小aaa");
# 获取employees表中email字段各条数据的字节数
select length(email) from employees;
2、concat(参数1,参数2,...):字符串拼接函数;将个参数进行拼接
# 查询员工姓名(每条数据都自动拼接)
select concat(first_name,last_name) as 姓名 from employees;
3、lower(str)、upper(str):大小写转换函数;将字符串数据转换为小写或大写,lower小写,upper大写
# 将员工姓以小写形式展示
select lower(first_name) from employees;
# 将员工姓名以大写形式展示
select concat(upper(first_name),upper(last_name)) as 姓名 from employees;
4、substr(str,索引,个数):字符串截取函数;从str中的指定下标开始,截取指定个数字符串
注意:mysql中,索引从1开始
# 截取出345
select substr("1234567",3,3);
# 截取从下标为3的字符开始的所有字符
select substr("1234567",3);
5、instr(str,子串):子串定位函数;获取子串在str中首次出现的位置
# 获取数字3在父串中首次出现的位置
select instr("1234567",3);
6、trim('子串' from str):清除前后内容函数;去除str前后的指定内容,中间不清除
# 清除前后空格
select trim(" 1 ");
# 清除前后的a字符
select trim('a' from "aaaaaaaaa爱aaaaaaa你aaaaaaaaaaaaaaaaaa");
7、lpad(str,数量,填充字符):字符串左填充函数;规定字符串长度,如果长度不够,在左边填充指定字符
# 规定10个字符,如果不足左边补*号
select lpad("123",10,'*');
8、rpad(str,数量,填充字符): 字符串右填充函数;和lpad唯一区别在于,rpad从右边填充字符
9、replace(str,被替换的子串,用于替换的子串):字符串替换函数;将str中指定字符替换为其他内容
# 将名字中S开头的员工,统一换为L开头
select replace(last_name,'S','L') from employees where last_name like 'S%';
2、数学函数
1、round(参数):四舍五入函数;
# 四舍五入
select round(1.65);
# 小数点后保留两位
select round(1.7654321,2);
2、ceil(参数):向上取整函数;返回大于等于参数本身的最小整数,也就是先截取整数部分,如果有小数点,就判断后面的小数是否大于0,如果大于0则取整+1
# 取整
select ceil(1.2); 结果:2
select ceil(1.0); 结果:1
3、floor(参数):向下取整函数;与ceil相反,它会返回小于等于参数本身的最大整数
4、truncate(参数,保留位数):截断函数;保留指定位数的小数
# 保留两位小数
select truncate(1.999999,2);
5、mod(参数1,参数2):取余函数;返回两个参数的余数,参数1位被数,参数2位取余数
# 求10%3
select mod(10,3);
3、日期函数
1、now():当前时间函数;返回当前时间和日期
# 当前日期时间
select now();
2、curdate():当前日期
#当前日期
select curdate();
3、curtime():当前时间
#当前时间
select curtime();
4、year(参数):返回参数中的年份;参数必须是一个时间。字符串,时间格式的数据,时间函数都可以
#取当前时间的年份
select year(now());
5、month(参数):返回参数中的月份;参数必须是一个时间。字符串,时间格式的数据,时间函数都可以
#取得当前时间月份
select month(now());
6、monthname(参数):返回月份,但是英文形式
#取得当前时间月份的英文形式
select month(now());
7、day(参数):返回天数
# 取得当前时间的日期
select day(now());
8、hour(参数):返回小时
9、minute(参数):返回分钟
10、second(参数):返回秒
11、str_to_date(时间字符串,格式字符串):将时间字符串根据格式字符串指定的格式解析成时间对象,格式字符串中,
%Y代表4为年,比如2020
%y代表2位年,比如99
%m代表月份,01~12
%c代表月份,1~12
%d代表日期,01~31
%H代表小时,24小时制
%h代表小时,12小时制
%i代表分钟,00~59
%s代表秒,00~59
#将字符串转换为时间
select str_to_date('2020-4-5','%Y-%m-%d');
12、date_format(时间参数,格式字符):将时间对象转换为字符串
#将时间转换为字符串
select date_format(now(),'%Y年%m月%d日');
4、流程控制函数
1、if(条件,条件为真执行,条件为假执行):类似java的if else
#如果值大于5则赋值为大,否则赋值为小
select if(25>5,'大','小');
# 修改指定id的发布状态,如果是未发布Draft就改为Normal已发布,如果是已发布Normal,就改为Draft未发布
update
edu_course #随便新建的一张表,有一个字段status,varchar类型
set
status=if(status='Draft',
'Normal',
'Draft'
)
where
id=18
2、 case 常量或结果为常量的表达式
when 常量1 then 常量对应执行的语句或值1
when 常量2 then 常量对应执行的语句或值2
when 常量3 then 常量对应执行的语句或值3
...
else 上面条件都不满足执行的语句或值
end;
# 判断余数
select
case 4%2
when 1 then '余数为1'
when 2 then '余数为2'
when 3 then '余数为3'
else '余数为0'
end;
case的第二种使用格式
case
when 条件1 then 条件满足执行的语句或值1
when 条件2 then 条件满足执行的语句或值2
when 条件3 then 条件满足执行的语句或值3
...
else 上面条件都不满足执行的语句或值
end;
5、分组|统计函数(有多种叫法,这里我们通一称为分组函数)
1、sum(参数):求和函数;返回参数的和
# 求总工资
select sum(salary) as 总工资 from employees;
# 去重后的总工资(可以和distinct一起用)
select sum(distinct salary) as 总工资 from employees;
2、avg(参数):平均值函数
# 求平均工资
select avg(salary) as 平均工资 from employees;
3、min(参数):最小值函数
# 求最低工资
select min(salary) as 最低工资 from employees;
4、max(参数):最大值函数
# 求最高工资
select max(salary) as 最高工资 from employees;
5、count(参数):统计个数函数
# 求员工个数
select count(salary) as 员工个数 from employees;
# 统计表行数(一共多少条数据)
select count(*) from employees;
6、datediff(max,min):求日期之间所差天数
# 求最找入职与最晚入职人员之间所差天数
select datediff(max(hiredate),min(hiredate)) as 相差天数 from employees;
三、分组查询
1、基础分组查询
语法:
select 查询字段(这些字段必须出现在group by后面),分组函数(查询字段)
from 表名
where 条件
[group by 分组条件表达式]
[having 分组筛选条件]
[order by 排序字段]
1、查询不同工种的最高工资
select max(salary),job_id
from
employees
group by
job_id;
当我们使用分组函数时,如果不配合group by 就只会显示一行数据,这时job_id字段也只能显示一条数据,所以分组函数配合分组查询,适用的场合就是根据不同分组显示一组统计数据,比如:不同分公司11月的总销售额
而且我们要保证,向job_id这样的普通字段,要跟在group by后面
2、查询部门人员大于2的部门
select
count(*),department_id #分组函数统计人数,分组字段为department
from
employees #查询表
group by
department_id #分组字段要跟在group by子句后面
having
count(*)>2 #分组后的筛选条件跟在having子句后面
当我们查询类似数据时,就要分组查询,先查询出个部门人数,然后对分组后的数据进行筛选,哪些是大于2的,而这里的条件就跟在having子句的后面
==一定要知道:当我们分组后,分组函数,比如count的作用就是,统计每个组的数据条数,而不是整个表了,不要混淆==
3、查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
select
job_id,max(salary)
from
employees
where
commission_pct is not null
group by
job_id
having
max(salary)>12000
4、查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及最低工资
select
manager_id,min(salary)
from
employees
where
manager_id>102
group by
manager_id
having
min(salary)>5000
你可以先查询出领导编号>102的数据,然后分组,最后查出这些领导手下员工最低工资>5000的,将其分成若干个部分一点点查,就可以轻松解决
1、查出领导编号>102的数据
select manager_id
from
employees
where
manager_id>102
2、分组
select manager_id
from
employees
where
manager_id>102
group by
manager_id
3、筛选最低工资>5000的
select manager_id,min(salary)
from
employees
where
manager_id>102
group by
manager_id
having
min(salary)>5000
2、按函数分组查询
1、按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的
select
length(concat(first_name,last_name)) as 姓名长度,count(*) as 员工个数
from
employees
group by
姓名长度
having
员工个数>5
先查员工姓名长度,然后根据姓名长度分组,然后统计每个长度的员工数量,最后筛选数量>5的
这里我偷懒使用别名作为分组条件和筛选条件,不保证所有数据库都支持,mysql是支持这样写的
2、每个部门每个工种的员工的平均工资(这里涉及的是多字段分组查询,使用较多)
select
department_id,job_id,avg(salary)
from
employees
group by
department_id,job_id
两个分组条件,先查每个部门,然后每个部门按照工种再次分组,最后求平均工资
第二种方法:(不推荐,因为排序会过滤null)
select
department_id,job_id,avg(salary)
from
employees
group by
job_id
order by
department_id
四、多表查询
1、普通多表查询
学习多表查询前,需要列举笛卡尔集的概念
笛卡尔集:表1有m条数据,表2有n条数据,结果有n*m条数据。在sql查询中,要避免这样的情况
1、查询部门id为20的员工名字和部门名字(员工名在表,部门名字在表,部门id两个表都有)
select
concat(first_name,last_name),#员工名字
employees.department_id,#部门id,因为两个表都有这个字段,所以指定它是employees表中的字段,用表名.字段名形式指定
department_name #部门名
from
employees,departments #两个表
where
employees.department_id=20 and #筛选出部门编号为20的部门
employees.department_id = departments.department_id #限制两个表的id要一致,否则出现笛卡尔集
=============多表查询的分类=============
sql 192标准:只支持内连接,sql 199标准:支持内、外、交叉连接。
1、内连接
等值连接
非等值连接
自连接
2、外连接
左外连接
右外连接
全外连接
3、交叉连接
2、等值连接多表
等值连接就是通过等号连接两个表的唯一标识,来匹配数据
1、查询有奖金的每个部门的部门名和各部门的领导编号以及该部门的员工最低工资
select
department_name as 部门名,
d.manager_id as 领导编号,
min(salary) as 员工最低工资
from
employees as e,
departments as d
where
e.department_id=d.department_id and
commission_pct is not null
group by
部门名,领导编号
2、查询员工名,部门名和所在城市
select
last_name as 员工名,
d.department_name as 部门名,
l.city as 城市名
from
employees as e,
departments as d,
locations as l
where
e.department_id=d.department_id AND
d.location_id=l.location_id
3、非等值多表连接
这里创建一张新表进行测试,这张表是工资等级表,用来根据区间判断员工工资属于哪个级别
use myemployees;
CREATE TABLE job_grades
(grade_level VARCHAR(3),
lowest_sal int,
highest_sal int);
INSERT INTO job_grades
VALUES ('A', 1000, 2999);
INSERT INTO job_grades
VALUES ('B', 3000, 5999);
INSERT INTO job_grades
VALUES('C', 6000, 9999);
INSERT INTO job_grades
VALUES('D', 10000, 14999);
INSERT INTO job_grades
VALUES('E', 15000, 24999);
INSERT INTO job_grades
VALUES('F', 25000, 40000);
1、查询各员工工资级别
select
last_name as 员工名,
grade_level as 工资级别
from
employees as e,
job_grades as jg
where
salary between lowest_sal and highest_sal;
底层运行机制:employees表中每条数据,依次和grade_level表中数据进行配对,找出满足配对条件的数据,没有指定条件则出现笛卡尔集n*m条数据,这里指定条件为区间匹配,工资级别只会显示匹配的数据
4、自连接
自连接就是一张表当成两张表用,这里我的employess表中存储的是所有员工的数据,这里面有领导,有普通员工,每个员工都有一个字段manager_id,对应领导的员工编号employee_id,所以我们可以将这张表当成两个表来查询使用。
1、查询员工的领导名
select #这里用到了别名区分,解决了字段冲突
e.last_name as 员工名,
e.employee_id as 员工编号,
m.last_name as 领导名,
m.employee_id as 领导编号
from
employees as e, #别名为e表示员工
employees as m #别名为m表示领导
where
e.manager_id=m.employee_id #查询员工领导id = 领导的编号的数据
五、sql99语法的多表查询以及各种连接
1、sql99语法
sql99语法中,将连接类型,主表和连接表,连接条件和筛选条件分开了,可读性更高
1)我们以往将主表和连接表都放在from后面,而且连接只有内连接。现在我们将主表放在from后面,然后根据不同连接类型,
比如内连接,就用inner join连接其它表,
2)我们以往将连接条件和筛选条件写在一起,现在连接条件写在on后面,筛选条件依然写在where后面
select
查询列表
from
表1 [as 别名]
[连接类型] join
表2 [as 别名]
on
连接条件
[where
筛选条件
group by....]
解释:
连接类型:
内连接:inner
外连接:
左外:left [outer]
右外:right [outer]
全外:full [outer]
交叉连接:cross
2、内连接
一、等值连接(两个表有可以关联的字段)
1、查询员工名、部门名
select
last_name as 员工名,
department_name
from
employees as e
inner join #inner join表示内连接后面的表
departments as d
on #on后面跟连接条件
d.department_id=e.department_id
2、查询名字中含‘e’的员工名和工种名
select
last_name as 员工名,
job_title as 工种名
from
employees as e
inner join
jobs as j
on
e.job_id=j.job_id
where #筛选条件依然跟在where后面
last_name like '%e%'
3、查询部门个数>3的城市名和部门个数
select
city as 城市名,
count(*) as 部门个数
from
departments as d
inner join
locations as l
on
d.location_id=l.location_id
group by
city
having
count(*)>3
4、查询员工个数>3的部门名和员工数,按员工数量降序排列
select
department_name as 部门名,
count(*) as 员工个数
from
employees as e
inner join
departments as d
on
e.department_id=d.department_id
group by
department_name
having
count(*)>3
order by
count(*) desc
5、查询员工名、部门名、工种名,并按部门名降序排列
select
last_name as 员工名,
department_name as 部门名,
job_title as 工种名
from
employees as e
inner join #第一个连接表
departments as d
on
e.department_id=d.department_id
inner join #第二个连接表
jobs as j
on
e.job_id=j.job_id
order by
department_name desc
二、非等值连接(两个表没有可以直接关联的字段)
1、查询员工的工资级别和员工名
select
last_name as 员工名,
grade_level as 员工级别
from
employees as e
inner join
job_grades as jg
on
salary between lowest_sal and highest_sal
三、自连接(一个表自己和自己连接)
1、查询各员工和其上级名字,按领导的编号排序
select
e.last_name as 员工名,
m.last_name as 领导名
from
employees as e
inner join
employees as m
on
e.manager_id=m.employee_id
order by
m.employee_id asc
3、外连接
需要的数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/`girls`
USE `girls`;
/*Table structure for table `admin` */
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*Data for the table `admin` */
insert into `admin`(`id`,`username`,`password`) values (1,'john','8888'),(2,'lyt','6666');
/*Table structure for table `beauty` */
DROP TABLE IF EXISTS `beauty`;
CREATE TABLE `beauty` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` char(1) DEFAULT '女',
`borndate` datetime DEFAULT '1987-01-01 00:00:00',
`phone` varchar(11) NOT NULL,
`photo` blob,
`boyfriend_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
/*Data for the table `beauty` */
insert into `beauty`(`id`,`name`,`sex`,`borndate`,`phone`,`photo`,`boyfriend_id`) values (1,'柳岩','女','1988-02-03 00:00:00','18209876577',NULL,8),(2,'苍老师','女','1987-12-30 00:00:00','18219876577',NULL,9),(3,'Angelababy','女','1989-02-03 00:00:00','18209876567',NULL,3),(4,'热巴','女','1993-02-03 00:00:00','18209876579',NULL,2),(5,'周冬雨','女','1992-02-03 00:00:00','18209179577',NULL,9),(6,'周芷若','女','1988-02-03 00:00:00','18209876577',NULL,1),(7,'岳灵珊','女','1987-12-30 00:00:00','18219876577',NULL,9),(8,'小昭','女','1989-02-03 00:00:00','18209876567',NULL,1),(9,'双儿','女','1993-02-03 00:00:00','18209876579',NULL,9),(10,'王语嫣','女','1992-02-03 00:00:00','18209179577',NULL,4),(11,'夏雪','女','1993-02-03 00:00:00','18209876579',NULL,9),(12,'赵敏','女','1992-02-03 00:00:00','18209179577',NULL,1);
/*Table structure for table `boys` */
DROP TABLE IF EXISTS `boys`;
CREATE TABLE `boys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`boyName` varchar(20) DEFAULT NULL,
`userCP` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*Data for the table `boys` */
insert into `boys`(`id`,`boyName`,`userCP`) values (1,'张无忌',100),(2,'鹿晗',800),(3,'黄晓明',50),(4,'段誉',300);
1、作用:
用于查询主表中有,而其它表中不完全有的记录
查询结果:
主表中所有记录都将显示
若从表中有匹配记录,则显示,否则显示null
与内连接的区别:内连接只显示匹配成功的数据,而外连接会将匹配不成功的也显示出来,并将没有获得匹配成功的数据显示为null
2、如何区分主表和从表:
左外连接
from
表1 #主表
left join
表2 #从表
右外连接
from
表1 #从表
right join
表2 #主表
全外连接:
它将两个表都当成主表,也就是两个表的所有内容都将显示,不匹配的两张表都会匹配为null
因为没太多适用场景,而且mysql也不支持全外,所以需要的可以查阅资料,我这里只有mysql数据库,不支持全外,没办法举例子
3、为什么要区分主表从表:
主表的数据将全部显示,而从表中,与主表匹配的内容显示,不匹配的显示为null
4、左,右外连接:
1、查询beauty表中所有女神名,以及他们在boys表中的男朋友(左外)
select
name as 女神名,
boyName as 男神名
from
beauty as be #主表
left join
boys as boy
on
be.boyfriend_id=boy.id
2、查询beauty表中所有女神名,以及他们在boys表中的男朋友(右外)
select
name as 女神名,
boyName as 男神名
from
boys as boy
right join
beauty as be #主表
on
be.boyfriend_id=boy.id
4、交叉连接
就是sql99语法中的笛卡尔乘积
select
name as 女神名,
boyName as 男神名
from
boys as boy
cross join
beauty as be
结果就是两个表的数据相乘的结果集,n*m条数据
六、子查询
一、概念:
1、用于嵌套查询的select语句叫做子查询或内查询,通俗来讲就是将某个查询语句作为一个子条件嵌入到其他查询语句中
2、而其外部查询叫主查询或外查询
3、子查询可以出现在:
select、from、where、having、exists后面,exists(相关子查询)
4、子查询都放在()小括号内
二、分类
1、按结果集行列数不同分(就是子查询单独执行后的结果集,如果就一行一列,叫标量。起名字而已)
标量 子查询(结果有一行一列)
列 子查询(结果有一列多行)
行 子查询(结果有一行多列)
表 子查询(一个表,多行多列的)
2、根据子查询出现位置,支持使用的子查询为
select 后面:
只支持 标量 子查询
from 后面:
表 子查询
where和having 后面:
标量、列、行 子查询
exists 后面:
表 子查询
对应标量、列、行 子查询 我们通过where 和 having讲解
表 子查询 用exists讲解
1、标量子查询
标量子查询,就是子查询的结果集只有一列一行的
1、谁的工资比Abel高(先查出记录Abel的工资,然后查询比他高的,子查询查出Abel工资,主查询查高的)
select
salary
from
employees
where #主查询
salary >( #子查询放在小括号内
select #这个子查询是典型的标量子查询,只有一行一列的记录
salary
from
employees
where
last_name='Abel')
2、查询与141号员工的工种号job_id相同 并且 比143号员工的工资salary多的 员工的姓名,工种名和工资
select
last_name as 员工姓名,
job_title as 工种名,
salary as 工资
from
employees as e
inner join
jobs as j
on
e.job_id=j.job_id
where
e.job_id = #工种号等于子查询结果
(
select #查出141号员工的工种号
job_id
from
employees
where
employee_id=141
) and
salary > #工资大于子查询结果
(
select #查询143号员工的工资
salary
from
employees
where
employee_id=143
)
3、工资最少的员工的last_name,job_id和salary
select
last_name as 员工名,
job_id as 工种名,
salary as 工资
from
employees
where
salary=
(
select
min(salary)
from
employees
)
2、列子查询
列 子查询 就是子查询的结果集为一列多行
对比多行数据:sql提供了操作多行数据的操作符
1、IN/NOT IN 等于或不等于列表中的任意一个
a in(1,2,3,4); #a等于1或2或3或4,条件都成立
a not in(1,2,3,4); #a不等于括号中任何一个值,则条件成立
2、ANY/SOME 和子查询返回的结果集某一个值比较
a>any(1,2,3,4); #a大于其中任意一个值,条件成立
3、ALL 和子查询返回的所有值比较
a>all(1,2,3,4); #a大于其中所有值,条件才能成立
举例:
1、返回location_id为1400或1700的部门中的所有员工姓名
elect
last_name as 员工姓名
from
employees as e
inner join
departments as d
on
e.department_id=d.department_id
where
d.department_id in #查询部门id与子查询结果集对应的数据
(
select#匹配location_id为1400或1700的部门id
department_id
from
departments
where
location_id in(1400,1700)
)
2、查询比job_id是IT_PROG的部门中的任何一个员工工资都低的其它部门员工,查出这些员工的工号、姓名、job_id以及salary
select
last_name as 姓名,
e.job_id as 工种号,
salary as 工资
from
employees as e
inner join
jobs as j
on
j.job_id=e.job_id
where
salary<all(#其实比任何一个人都低,就表示比最低的还低,直接<mix(salary)即可,这里主要用于举例
select
salary
from
employees
where
job_id='IT_PROG'
)and
e.job_id<>'IT_PROG'
3、行子查询
查询结果为一行多列
1、查询工资最高但编号最小的员工信息
select
*,max(salary),min(employee_id)
from
employees
where
salary=(
select
max(salary)
from
employees
)and
employee_id=(
select
min(employee_id)
from
employees
)
4、放在不同位置的子查询
1、查询各部门的员工个数(select后面)
select
department_name as 部门名,
(
select
count(*)
from
employees e
where
e.department_id=d.department_id
) as 员工人数
from
departments as d
2、查询各员工工资对应的等级(from后面)
select
last_name as 员工名,
等级表.等级
from
employees as e
inner join
(
select
grade_level as 等级,
lowest_sal,
highest_sal
from
job_grades
) as 等级表
on
e.salary between 等级表.lowest_sal and 等级表.highest_sal
3、(exists后面,专业名词叫“相关子查询”)
exists(子查询语句);
exists可以理解为一个函数,它会判断子查询是否有结果,有就返回1,没有就返回0
子查询语句可以是任意的,结果集可以是一行,一列,一个表,但它只会返回1和0
七、分页查询
什么是分页查询:
1、当我们查询出10000条数据时,一页肯定显示不完,就会分成多页显示,而如何分页,每页多少数据,是
你需要设置的
2、一次性显示10000条数据,就太浪费资源了,如果将其分成100页,每页100条数据,那么浏览器会根据页
数显示数据,而没有选中的数据就不会请求,有效节省资源
3、谁都没法保证,每个用户都会浏览完10000条数据,分页请求显示,就非常有必要
语法:
select 字段列表 #7
from 表名 #1
[连接类型 join 表名 #2
on 连接条件 #3
where 筛选条件 #4
group by 分组字段 #5
having 分组条件 #6
order by 排序字段 desc|asc] #8
limit [起始索引(从0开始,默认为0,可省略),]总记录数; #9
limit 子句必须放在sql查询语句的最后面
后面序号表示执行顺序
例题:
1、查询前5条员工信息
select
*
from
employees
limit 5 #从索引为0的数据开始(默认为0,省略第一个参数),一共查询5条数据
2、查询11到25条员工信息
select
*
from
employess
limit 10,15; #从索引为10的数据开始,查询出15条数据
八、联合查询
什么是联合查询
union 联合:将多条查询语句的结果集合并成一个结果集,会去除重复结果
union all :不去重
举例
1、查询部门编号>90并且名字包含a的员工信息
普通:
select * from employees where department_id>90 and last_name like '%a%'
联合:
select * from employees where department_id>90
union
select * from employees where last_name like '%a%'
区别:
普通查询会根据条件匹配到合适的数据
联合查询是将多个查询语句的结果集联合到一起,就是取并集
执行后可以看到,普通的查询结果少,而联合的会非常多
联合查询要求多个查询的字段一致
九、插入
语法:
insert into 表名(列名1,...) values(值1.1,...)[,(值2.1,...),...] #插入一条或多条数据
insert into 表名 set 列名1=值1,...
例题:
1、向girls数据库的beauty表中添加两条数据
insert into
#字段的顺序可以调换,但values后面的字段顺序,必须与你在sql中调换的顺序保持一致,而且你选了多少字段,values后面就得跟多少字段
beauty(id,`name`,sex,borndate,phone,boyfriend_id) # 这里选多少字段,就只插入多少字段,没选中的字段必须是可以缺省或自动填充,自动补null,或有默认值的字段
values
(13,'new1','女',now(),18955545554,9),#可以插入一条或多条,但插入的字段,和类型必须与into后面的字段一致
(14,'new2','女',now(),18955545554,9)
2、添加数据方式2
insert into beauty set
id=20,
name="nenewne",
sex='女',
borndate=now(),
phone=153131,
boyfriend_id=10
3、根据查询结果批量插入数据
insert into beauty(id,name,phone)
select id,name,phone
from 表名
where....;
这样就可以将查询结果都插入到表中了,但是字段必须对应
十、修改(更新)
语法:
修改单表记录:
update
表名
set
列1=新值1,
....
where
筛选条件 #和select类似,筛选出多少数据,就会修改多少数据
修改多表记录
sql 92语法:
update
表名1 as 别名,
表名2 as 别名,
...
set
列1=新值1,
表名1.有重复性的列1=新值,
...
where
连接条件 and
筛选条件
sql 99 语法:
update
表1 as 别名
连接类型 join
表2 as 别名
on
连接条件
set
列1=新值1,
表名?.有重复性列1=新值,
...
where
筛选条件
举例:
1、修改id为17的女神姓名为赵雯
update
beauty
set
name='赵雯'
where
id=17
多表操作,只要保证你查询结果是你想要的,然后按语法转换为修改即可,会查询自然会修改
十一、删除
语法:
单表删除
delete from 表名 where 筛选条件; # 删除筛选到的数据
truncate table 表名; #删除指定表(整张表全删)
多表删除
sql 92:
delete from
表名1,表名2
where
连接条件 and 筛选条件
sql 99:
delete 别名1,别名2 from
表名1 as 别名1
连接类型 join
表名2 as 别名2
on
连接条件
where
筛选条件
举例:
1、删除id为20的女神信息
delete from
beauty
where
id=20
2、
十二、管理库和表(建库,删库,跑路)
1、库的管理
一、建库
语法:create database 库名;
1、创建book库,并进行容错处理,不要报错,如果库已经存在,就不要建库
create database if not exists book;
[if not exists]:判断是否存在
二、修改库
语法:alter database 库名 修改内容
1、 修改book库的字符集为utf8
alter database book character set utf8;
三、删库
语法:drop database 库名;
1、删除book库,并容错
drop database if not exists book;
不加 if not exists 也没事,但是若你book已经没了,还执行删除语句,就会报错
2、表的管理(管理表,必须先有数据库并指定)
一、建表
语法:create table [if not exists]表名(
字段1 字段类型[(字段长度) 约束],
字段2....
); #对应字段类型和约束以后的章节讲
1、创建表book,有3个字段 id,book_name,price
create table book(
id int,#编号
book_name varchar(20),#书名,最大长度20
price double#价格
);
二、修改表
语法:
1、修改列名 alter table 表名 change column 旧列名 新列名 新列名类型
#修改book表中的价格列,名字改为money 类型不变
alter table
book #要改的表
change column price #要改的列名为price
money double; #改为money 类型double
2、修改列的类型或约束 alter table 表名 modify column 要修改的列名 要改成的类型或约束
#修改book表价格字段的类型为int
alter table book modify column money int;
3、添加一列 alter table 表名 add column 新列名 类型 约束
#添加一个日期列
alter table book add column date_time data;
4、删除一列 alter table 表名 drop column 列名;
5、修改表名 alter table 表名 rename to 新表名;
三、删除表
语法:drop table [if not exists]表名;
四、复制其它表进行创建
语法:
1、复制结构(不复制数据)
create table 要新创建的表 like 被复制的表
2、复制结果和数据
create table 要新创建的表
select * from 被复制的表
也就是将查询出的结果,复制到表中,你可以添加where筛选,它会将筛选出的结果进行复制
3、仅仅复制部分字段,不复制数据
create table 要创建的表
select 字段1,字段2 from 要被复制的表 where 0;
where 0 :代表恒不成立,也就不会查询出任何结果,自然就仅仅把字段复制过去啦!
十三、数据类型
1、数值型
一、整型
1、Tinyint 1字节 一个字节等于8位 2的八次方 可以表示 无符号0~255 有符号-128~127 以此类推
2、Smallint 2字节 有符号-32768~32767 无符号0~65536
3、Mediumint 3字节 2的24次方
4、Int、integer 4字节 2的32次方
5、Bigint 8字节 2的64次方
#创建一个表,包含两个字段,一个字段为有符号int类型 长度为11,另一个无符号int类型 长度默认
create table test(
column1 int(11), #默认都是有符号的,也就是带负数的
column2 int unsigned #相要设置为无符号,就要添加关键字unsigned
)
每一种类型都有一个默认长度,当然我们可以为其更改默认长度,比如int型默认长度为11
我们可以int(2)将其改为2,这样这个字段就只能输入两位数了
这个默认长度,不是它的数值表示范围,而是这个字段的文本长度,如果这个字段全是两位数
就没必要使用默认的11位了,设置成2即可
长度由关键字类型决定,int为4个字节 长度为2的32次方
(长度)表示这个字段所能输入的数据个数,也就是说它修饰的是这一列可以输入多少个字符
二、小数
1、浮点型
1、float 4字节
2、double 8字节
2、定点型
1、DEC(M,D) M+2字节 有效取值范围由M和D决定,但不能超过double
2、DECIMAL(M,D) M+2字节 效果相同,只是关键字不同,不同版本用不同关键字
M表示长度,D表示小数点后保留位数
#创建表,三个字段,每个字段长度为5位,小数后保留两位
create table test(
f1 float(5,2),
f2 double(5,2) #长度5位 表示最大值999.99 是小数和整数部位合起来的长度
f3 dec(5,2)
)
推荐精度固定时使用定点型,就像我上面一样,当然我们可以不使用,那么float和double 会按照用户输入数据设置长度
而dec和decimal会按照自己的默认值,M=10,D=0
不设置定点的时候,最好不要使用dec和decimal
浮点型就是浮动的类型,它的取值不固定,你这次小数点后面有2位,它就浮动为2位,你这次3位,它就浮动3位
定点型就是点数固定,它的取值范围固定,如何实现定点,就是加括号(长度,小数点后精度)
2、字符型
一、较短字符串
1、char(M) 长度为M个字符数 M可取0~255之间整数 就是此类型最多保存255个字符
2、varchar(M) 长度为M个字符数 可取0~65535之间整数
区别:
char 效率相对较高,但有浪费资源的风险。它的长度一旦设定,就不会改变,就是你只输入两个字符,它也依然;每条数据占10个字符空间
varchar 效率相对较低,但节省空间。它的长度一旦设定,就保持在最大字符数为设定值,你只输入两个字符,它就只占2字符空间
二、二进制字符串
1、binary(M)
2、varbinary(M)
与char和varchar相同,但是这两个用来保存二进制字符串,而不能保存非2进制字符串
要知道,电脑中所有资源底层都是2进制0和1,我们可以将一张图片转换为2进制代码
保存到这两种类型字段中,比如一个用户的头像
三、枚举类型
enum 要求插入值必须属于列表中指定值之一,你的列表中可以存储一些值,但不能超过65535
比如你的列表中有 78,1024两个枚举值,那么78 在0~255之间,占1个字节存储位置
1024在255~65535之间 占2个字节
# 创建表,有一个字段sex表示性别,只能输入男或女两个值,用数据类型直接规定
create table test(
sex enum('男','女') #这样sex字段就只能插入男和女两个值了,不区分大小写
)
四、Set类型
set 1~8字节 和enum类似属于列表,set可以保存0~64个成员,每8个成员占一个字节
set可以一次选多个值,每个值之间用逗号分隔,但enum只能选一个
# 创建表,有一个字段sex表示姓名,能输入男、女或男,女
create table test(
sex set('男','女')
);
insert into test(sex) value('男,女');
3、日期型
1、date 4字节 最小值:1000-01-01 最大值:9999-12-31
2、datetime 8字节 最小值:1000-01-01 00:00:00 最大值:9999-12-31 23:59:59
3、time 3字节 最小值:-838:59:59 最大值:838:59:59
4、year 1字节 最小值:1910 最大值:2155
5、修改时区为东八区:set time_zone='+8:00'
6、显示当前时区:show variables like 'time_zone'
十四、约束
1、常用约束
1、 not null 设置字段不能为空、null 可以为空
2、default 设置字段有默认值
3、primary key 设置字段为主键,取值将具有唯一性,但是不能为空
4、unique 设置字段具有唯一性,可以为空
5、check 检查约束,mysql不支持此约束,但填写上并不会报错,只会忽略而已
6、foreign key 设置字段的外键,用来限制两个表之间的关系,用references 关联
2、语法和使用时机
使用时机:
1、创建表时
2、修改表时
添加类型:
1、列级约束
直接跟在字段的后面进行约束即可
上面提到的6个约束都可以用,mysql不支持check,而且foreign key 外键约束只能
对表生效,写在列级不会报错,但没有效果
2、表级约束
声明完所有字段后,通过关键字constraint声明表级约束
除了空和非空以及默认值,剩下的都可以写在表级约束,mysql 不支持check
语法
create table test(
字段1 字段类型(长度) 列级约束1,
字段2 字段类型(长度) 列级约束2,
....,
表级约束
);
标记约束的语法:
[constraint 约束名(随便起,和变量名一个意思)] 约束类型(约束字段)
#为表中id字段设置为主键
[constraint 约束1] primary key(id)
[]括住的可以省略,但不推荐省略,可能不兼容
约束名的命名 一般用fk开头 然后_连接表名和描述
constraint fk_user_major ....
3、例题
一、创建表时的列级约束
create table users(
id int primary key, #主键约束 primary key 取值唯一 非空
username varchar(10) not null, #姓名 非空 取值不能为空
age int default 18, #年龄 默认值18 默认值需要和类型对应
gender char(1) check(gender='男' or gender ='女'),#性别 约束字段取值只能为男或女,但mysql中不支持
seat int unique #座位号 取值唯一 可以为空
)
二、创建表时添加表级约束
create table major(#此表用于给下面的usre表测试外键用
id int primary key,
major_name varchar(10) not null
)
create table users(
id int,
username varchar(10) not null, #非空无法用于表级约束
age int default 18, 默认值不能用于表级约束
gender char(1),
seat int,
major_id int,#外键
constraint ys1 primary key(id),# 添加主键
constraint ys2 unique(seat),#设置默认值
constraint ys3 foreign key(major_id) references major(id)#将字段major_id设为外键关联major表的主键id
);
show index from users;#查看表索引信息
三、修改时添加列级约束
alter table users modify column username varchar(20) null;#将users表中username字段约束设置为null
四、修改时添加表级约束
alter table users add [constraints fk_users_primary_key_id] primary key(id); #将users表中的id设置为主键
五、修改表时删除约束
1、删除列级主键约束
alter table users modify column id int;#1、相当于重新定义了字段,属性会按照这个重新设置,自然就不是主键了
drop table users primary key;#2、直接删除主键,不用写列名,因为我这张表只有一个组件
2、删除表级约束
alter table users drop index 约束名(就是我们声明约束时起的名字fk_users_pri....)
可以先查一下约束名show index from users;
132
供日后查阅
关键字:
1、distinct :用此关键字修饰的字段,数据是不重复的
多行数据的操作符
1、IN/NOT IN 等于或不等于列表中的任意一个
a in(1,2,3,4); #a等于1或2或3或4,条件都成立
a not in(1,2,3,4); #a不等于括号中任何一个值,则条件成立
2、ANY/SOME 和子查询返回的结果集某一个值比较
a>any(1,2,3,4); #a大于其中任意一个值,条件成立
3、ALL 和子查询返回的所有值比较
a>all(1,2,3,4); #a大于其中所有值,条件才能成立