Mysql基础02-简单查询

前言

本文结构

  • 前言
      • 进阶一:基础查询
      • 进阶二:条件查询
      • 进阶三;排序查询
      • 进阶四:常见函数
      • 进阶五:分组函数
      • 进阶六:分组查询 group by
      • 进阶七:连接查询
      • 进阶八:分页查询
      • 进阶九:联合查询

这是数据库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 查询列表 
from 表名;

特点:
1.查询的结果集是一个虚表
2.查询列表可以是:字段、表达式、常量、函数等

*/


#一、查询函数(调用函数,获取返回值)
SELECT DATABASE();
SELECT VERSION();
SELECT USER();

/*
mysql中+的作用
1.加法运算
	1.两个操作数都是数值型 
		e.g. 100+2
	2.其中一个操作数为字符型
		将字符型数据尝试转换成数值型,如果无法转换,字符当做0处理
			'hsoin'+100  ===》100
	3.其中一个操作数为null
		null+null=====>null
		null+100====>null
	
	
*/
#二.使用concat函数  拼接多个列为一列
#需求:查询 first_name 和last_name 拼接成的全名,最终起别名为: 姓 名
SELECT CONCAT(first_name,last_name) AS "姓 名"
FROM employees



#三、distinct的使用
#需求:查询员工涉及到的部门编号有哪些
SELECT  DISTINCT department_id FROM employees;

#四、查看表结构 两种方式都可以
DESC employees
SHOW COLUMNS FROM employees;

进阶二:条件查询

/*
语法:

select 查询列表
from 表名
where 筛选条件

执行顺序:
1.from子句
2.where子句
3.select子句

特点:

1、按条件表达式筛选
 关系运算符:> <  >=  <=  =  <>
 
2、按逻辑表达式筛选   
 逻辑运算符: and  or not

3、模糊查询 
like
in  
between and
is null 
		
	
*/
#一、按关系表达式筛选
#案例1:查询部门编号不是100的员工信息
SELECT *
FROM employees
WHERE department_id <> 100

#案例2:查询工资<15000 的姓名、工资
SELECT last_name,salary
FROM employees
WHERE salary <15000


#二、按逻辑表达式筛选
#案例1:查询部门编号不是 50-100之间员工姓名、部门编号、邮箱
SELECT last_name,department_id,email
FROM employees
WHERE department_id BETWEEN 50 AND 100

#案例2:查询奖金率>0.03 或者员工编号在60-110之间的员工信息
SELECT * 
FROM employees
WHERE commission_pct >0.03 OR employee_id BETWEEN 60 AND 110


#三、模糊查询

#1、like/not like

/*
一般和通配符搭配使用  对字符型数据进行部分匹配查询
常见通配符:
_ 任意单个字符
% 任意多个字符

*/

#案例1:查询姓名中包含字符a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE	'%a%'

#案例2:查询姓名中最后一个字符为a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE	'%a'

#案例3:查询姓名中第三个字符为a的员工信息
SELECT *
FROM employees
WHERE last_name LIKE	'__a%'

#案例4:查询姓名中第二个字符为——的员工信息 要使用转义符 \ 或自己设置转义符
SELECT *
FROM employees
WHERE last_name LIKE	'_\_%'

SELECT *
FROM employees
WHERE last_name LIKE	'_$_%' ESCAPE	'$' #设置 $ 为转义字符


#2、in

/*
功能:查询某字段的值是否属于指定的列表之内

a  in (常量值1,常量值2,常量值3,.....)
a not in(常量值1,常量值2,常量值3,.....)

*/

#案例1:查询部门编号是30/50/90的员工信息
SELECT *
FROM employees
WHERE department_id IN(30,50,90)


#3、between and/ not between and
/*
功能: 判断某个字段的值是否介于xx之间

*/

#案例1:查询部门编号是30-30之间的部门编号、员工姓名
SELECT department_id '部门编号',CONCAT(first_name,last_name) '姓 名'
FROM employees
WHERE  department_id  BETWEEN 30 AND 50

#案例2:查询年薪不在100000-200000之间的员工姓名、工资、年薪
SELECT CONCAT(first_name,last_name) '姓 名',salary '工资', salary *12*(1+IFNULL(commission_pct,0)) '年薪'
FROM employees
WHERE (salary*12) NOT BETWEEN 100000 AND  200000	


#4、 is null/is not null

#案例1:查询没有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NULL;
#案例2:查询有奖金的员工信息
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL;


/*

= 只能判断普通的内容

is  只能判断null值

<=> 	安全等于,既能判断普通内容,又能判断null值

*/


#1 查询工资大于 12000 的员工姓名和工资
SELECT CONCAT(first_name,last_name) '姓 名' , salary '工 资'
FROM employees
WHERE salary >12000


#2 查询员工号为 176 的员工和姓名和部门号和年薪
SELECT CONCAT(first_name,last_name) '姓 名', department_id  '部门编号', salary *12*(1+IFNULL(commission_pct,0)) '年薪'
FROM employees
WHERE employee_id = 176

#3 选择工资不在 5000 到 12000 的员工的姓名和工资
SELECT CONCAT(first_name,last_name) '姓 名',salary '工资'
FROM employees	
WHERE salary NOT BETWEEN 5000 AND  12000

#4 选择在20或50号部门工作员工姓名和工资
SELECT CONCAT(first_name,last_name) '姓 名',salary '工 资'
FROM employees
WHERE department_id IN(20,50)


#5 选择公司中没有管理者的员工姓名及 job id
SELECT CONCAT(first_name,last_name) '姓 名',job_id '工种编号'
FROM employees
WHERE manager_id IS NULL


#6 选择公司中有奖金的员工姓名,工资和奖金级别
SELECT CONCAT(first_name,last_name) '姓 名',salary '工 资', commission_pct '奖金级别'
FROM employees
WHERE commission_pct IS NOT NULL

#7 选择员工姓名的第三个字母是a的员工姓名
SELECT last_name '名'
FROM employees
WHERE last_name LIKE '__a%'

#8 选择姓名中有字母 a 和 e 的员工姓名
SELECT CONCAT(first_name,last_name) '姓 名'
FROM employees
WHERE last_name LIKE '%a%e%'

#9 显示出 employees 表中 first_name 以 ‘e’ 结尾的员工信息
SELECT *
FROM employees
WHERE firsT_name LIKE '%e'
 
#10 显示出 employess 表中 部门编号在80-100之间的姓名、职位
SELECT CONCAT(a.first_name,a.last_name) '姓 名',b.job_title
FROM employees a,jobs b
WHERE a.department_id  BETWEEN 80 AND 100  AND a.job_id=b.job_id


#11 显示出 employees表的 manager_id 是 100,101,110的员工姓名、职位
SELECT CONCAT(a.first_name,a.last_name) '姓 名',b.job_title
FROM employees a,jobs b
WHERE a.manager_id IN(100,101,110) AND a.job_id=b.job_id

进阶三;排序查询

/*
语法:
select 查询列表
from 表明
【where 筛选条件】
order by 排序列表    默认升序  desc 降序

执行顺序:

1.from子句
2.where子句
3.select子句
4.order by子句

举例:
SELECT last_name,salary
FROM employees
WHERE salary >10000
ORDER BY salary DESC


特点:

1、排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合
2、升序,asc,默认行为
   降序,desc,
*/

#一、按单个字段排序
#案例1:将员工编号>120的员工信息进行工资的升序
SELECT *
FROM employees
WHERE employee_id >120 
ORDER BY salary ASC

#案例2:将员工编号>120的员工信息进行工资的降序
SELECT *
FROM employees
WHERE employee_id >120 
ORDER BY salary DESC

#二、按表达式排序
#案例1:对有奖金的员工,按年薪降序
SELECT CONCAT(first_name,last_name) '姓名', salary*12*(1+IFNULL(commission_pct,0)) '年薪'
FROM employees	
WHERE commission_pct IS NOT NULL
ORDER BY salary*12*(1+IFNULL(commission_pct,0))  DESC

#三、按别名排序
#案例1:对有奖金的员工,按年薪降序
SELECT CONCAT(first_name,last_name) '姓名', salary*12*(1+IFNULL(commission_pct,0)) '年薪'
FROM employees	
WHERE commission_pct IS NOT NULL
ORDER BY '年薪' DESC

### 注意这里:我在SQLyog按别名排序 失败 原因未知

#四、按函数的结果排序
#案例1:按姓名的字数长度升序
SELECT LENGTH(last_name) '姓名长度',last_name
FROM employees
ORDER BY LENGTH(last_name)

#五、按多个字段排序
#案例1:查询员工的姓名、工资、部门编号、先按工资升序,再按部门编号降序
SELECT  CONCAT(first_name,last_name) '姓名',salary '工资',department_id '部门编号'
FROM employees
ORDER BY salary ASC,department_id DESC



#六、按列数排序    列从1开始

SELECT *
FROM employees
ORDER BY 1

进阶四:常见函数

/*
函数:类似于java中学过的“方法”,为了解决某个问题,将编写的一系列的命令集合封装在一起,对外仅暴露接口,供外部调用

1、自定义方法(函数)
2、调用方法(函数)
	叫什么 :函数名
	干什么 :函数功能

常见函数:
	字符函数
		concat
		substring
		length
		char_length
		upper
		lower
		trim
		left
		right
		lpad
		rpad
		instr
		strcmp
	数学函数
		abc
		ceil
		floor
		round
		truncate
		mod
	日期函数
		now
		curtime
		curdate
		datediff
		date_format
		str_to_date
	流程控制函数
		if
		case

*/


#一、字符函数
#1、 concat 拼接字符 拼接在结果集中,可以自定义字符或使用已有的列名拼接

SELECT CONCAT('hello,',first_name,last_name) 备注 
FROM employees;

#2、length 获取字节长度   note: 一个汉字占3个字节
SELECT LENGTH('hello,你好')

#3、char_length 获取字符长度  note:这里是字符;一个汉字、字母、数字、都是字符
SELECT CHAR_LENGTH('hello,你好')

#4、substring 截取子串      
/*
注意: 起始索引从1开始
substring(str,起始索引,截取的字符长度)
substring(str,起始索引)
*/
SELECT SUBSTRING('老鼠好像爱上了猫',5,4) 

#5、instr 获取字符第一次出现的index
SELECT INSTR('abcsd','c')

#6、 trim  去除前后指定字符,默认去除空格
SELECT TRIM(' hello,sql ')
SELECT TRIM('x' FROM 'xxxxx你xx好xxxxxx') 

#7、lpad/rpad  左填充/右填充
/*
	lpad/rpad(str,显示字符长度,需填充的字符)
*/
SELECT LPAD('王二狗',5,'他是')
SELECT RPAD('王二狗',5,'是他')

#8、upper/lower  变大写/变小写

#案例: 查询员工表的姓名,要求格式:姓首字符大写,其他字符小写,名所有字符大写,且行和名之间用_分割,最后起别名 ‘OUTPUT’
# 新手开始要一个一个模块写,各模块写好再拼接在一起
SELECT CONCAT(CONCAT(UPPER(SUBSTRING(first_name,1,1)),LOWER(SUBSTRING(first_name,2))),'_',UPPER(last_name)) AS 'OUTPUT'
FROM employees

#9、strcmp 比较两个字符大小

SELECT	STRCMP('qqq','QQQ');


#10、 left/right 截取子串   从左截取/右截取
SELECT LEFT('王二狗',1)
SELECT RIGHT('王二狗',1)



#二、数学函数

1、 ABS 绝对值
SELECT ABS(-2.4);

2、 CEIL 向上取整  返回>=该参数的最小整数
SELECT CEIL(1.09)
SELECT CEIL(-1.09)

3、 FLOOR 向下取整,返回<=该参数的最大整数
SELECT FLOOR(1.09)

4、 ROUND 四舍五入
SELECT ROUND(3.1415)
SELECT ROUND(3.5515)

5TRUNCATE 截断    TRUNCATE(number,小数点位数)
SELECT TRUNCATE(1.824213,1)

6、 MOD 取余
SELECT MOD(-10,3)



#三、日期函数

1、 NOW 获取当前日期时间
SELECT NOW()

2、 CURDATE 获取当前年月日
SELECT CURDATE()

3、 CURTIME  获取当前时间
SELECT CURTIME()

4、 DATEDIFF   获取两个日期之差 返回天数
SELECT DATEDIFF('2000-1-1','2020-4-1')


5、 DATE_FORMAT 指定日期格式
SELECT DATE_FORMAT('2000-1-1','%Y年%m月%d日')

6、 STR_TO_DATE  按指定格式解析字符串为日期类型
SELECT STR_TO_DATE('3/15 1999','%m/%d %Y')

SELECT * 
FROM employees
WHERE hiredate<STR_TO_DATE('3/15 1999','%m/%d %Y')



#四、流程控制函数

1IF 函数
SELECT IF(100>9,'好','坏')

#案例1:如果有奖金,则显示最终奖金,如果没有,则显示0
SELECT IF(commission_pct IS NULL,0,salary*12*commission_pct)
FROM employees


2CASE 函数

情况1:类似于switch语句,可以实现等值判断
CASE 表达式
WHEN1 THEN 结果1
WHEN2 THEN 结果2
...
ELSE 结果n
END


#案例1:部门编号是30,工资显示为2倍   ,若部门编号是50,工资显示为3倍,若是60,则4倍
# 显示 部门编号  新工资  旧工资
SELECT department_id,salary,
CASE department_id
WHEN 30 THEN  salary*2
WHEN 50 THEN  salary*3
WHEN 60 THEN  salary*4
ELSE salary
END  newsalary
FROM employees

情况2:类似于多重IF语句,实现区间判断
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 结果n

END

#案例1:如果工资>20000 显示A, 工资>15000 B,工资>10000 C ,否则 D
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END grade
FROM employees


###  练习题

#1.显示系统时间(日期+时间)
SELECT NOW()

#2.查询员工号,姓名,工资,以及工资提高20%后的结果(new salary)
SELECT employee_id,last_name,salary, salary*1.2 newSalary
FROM  employees

#3.将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT last_name,LENGTH(last_name) 长度
FROM employees
ORDER BY SUBSTRING(last_name,1,1)

#4. 做一个查询,产生下面的结果
#K_ing earns 24000.00 momthly but wants 72000.00
SELECT CONCAT(last_name,' earns ',salary,' momthly but wants ',salary*3)
FROM employees

#5.使用 case-when ,按照下面的条件  
SELECT last_name,job_id,
CASE job_id
WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_NAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
WHEN 'SA_REP' THEN 'D'
WHEN 'ST_CLERK' THEN 'E'
END Grade
FROM employees

进阶五:分组函数

/*

说明:分组函数往往用于将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数

分组函数清单:

sum(字段名):求和
avg(字段名):求平均数
max(字段名):求最大值
min(字段名):求最小值
count(字段名):计算非字段值的个数

*/

#案例1:查询员工信息表中,所有员工的工资和,平均值,最低工资,最高工资,有工资的个数
SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary)
FROM employees

#案例2:添加筛选条件#1.查询emp表中记录数:
	SELECT COUNT(employee_id) 
	FROM employees
	#2.查询emp表中有佣金的人数:
	SELECT COUNT(salary)
	FROM 	employees
	#3.查询emp表中月薪大于2500的人数:
	SELECT COUNT(employee_id)
	FROM employees
	WHERE salary>2500#5.查询有领导的人数
	SELECT COUNT(employee_id)
	FROM employees
	WHERE manager_id IS NOT NULL

#count的补充介绍: 

#1、count(*) 表示返回结果集的非空行数;
SELECT COUNT(*) 
FROM employees	

#2、搭配distinct实现去重的统计
#案例1:查询有员工的部门个数
SELECT COUNT(DISTINCT department_id)
FROM employees

#案例2:查询每个部门的总工资、平均工资
SELECT DISTINCT department_id,SUM(salary) ,AVG(salary)
FROM  employees
GROUP BY department_id
ORDER BY SUM(salary) DESC,AVG(salary) DESC

进阶六:分组查询 group by

/*
语法:

select 查询列表
from 表名
where 筛选条件
group by 分组列表

执行顺序:
1.from子句
2.where子句
3.gorup by 子句
4.having子句
5.select子句
6.order by子句


特点:
1.查询列表往往是 分组函数和被分组的字段
2.分组查询中的筛选分为两类
			筛选的基表      使用的关键词     位置
分组前筛选		 原始表		 where		   group by的前面

分组后筛选		分组后的结果集     having	   group by的后面

where--group by --having

分组函数作条件只能放在having中


*/

#1)简单的分组
#案例1:查询每个工种的员工平均工资,并平均工资降序
SELECT job_id,AVG(salary) 
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
#案例2:每个领导的手下人数
SELECT manager_id,COUNT(*)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id

#2)可以实现分组前的筛选
#案例1:查询邮箱中包含a字符的 每个部门的最高工资
SELECT department_id,MAX(salary)
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id
#案例2:查询有奖金的每个领导手下员工的平均工资
SELECT manager_id,AVG(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id

#3)可以实现分组后的筛选
#案例1:查询哪个部门的员工个数>5
#分析1:先查询每个部门的员工个数
SELECT department_id,COUNT(*) 员工个数
FROM employees
GROUP BY department_id
#分析2:在刚才的结果基础上,进行筛选
# having 可以对分组后的结果集进行筛选
SELECT department_id,COUNT(*) 员工个数
FROM employees
GROUP BY department_id
HAVING COUNT(*)>5

#案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING	MAX(salary)>12000

#案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资
SELECT manager_id,MIN(salary) 最低工资
FROM  employees
WHERE manager_id >102
GROUP BY manager_id
HAVING MIN(salary)>5000

#4)可以实现排序
#案例:每个工种没有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NULL
GROUP BY job_id
HAVING MAX(salary)>6000 
ORDER BY MAX(salary) DESC

#5)按多个字段分组
#案例:查询每个工种每个部门的最低工资,并按最低工资降序
#提示:工种和部门都是一样,才是一组
SELECT job_id,department_id,MIN(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY job_id,department_id
ORDER BY MIN(salary) DESC

进阶七:连接查询

#-------------------------------SQL92语法-----------


#一、内连接


#一)、等值连接 
/*
语法:
	select 查询列表
	from 表名1 别名1,表名2 别名2,.....
	where 等值连接的连接条件
特点:
	1、为了解决多表中的字段名称重复问题,往往为表起别名
	2、表的顺序无要求

*/
#①简单的两表连接
#案例:查询员工名和部门名
SELECT e.last_name,d.department_name	
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`

#②添加筛选条件
#案例1:查询部门编号>100的部门名和所在的城市名
SELECT department_name,city
FROM departments d,locations l
WHERE l.location_id=d.`location_id` AND d.`department_id`>100

#案例2:查询有奖金的员工名、部门名
SELECT last_name,department_name
FROM employees e,departments d
WHERE e.`commission_pct` IS NOT NULL AND e.`department_id`=d.`department_id`
#案例3:查询城市名中第二个字符为o的部门名和城市名
SELECT d.`department_name`,l.city
FROM departments d,locations l
WHERE d.`location_id`=l.location_id AND l.city LIKE '_o%'

#③添加分组+筛选
#案例1:查询每个城市的部门个数
SELECT city,COUNT(*) 部门个数
FROM departments d ,locations l
WHERE d.`location_id`=l.location_id
GROUP BY city
#案例2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资

#案例3:查询部门中员工个数>10的部门名
#④添加分组+筛选+排序
#案例1:查询部门中员工个数>10的部门名,并按部门名降序
#案例2:查询每个工种的员工个数和工种名,并按个数降序

#⑤三表连接
#案例:查询员工名、部门名、城市名



#二)、非等值

#案例1:查询出员工的工资和工资级别


#三)、自连接



#--------------------------SQL99语法--------------------

#一、内连接
/*
语法:

select 查询列表
form 表名 别名  【inner join】表名2 别名  on 连接条件
where 筛选条件
group by 分组列表
having 分组后筛选
order by 排序列表


SQL92和SQL99的区别

SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高可阅读性;

*/

#一)等值连接
#简单连接
#案例1:查询员工名和部门名
SELECT   e.`last_name`,d.`department_name`
FROM employees e 
INNER JOIN departments d  
ON e.`department_id`=d.`department_id`

#添加筛选条件
#案例1:查询部门编号>100的部门名和所在的城市名
SELECT d.`department_name`,l.city
FROM departments d 
INNER JOIN locations l
ON d.`location_id`=l.location_id
WHERE d.`department_id`>100



#添加分组+筛选
#案例1:查询每个城市的部门个数
SELECT city,COUNT(*) 部门个数
FROM locations 
INNER JOIN departments
ON locations.`location_id`=departments.`location_id`
GROUP BY city
#添加分组+筛选+排序
#案例1:查询部门中员工个数>10的部门名,并按员工个数降序
SELECT department_name,COUNT(*) 员工个数
FROM departments 
INNER JOIN employees
ON departments.`department_id`=employees.`department_id`
GROUP BY departments.department_id
HAVING COUNT(*)>10
ORDER BY COUNT(*) DESC

#二)非等值连接 ...  inner join ....  on  .... between .... and ...
#案例:查询部门编号在10-90之间的员工的工资级别,并按员工级别分组(自己再补充)


#三)自连接
#案例:查询员工名和对应的领导名(自己补充)
SELECT	e.`last_name`,m.last_name
FROM employees e
INNER JOIN employees m
ON e.`manager_id`=m.manager_id

##几个小练习

#查询员工姓名、入职日期并按入职日期升序
SELECT last_name,hiredate
FROM employees
ORDER BY YEAR(hiredate) ,MONTH(hiredate) ,DAY(hiredate) 

#将当前日期显示为:xxxx年xx月xx日
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日')

notice:以下是笔试题,没有数据库

已知学员信息表stuinfo
	stuId
	stuName
	gender
	majorId

已知专业表major
	id
	majorName
已知成绩表result
	id成绩编号
	majorId
	stuid
	score
	
1、查询所有男生的姓名、专业名和成绩、使用SQL92语法和SQL99语法方式实现
SQL92
SELECT stuname,majorname,socre
FROM stuinfo s,major m,result r
WHERE s.stuid=r.stuid AND s.id  =r.majorid 
AND s.gender='男'

SQL99
SELECT stuname,majorname,socre
FROM stuinfo s INNER JOIN major m
ON  s.majorid=m.id
INNER JOIN result r
ON s.stuid =r.stuid
WHERE s.gender='男'

2、查询每个性别的每个专业的平均成绩,并按平均成绩排序
SELECT gender,majorname,AVG(score)
FROM  stuinfo s, major m,result r
WHERE s.majorid=m.id AND s.stuid=r.stuid
GROUP BY s.gender,m.id
ORDER BY AVG(score) DESC







#二、外连接


/*

说明;查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项

应用场景:一般用于查询主表中有但从表中没有的记录

特点:

1、外连接分主从表,两表的顺序不能任意调换
2、左连接的话,left join左边为主表
   右连接的话,right join右边为主表

语法:

select 查询列表

from 表名 别名
left | right |full outer join 表2 别名
on 连接条件
where 筛选条件;




左连接和右连接 会一个就行!一样的

*/


#案例1:查询所有女神记录,以及对应的男神名,如果没有对应的男神,则显示为null

#左连接
SELECT *
FROM beauty b
LEFT JOIN  boys bo ON b.boyfriend_id = bo.id


#案例2:查询哪个女神没有男朋友
# on 仅仅是连接条件 筛选还需要加where
SELECT b.name
FROM beauty b
LEFT JOIN boys bo ON b.boyfriend_id =bo.id
WHERE bo.id IS NULL





#案例3:查询哪个部门没有员工,并显示其部门编号和部门名  
#外连接 不符合连接要求的也会显示出来 并显示null
#即使 把 d表中有  e表中没有的记录查询出来 (有部门 但没有员工)
SELECT  COUNT(*)  部门个数
FROM  departments d LEFT JOIN employees  e ON  e.`department_id`=d.`department_id`
WHERE 	e.department_id IS NULL


#练习
#查询哪个城市没有部门   有城市 没有部门
SELECT *
FROM locations l LEFT JOIN departments d ON l.location_id=d.`location_id`
WHERE d.`location_id` IS NULL

#查询部门名为SAL或IT的员工信息
SELECT *
FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id`
WHERE d.`department_name`='SAL' OR D.`department_name`='IT'



进阶八:分页查询

/*
应用场景:当页面上的数据,一页显示不全,则需要分页显示

分页查询的sql命令请求数据库服务器-->服务器响应查询到的多条数据-->前台页面



语法:

select 查询列表
from 表名1 别名
join 表2 别名
on 连接条件
where 筛选条件
group by 分组列表
having 后组后筛选
order by 排序列表
limit 起始条目索引,显示的条目数
*/

/*
执行顺序:

1.from子句
2.join子句
3.on子句
4.where子句
5.group by子句
6.having 子句
7.select 子句
8.order by子句
9.limit子句


特点:
1.起始条目索引从0开始,默认是0
2.limit后面支持两个参数
参数1:显示的起始条目索引
参数2:条目数

公式:

假如要显示的页数是page,每页显示的条目数为size

select *
from employees
limi (page-1)*size,size

page     size=10
1                       limit 0,10
2			limit 10,10
3			limit 20,10
4			limit 30,10

*/


#案例1:查询员工信息表的前5条
SELECT *FROM employees LIMIT 0,5
#完全等价
SELECT *FROM employees LIMIT 5

#案例2:查询有奖金的,且工资较高的第11名到第20名
SELECT last_name,salary
FROM employees
WHERE commission_pct IS NOT NULL 
ORDER BY salary DESC
LIMIT 10,10





进阶九:联合查询

/*
说明:当查询结果来自于多张表,但多张表之间没有关联,这个时候往往使用联合查询,也称为union查询

语法:
select 查询列表  from 表1 where 筛选条件

特点:

1、多条待联合的查询语句的查询列数必须一致,查询类型、字段意义一致
2、union实现去重查询
   union all 实现全部查询,包含重复项
*/

#案例:查询所有国家的年龄>20岁的用户信息

SELECT *FROM  chinese WHERE age >20 UNION 
SELECT *FROM  uas WHERE age >20 


#案例2:查询所有国家的用户姓名和年龄

SELECT uname,uage,FROM usa
UNION
SELECT NAME ,age FROM chinese;


#案例3:union自动去重/union all 可以出现重复项
SELECT 1,'范冰冰' 
UNION	ALL
SELECT 1,'范冰冰' 
UNION	ALL
SELECT 1,'范冰冰' 
UNION	ALL
SELECT 1,'范冰冰' 

你可能感兴趣的:(Mysql)