第十三章、练习题.sql 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244
  1. #第十三章、练习题
  2. #基础练习
  3. #练习1
  4. #已经存在数据库test04_emp,两张表emp2和dept2
  5. CREATE DATABASE test04_emp;
  6. USE test04_emp;
  7. CREATE TABLE emp2(
  8. id INT,
  9. emp_name VARCHAR(15)
  10. );
  11. CREATE TABLE dept2(
  12. id INT,
  13. dept_name VARCHAR(15)
  14. );
  15. #题目:
  16. #1、向表emp2的id列中添加PRIMARY KEY约束
  17. ALTER TABLE emp2
  18. ADD PRIMARY KEY(id);
  19. #2、向表dept2的id列中添加PRIMARY KEY约束
  20. ALTER TABLE dept2
  21. ADD PRIMARY KEY(id);
  22. #3、向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之向关联的列是dept2表中的id列
  23. ALTER TABLE emp2
  24. ADD dept_id INT;
  25. DESC emp2;
  26. ALTER TABLE emp2
  27. ADD CONSTRAINT fk_emp2_deptid FOREIGN KEY (dept_id) REFERENCES dept2(id);
  28. ######################################################################
  29. #练习2
  30. #承接《第11章_数据处理之增删改》的综合案例
  31. #1、创建数据库test01_library
  32. #2、创建表books,表结构如下:
  33. /*
  34. 字段名 字段说明 数据类型
  35. id 书编号 INT
  36. name 书名 VARCHAR(50)
  37. authors 作者 VARCHAR(100)
  38. price 价格 FLOAT
  39. pubdate 出版日期 YEAR
  40. note 说明 VARCHAR(100)
  41. num 库存 INT
  42. */
  43. #数据库在第11章时已经创建,第1题和第2题可直接使用
  44. USE test01_library;
  45. DESC books;
  46. #3、使用ALTER语句给books按如下要求增加相应的约束
  47. /*
  48. 字段名 字段说明 数据类型 主键 外键 非空 唯一 自增
  49. id 书编号 INT(11) 是 否 是 是 是
  50. name 书名 VARCHAR(50) 否 否 是 否 否
  51. authors 作者 VARCHAR(100) 否 否 是 否 否
  52. price 价格 FLOAT 否 否 是 否 否
  53. pubdate 出版日期 YEAR 否 否 是 否 否
  54. note 说明 VARCHAR(100) 否 否 否 否 否
  55. num 库存 INT(11) 否 否 是 否 否
  56. */
  57. #为id字段添加约束
  58. #方式一(我做的)
  59. ALTER TABLE books
  60. ADD PRIMARY KEY(id);
  61. ALTER TABLE books
  62. MODIFY id INT AUTO_INCREMENT;
  63. #方式二(老师讲的另一种方法)
  64. ALTER TABLE books
  65. MODIFY id INT PRIMARY KEY AUTO_INCREMENT;
  66. #为name字段添加约束
  67. ALTER TABLE books
  68. MODIFY name VARCHAR(50) NOT NULL;
  69. #为authors字段添加约束
  70. ALTER TABLE books
  71. MODIFY authors VARCHAR(100) NOT NULL;
  72. #为price字段添加约束
  73. ALTER TABLE books
  74. MODIFY price FLOAT NOT NULL;
  75. #为pubdate字段添加约束
  76. ALTER TABLE books
  77. MODIFY pubdate YEAR NOT NULL;
  78. #为num字段添加约束
  79. ALTER TABLE books
  80. MODIFY num INT NOT NULL;
  81. DESC books;
  82. ######################################################################
  83. #练习3
  84. #题目
  85. #1、创建数据库test04_company
  86. CREATE DATABASE IF NOT EXISTS test04_company;
  87. USE test04_company;
  88. #2、按照下表给出的表结构在test04_company数据库中创建两个数据表offices和employees
  89. #offices表:
  90. /*
  91. 字段名 数据类型 主键 外键 非空 唯一 自增
  92. officeCode INT(10) 是 否 是 是 否
  93. city VARCHAR(50) 否 否 是 否 否
  94. address VARCHAR(50) 否 否 否 否 否
  95. country VARCHAR(50) 否 否 是 否 否
  96. postalCode VARCHAR(15) 否 否 否 是 否
  97. */
  98. #employees表:
  99. /*
  100. 字段名 数据类型 主键 外键 非空 唯一 自增
  101. employeeNumber INT(11) 是 否 是 是 是
  102. lastName VARCHAR(50) 否 否 是 否 否
  103. firstName VARCHAR(50) 否 否 是 否 否
  104. mobile VARCHAR(25) 否 否 否 是 否
  105. officeCode INT(10) 否 是 是 否 否
  106. jobTitle VARCHAR(50) 否 否 是 否 否
  107. birth DATETIME 否 否 是 否 否
  108. note VARCHAR(255) 否 否 否 否 否
  109. sex VARCHAR(5) 否 否 否 否 否
  110. */
  111. CREATE TABLE IF NOT EXISTS offices(
  112. officeCode INT PRIMARY KEY, #老师写的:officeCode INT(10) PRIMARY KEY,
  113. city VARCHAR(50) NOT NULL,
  114. address VARCHAR(50),
  115. country VARCHAR(50) NOT NULL,
  116. postalCode VARCHAR(15) UNIQUE
  117. );
  118. DESC offices;
  119. CREATE TABLE IF NOT EXISTS employees(
  120. employeeNumber INT PRIMARY KEY AUTO_INCREMENT,
  121. lastName VARCHAR(50) NOT NULL,
  122. firstName VARCHAR(50) NOT NULL,
  123. mobile VARCHAR(25) UNIQUE,
  124. officeCode INT NOT NULL,
  125. jobTitle VARCHAR(50) NOT NULL,
  126. birth DATETIME NOT NULL,
  127. note VARCHAR(255),
  128. sex VARCHAR(5),
  129. CONSTRAINT fk_emp_offcode FOREIGN KEY(officeCode) REFERENCES offices(officeCode)
  130. );
  131. DESC employees;
  132. #3、将表employees的mobile字段修改到officeCode字段后面
  133. ALTER TABLE employees
  134. MODIFY mobile VARCHAR(25) AFTER officeCode;
  135. #4、将表employees的birth字段名改为employee_birth
  136. ALTER TABLE employees
  137. CHANGE birth employee_birth DATETIME;
  138. #5、修改sex字段,数据类型为CHAR(1),非空约束
  139. ALTER TABLE employees
  140. MODIFY sex CHAR(1) NOT NULL;
  141. #6、删除字段note
  142. ALTER TABLE employees
  143. DROP COLUMN note;
  144. #7、增加字段名favoriate_activity,数据类型为VARCHAR(100)
  145. ALTER TABLE employees
  146. ADD favoriate_activity VARCHAR(100);
  147. #8、将表employees名称修改为employees_info
  148. RENAME TABLE employees
  149. TO employees_info;
  150. DESC employees_info;
  151. ######################################################################
  152. #拓展练习
  153. #练习1
  154. #创建数据库test04_Market,在test04_Market中创建数据表customers。
  155. #customers表结构如下所示,按以下要求进行操作。
  156. /*
  157. 字段名 数据类型 主键 外键 非空 唯一 自增
  158. c_num INT(11) 是 否 是 是 是
  159. c_name VARCHAR(50) 否 否 否 否 否
  160. c_contact VARCHAR(50) 否 否 否 否 否
  161. c_city VARCHAR(50) 否 否 否 否 否
  162. c_birth DATETIME 否 否 是 否 否
  163. */
  164. #1、创建数据库test04_Market。
  165. CREATE DATABASE test04_Market;
  166. USE test04_Market;
  167. #2、创建数据表customers,在c_num字段上添加主键约束和自增约束,在c_birth字段上添加非空约束。
  168. CREATE TABLE customers(
  169. c_num INT PRIMARY KEY AUTO_INCREMENT,
  170. c_name VARCHAR(50),
  171. c_contact VARCHAR(50),
  172. c_city VARCHAR(50),
  173. c_birth DATETIME NOT NULL
  174. );
  175. DESC customers;
  176. #3、将c_contact字段插入c_birth字段后面。
  177. ALTER TABLE customers
  178. MODIFY c_contact VARCHAR(50) AFTER c_birth;
  179. #4、将c_name字段数据类型改为VARCHAR(70)。
  180. ALTER TABLE customers
  181. MODIFY c_name VARCHAR(70);
  182. #5、将c_contact字段改名为c_phone。
  183. ALTER TABLE customers
  184. CHANGE c_contact c_phone VARCHAR(50);
  185. #6、增加c_gender字段,数据类型为CHAR(1)。
  186. ALTER TABLE customers
  187. ADD COLUMN c_gender CHAR(1);
  188. #7、将表名修改为customers_info。
  189. RENAME TABLE customers
  190. TO customers_info;
  191. DESC customers_info;
  192. #8、删除字段c_city。
  193. ALTER TABLE customers_info
  194. DROP c_city;
  195. #在test04_Market中创建数据表orders。orders表结构如下所示,按以下要求进行操作。
  196. /*
  197. 字段名 数据类型 主键 外键 非空 唯一 自增
  198. o_num INT(11) 是 否 是 是 是
  199. o_date DATE 否 否 否 否 否
  200. c_id INT(11) 否 是 否 否 否
  201. */
  202. #1、创建数据表orders,在o_num字段上添加主键约束和自增约束,在c_id字段上添加外键约束,关联customers表中的主键c_num。
  203. CREATE TABLE IF NOT EXISTS orders(
  204. o_num INT PRIMARY KEY AUTO_INCREMENT,
  205. o_date DATE,
  206. c_id INT,
  207. CONSTRAINT fk_orders_c_id FOREIGN KEY(c_id) REFERENCES customers_info(c_num)
  208. );
  209. DESC orders;
  210. #2、删除orders表的外键约束,然后删除表customers。
  211. #查看约束信息,主要是查看外键约束名
  212. SELECT * FROM information_schema.TABLE_CONSTRAINTS
  213. WHERE table_name = 'orders';
  214. #删除外键约束
  215. ALTER TABLE orders
  216. DROP FOREIGN KEY fk_orders_c_id;
  217. #查看索引名
  218. SHOW INDEX FROM orders;
  219. #删除索引
  220. ALTER TABLE orders
  221. DROP INDEX fk_orders_c_id;
  222. ######################################################################
  223. #练习2
  224. #创建数据表pet,并对表进行插入、更新与删除操作。pet表结构如下所示。
  225. #pet表结构
  226. /*
  227. 字段名 字段说明 数据类型 主键 外键 非空 唯一 自增
  228. name 宠物名称 ARCHAR(20) 否 否 是 否 否
  229. owner 宠物主人 ARCHAR(20) 否 否 否 否 否
  230. species 种类 ARCHAR(20) 否 否 是 否 否
  231. sex 性别 CHAR(1) 否 否 是 否 否
  232. birth 出生日期 YEAR 否 否 是 否 否
  233. death 死亡日期 TEAR 否 否 否 否 否
  234. */
  235. #pet表中记录
  236. /*
  237. name owner species sex birth death
  238. Fluffiy Harold cat f 2003 2010
  239. Claws Gwen cat m 2004 NULL
  240. Buffiy NULL dog f 2009 NULL
  241. Fang Benny dog m 2000 NULL
  242. Bowser Diane dog m 2003 2009
  243. Chirpy NULL bird f 2008 NULL
  244. */
  245. #1、首先创建数据表pet,使用不同的方法将表记录插入到pet表中。
  246. #创建表
  247. CREATE TABLE pet(
  248. `name` VARCHAR(20) NOT NULL,
  249. `owner` VARCHAR(20),
  250. species VARCHAR(20) NOT NULL,
  251. sex CHAR(1) NOT NULL,
  252. birth YEAR NOT NULL,
  253. death YEAR
  254. );
  255. DESC pet;
  256. #向表中插入数据
  257. INSERT INTO pet(name,owner,species,sex,birth,death)
  258. VALUES('Fluffiy','Harold','cat','f','2003','2010');
  259. INSERT INTO pet VALUES
  260. ('Claws','Gwen','cat','m','2004',NULL),
  261. ('Buffiy',NULL,'dog','f','2009',NULL),
  262. ('Fang','Benny','dog','m','2000',NULL),
  263. ('Bowser','Diane','dog','m','2003',2009),
  264. ('Chirpy',NULL,'bird','f','2008',NULL);
  265. SELECT * FROM pet;
  266. #2、使用UPDATE语句将名称为Fang的狗的主人改为Kevin。
  267. UPDATE pet
  268. SET owner = 'Kevin'
  269. WHERE name = 'Fang';
  270. #3、将没有主人的宠物owner字段值都改为Duck。
  271. UPDATE pet
  272. SET owner = 'Duck'
  273. WHERE owner IS NULL;
  274. #4、删除已死亡的宠物记录。
  275. DELETE FROM pet
  276. WHERE death IS NOT NULL;
  277. #5、删除所有表中的记录。
  278. DELETE FROM pet;
  279. SELECT * FROM pet;
  280. ######################################################################
  281. #练习3
  282. #1、创建数据库:test_company
  283. CREATE DATABASE IF NOT EXISTS test_company;
  284. USE test_company;
  285. #2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。
  286. /*
  287. A、部门表(department):部门编号(depid)。部门名称(depname)。
  288. 部门简介(depinfo);其中部门编号为主键。
  289. B、雇员表(employee):雇员编号(empid),姓名(name),性别(sex),
  290. 职称(title),出生日期(birthday),所在部门编号(depid);其中:
  291. 雇员编号为主键;
  292. 部门编号为外键,外键约束等级为(on update cascade和on delete set null);
  293. 性别默认为男;
  294. C、工资表(salary):雇员编号(empid),基本工资(basesalary),职务
  295. 工资(titlesalary),扣除(deduction)。其中雇员编号为主键。
  296. */
  297. #部门表
  298. CREATE TABLE department(
  299. depid INT,
  300. depname VARCHAR(20) NOT NULL,
  301. depinfo VARCHAR(50),
  302. PRIMARY KEY(depid)
  303. );
  304. DESC department;
  305. #雇员表
  306. CREATE TABLE employee(
  307. empid INT PRIMARY KEY,
  308. name VARCHAR(20) NOT NULL,
  309. sex CHAR(1) NOT NULL DEFAULT '男',
  310. title VARCHAR(15),
  311. birthday DATE NOT NULL,
  312. depid INT,
  313. CONSTRAINT fk_emp_depid FOREIGN KEY(depid) REFERENCES department(depid) ON UPDATE CASCADE ON DELETE SET NULL
  314. );
  315. DESC employee;
  316. #工资表
  317. CREATE TABLE salary(
  318. empid INT PRIMARY KEY,
  319. basesalary DECIMAL(10,2),
  320. titlesalary DECIMAL(10,2),
  321. deduction DECIMAL(10,2)
  322. );
  323. DESC salary;
  324. #3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为
  325. #(on update cascade和on delete cascade)
  326. ALTER TABLE salary
  327. ADD CONSTRAINT fk_sal_empid FOREIGN KEY(empid) REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE;
  328. #4、添加数据如下:
  329. #部门表:
  330. /*
  331. 部门编号 部门名称 部门简介
  332. 111 生产部 NULL
  333. 222 销售部 NULL
  334. 333 人事部 人力资源管理
  335. */
  336. #雇员表:
  337. /*
  338. 雇员编号 姓名 性别 职称 出生日期 所在部门编号
  339. 1001 张三 男 高级工程师 1975-1-1 111
  340. 1002 李四 女 助工 1985-1-1 111
  341. 1003 王五 男 工程师 1978-11-11 222
  342. 1004 张六 男 工程师 1999-1-1 222
  343. */
  344. #工资表:
  345. /*
  346. 雇员编号 基本工资 职务工资 扣除
  347. 1001 2200 1100 200
  348. 1002 1200 200 NULL
  349. 1003 2900 700 200
  350. 1004 1950 700 150
  351. */
  352. #添加部门表数据
  353. INSERT INTO department VALUES
  354. (111,'生产部',NULL),
  355. (222,'销售部',NULL),
  356. (333,'人事部','人力资源管理');
  357. SELECT * FROM department;
  358. #添加雇员表数据
  359. INSERT INTO employee VALUES
  360. (1001,'张三',DEFAULT,'高级工程师','1975-1-1',111),
  361. (1002,'李四','女','助工','1985-1-1',111),
  362. (1003,'王五','男','工程师','1978-11-11',222),
  363. (1004,'张六',DEFAULT,'工程师','1999-1-1',222);
  364. SELECT * FROM employee;
  365. #添加工资表数据
  366. INSERT INTO salary VALUES
  367. (1001,2200,1100,200),
  368. (1002,1200,200,NULL),
  369. (1003,2900,700,200),
  370. (1004,1950,700,150);
  371. SELECT * FROM salary;
  372. #5、查询出每个雇员的雇员编号、姓名、职称、所在部门名称、应发工资(基本工资+职务工资),实发工资(基本工资+职务工资-扣除)
  373. SELECT emp.empid,emp.name,emp.title,dep.depname,sal.basesalary+sal.titlesalary AS '应发工资',sal.basesalary+sal.titlesalary-IFNULL(sal.deduction,0) AS '实发工资'
  374. FROM employee AS emp JOIN department dep JOIN salary AS sal
  375. ON emp.depid = dep.depid AND emp.empid = sal.empid;
  376. #6、查询销售部门的雇员姓名及其基本工资
  377. SELECT emp.name,sal.basesalary
  378. FROM department dep JOIN employee emp JOIN salary sal
  379. ON dep.depid = emp.depid AND emp.empid = sal.empid
  380. WHERE dep.depname = '销售部';
  381. #7、查询姓“张”且年龄小于40的员工的全部信息和年龄
  382. SELECT *,YEAR(NOW())-YEAR(birthday) AS '年龄'
  383. FROM employee
  384. WHERE name LIKE '张%' AND (YEAR(NOW())-YEAR(birthday)) < 40;
  385. #8、查询所有男员工的基本工资和职务工资
  386. SELECT * FROM employee;
  387. SELECT emp.empid,emp.name,sal.basesalary,sal.titlesalary
  388. FROM employee emp JOIN salary sal
  389. ON emp.empid = sal.empid
  390. WHERE emp.sex = '男';
  391. #9、查询基本工资低于2000的员工姓名和职称、所在部门名称
  392. SELECT emp.name,emp.title,dep.depname
  393. FROM department dep JOIN employee emp JOIN salary sal
  394. ON dep.depid = emp.depid AND emp.empid = sal.empid
  395. WHERE sal.basesalary < 2000;
  396. #10、查询员工总数
  397. SELECT COUNT(*)
  398. FROM employee;
  399. #11、查询部门总数
  400. SELECT COUNT(*)
  401. FROM department;
  402. #12、查询应发工资的平均工资和最高工资、最低工资
  403. SELECT AVG(basesalary+titlesalary) AS '平均工资',MAX(basesalary+titlesalary) AS '最高工资',MIN(basesalary+titlesalary) AS '最低工资'
  404. FROM salary;
  405. #13、按照部门统计应发工资的平均工资
  406. SELECT depid,AVG(basesalary+titlesalary)
  407. FROM employee JOIN salary
  408. ON employee.empid = salary.empid
  409. GROUP BY employee.depid
  410. #14、找出部门基本工资的平均工资低于2000的
  411. SELECT depid,AVG(basesalary) AS avgsal
  412. FROM employee JOIN salary
  413. ON employee.empid = salary.empid
  414. GROUP BY employee.depid
  415. HAVING avgsal < 2000;
  416. #15、按照员工编号、姓名、基本工资、职务工资、扣除,并按照职务升序排列,如果职务工资相同,再按照基本工资升序排列。
  417. SELECT emp.empid,emp.name,emp.title,basesalary,titlesalary,deduction
  418. FROM employee emp JOIN salary sal
  419. ON emp.empid = sal.empid
  420. ORDER BY emp.title ASC,basesalary ASC;
  421. #16、查询员工编号、姓名,出生日期,及年龄段。其中,如果80年之前出生的,定为“老年”;80后定为“中年”,90后定为“青壮年”
  422. SELECT empid,name,birthday,
  423. CASE WHEN YEAR(birthday) < 1980 THEN '老年'
  424. WHEN YEAR(birthday) < 1990 THEN '中年'
  425. ELSE '青壮年' END AS '年龄段'
  426. FROM employee;
  427. #17、查询所有的员工信息,和他所在的部门名称
  428. SELECT emp.*,dep.depname
  429. FROM employee emp LEFT JOIN department dep
  430. ON emp.depid = dep.depid
  431. #18、查询所有部门信息,和该部门的员工信息
  432. SELECT dep.*,emp.*
  433. FROM department dep LEFT JOIN employee emp
  434. ON dep.depid = emp.depid
  435. #19、查询所有职位中含“工程师”的男员工的人数
  436. SELECT COUNT(*)
  437. FROM employee
  438. WHERE sex = '男' AND title LIKE '%工程师%';
  439. #20、查询每个部门的男生和女生的人数和平均基本工资
  440. SELECT dep.depid,emp.sex,COUNT(*),AVG(sal.basesalary)
  441. FROM department dep JOIN employee emp JOIN salary sal
  442. ON dep.depid = emp.depid AND emp.empid = sal.empid
  443. GROUP BY dep.depid,emp.sex
  444. ######################################################################
  445. #练习4:
  446. #1、创建一个数据库:test_school
  447. CREATE DATABASE IF NOT EXISTS test_school;
  448. USE test_school;
  449. #2、创建如下表格:
  450. #表1 Department表的定义
  451. /*
  452. 字段名 字段描述 数据类型 主键 外键 非空 唯一
  453. DepNo 部门号 INT(10) 是 否 是 是
  454. DepName 部门名称 VARCHAR(20) 否 否 是 否
  455. DepNote 部门备注 VARCHAR(50) 否 否 否 否
  456. */
  457. #表2 Teacher表的定义
  458. /*
  459. 字段名 字段描述 数据类型 主键 外键 非空 唯一
  460. Number 教工号 INT 是 否 是 是
  461. Name 姓名 VARCHAR(30) 否 否 是 否
  462. Sex 性别 VARCHAR(4) 否 否 否 否
  463. Birth 出生日期 DATE 否 否 否 否
  464. DepNo 部门号 INT 否 是 否 否
  465. Salary 工资 FLOAT 否 否 否 否
  466. Address 家庭住址 VARCHAR(100) 否 否 否 否
  467. */
  468. #创建表1
  469. CREATE TABLE Department(
  470. DepNo INT(10) PRIMARY KEY,
  471. DepName VARCHAR(20) NOT NULL,
  472. DepNote VARCHAR(50)
  473. );
  474. DESC Department;
  475. #创建表2
  476. CREATE TABLE Teacher(
  477. Number INT PRIMARY KEY,
  478. Name VARCHAR(30) NOT NULL,
  479. Sex VARCHAR(4),
  480. Birth DATE,
  481. DepNo INT,
  482. Salary FLOAT,
  483. Address VARCHAR(100),
  484. CONSTRAINT fk_teach_depno FOREIGN KEY(DepNo) REFERENCES Department(Depno)
  485. );
  486. DESC Teacher;
  487. #3、添加记录
  488. /*
  489. DepNo DepName DepNote
  490. 601 软件技术系 软件技术等专业
  491. 602 网络技术系 多媒体技术等专业
  492. 603 艺术设计系 广告艺术设计等专业
  493. 604 管理工程系 连锁经营管理等专业
  494. */
  495. /*
  496. Number Name Sex Birth DepNo Salary Address
  497. 2001 Tom 女 1970-01-10 602 4500 四川省绵阳市
  498. 2002 Lucy 男 1983-12-18 601 2500 北京市昌平区
  499. 2003 Mike 男 1990-06-01 604 1500 重庆市渝中区
  500. 2004 James 女 1980-10-20 602 3500 四川省成都市
  501. 2005 Jack 男 1975-05-30 603 1200 重庆市南岸区
  502. */
  503. #向部门表添加记录
  504. INSERT INTO Department VALUES
  505. (601,'软件技术系','软件技术等专业'),
  506. (602,'网络技术系','多媒体技术等专业'),
  507. (603,'艺术设计系','广告艺术设计等专业'),
  508. (604,'管理工程系','连锁经营管理等专业');
  509. SELECT * FROM Department;
  510. #向教师表中添加记录
  511. INSERT INTO Teacher VALUES
  512. (2001,'Tom','女','1970-01-10',602,4500,'四川省绵阳市'),
  513. (2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平区'),
  514. (2003,'Mike','男','1990-06-01',604,1500,'重庆市渝中区'),
  515. (2004,'James','女','1980-10-20',602,3500,'四川省成都阳市'),
  516. (2005,'Jack','男','1975-05-30',603,1200,'重庆市南岸区');
  517. SELECT * FROM Teacher;
  518. #4、用SELECT语句查询Teacher表的所有记录
  519. SELECT * FROM Teacher;
  520. #5、找出所有其家庭地址中含有“北京”的教师的教工号及部门名称,要求显示结果中各列标题用中文别名表示。
  521. SELECT teach.Number AS '教工号',dep.DepName AS '部门名称',teach.Address
  522. FROM Teacher teach LEFT JOIN Department dep
  523. ON teach.DepNo = dep.DepNo
  524. WHERE teach.Address LIKE '%北京%';
  525. #6、获得Teacher表中工资最高的教工号和姓名。
  526. #我做的
  527. SELECT Number,Name,MAX(Salary)
  528. FROM Teacher
  529. #老师给的
  530. #方法一
  531. SELECT Number,Name
  532. FROM Teacher
  533. WHERE salary =(SELECT MAX(Salary) FROM Teacher);
  534. #方法二
  535. SELECT Number,Name
  536. FROM Teacher
  537. ORDER BY Salary DESC LIMIT 0,1;
  538. #7、找出所有收入在2500~4000之间的教工号。
  539. SELECT Number
  540. FROM Teacher
  541. WHERE Salary BETWEEN 2500 AND 4000;
  542. #8、查找在网络技术系工作的教师的姓名、性别和工资。
  543. SELECT Name,Sex,Salary
  544. FROM Teacher teach JOIN Department dep
  545. ON teach.DepNo = dep.DepNo
  546. WHERE dep.DepName = '网络技术系'
  547. ######################################################################
  548. #练习5
  549. #1、建立数据库test_student
  550. CREATE DATABASE IF NOT EXISTS test_student;
  551. USE test_student;
  552. #2、建立以下三张表,并插入记录
  553. #Table:Classes
  554. /*
  555. 专业 班级 姓名 性别 座位
  556. 计算机网络 1班 张三 男 8
  557. 软件工程 2班 李四 男 12
  558. 计算机维护 1班 王五 男 9
  559. 计算机网络 2班 LILY 女 15
  560. 软件工程 1班 小强 男 20
  561. 计算机维护 1班 CoCo 女 18
  562. */
  563. #Table:Score
  564. /*
  565. 姓名 英语 数据 语文
  566. 张三 65 75 98
  567. 李四 87 45 86
  568. 王五 98 86 65
  569. LILY 75 86 87
  570. 小强 85 60 58
  571. CoCo 96 87 70
  572. */
  573. #Table:Records
  574. /*
  575. 姓名 记录
  576. 小强 迟到
  577. 小强 事假
  578. 李四 旷课
  579. 李四 旷课
  580. 李四 迟到
  581. CoCo 病假
  582. LILY 事假
  583. */
  584. #创建表一:Classes
  585. CREATE TABLE classes(
  586. major VARCHAR(20) NOT NULL,
  587. class VARCHAR(10) NOT NULL,
  588. sname VARCHAR(10) NOT NULL,
  589. sex CHAR(1) DEFAULT '男',
  590. seat INT UNIQUE NOT NULL
  591. );
  592. #创建表二:score
  593. CREATE TABLE score(
  594. sname VARCHAR(10) NOT NULL,
  595. english INT NOT NULL,
  596. math INT NOT NULL,
  597. chinese INT NOT NULL
  598. );
  599. #创建表三:Records
  600. CREATE TABLE records(
  601. sname VARCHAR(10) NOT NULL,
  602. record VARCHAR(10)
  603. );
  604. #向classes表插入数据
  605. INSERT INTO classes VALUES
  606. ('计算机网络','1班','张三',DEFAULT,8),
  607. ('软件工程','2班','李四',DEFAULT,12),
  608. ('计算机维护','1班','王五','男',9),
  609. ('计算机网络','2班','LILY','女',15),
  610. ('软件工程','1班','小强',DEFAULT,20),
  611. ('计算机维护','1班','CoCo','女',18);
  612. SELECT * FROM classes;
  613. #向score表插入数据
  614. INSERT INTO score VALUES
  615. ('张三',65,75,98),
  616. ('李四',87,45,86),
  617. ('王五',98,86,65),
  618. ('LILY',75,86,87),
  619. ('小强',85,60,58),
  620. ('Coco',96,87,70);
  621. SELECT *FROM score;
  622. #向records表插入数据
  623. INSERT INTO records VALUES
  624. ('小强','迟到'),
  625. ('小强','事假'),
  626. ('李四','旷课'),
  627. ('李四','旷课'),
  628. ('李四','迟到'),
  629. ('Coco','病假'),
  630. ('LILY','事假');
  631. SELECT * FROM records;
  632. #3、写出将张三的语文成绩修改为88的SQL语句
  633. UPDATE score
  634. SET chinese = 88
  635. WHERE sname = '张三';
  636. #4、搜索出计算机维护1班各门课程的平均成绩
  637. #我做的,不对
  638. SELECT major,class,AVG(english),AVG(math),AVG(chinese)
  639. FROM score JOIN classes
  640. GROUP BY major,class
  641. HAVING major = '计算机维护' AND class = '1班'
  642. #老师给的参考方法
  643. SELECT AVG(english),AVG(math),AVG(chinese)
  644. FROM score
  645. WHERE sname IN (SELECT sname
  646. FROM classes
  647. WHERE major = '计算机维护' AND class = '1班');
  648. #5、搜索科目有不及格的人的名单
  649. SELECT sname
  650. FROM score
  651. WHERE english < 60 OR math < 60 OR chinese <60;
  652. #6、查询记录2次以上的学生的姓名和各科成绩
  653. SELECT score.*
  654. FROM score JOIN (SELECT sname,COUNT(*)
  655. FROM records
  656. GROUP BY sname
  657. HAVING COUNT(*) >= 2) temp
  658. ON score.sname = temp.sname;
  659. ######################################################################
  660. #练习6
  661. #1、建立数据库:test_xuankedb
  662. CREATE DATABASE IF NOT EXISTS test_xuankedb;
  663. USE test_xuankedb;
  664. #2、建立如下三张表:
  665. /*
  666. 学生表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、
  667. 年龄(Sage)、所在系(Sdept)五个字段,Sno为关键字。
  668. 课程表(Course)由课程号(Cno)、课程名(Cname)、选修课号(Cpno)、
  669. 学分(Ccredit)四个字段,Cno为关键字。
  670. 成绩表SG由学号(Sno)、课程号(Cno)、成绩(Grade)三个字段,
  671. (Sno,Cno)为关键字。
  672. */
  673. #创建学生表
  674. CREATE TABLE IF NOT EXISTS student(
  675. sno INT PRIMARY KEY,
  676. sname VARCHAR(20) NOT NULL,
  677. ssex CHAR(1) NOT NULL,
  678. sage INT NOT NULL,
  679. sdept VARCHAR(40) NOT NULL
  680. );
  681. DESC student;
  682. #创建课程表
  683. CREATE TABLE IF NOT EXISTS course(
  684. cno INT PRIMARY KEY,
  685. cname VARCHAR(20) NOT NULL,
  686. cpno VARCHAR(40),
  687. ccredit INT
  688. );
  689. DESC course;
  690. #创建成绩表
  691. CREATE TABLE IF NOT EXISTS sg(
  692. sno INT,
  693. cno INT,
  694. grade INT,
  695. PRIMARY KEY(sno,cno),
  696. CONSTRAINT fk_s_stu_sno FOREIGN KEY(sno) REFERENCES student(sno),
  697. CONSTRAINT fk_s_cou_sno FOREIGN KEY(cno) REFERENCES course(cno)
  698. );
  699. DESC sg;
  700. #3、向Student表增加“入学时间(Scome)”列,其数据类型为日期型。
  701. ALTER TABLE student
  702. ADD scome DATE;
  703. #4、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
  704. SELECT sno,grade
  705. FROM sg
  706. WHERE cno = 3
  707. ORDER BY grade DESC;
  708. #5、查询学习1号课程的学生最高分数、平均成绩。
  709. SELECT MAX(grade),AVG(grade)
  710. FROM sg
  711. WHERE cno = 1;
  712. #6、查询与“李洋”在同一个系学习的学生。
  713. SELECT *
  714. FROM student
  715. WHERE sdept = (SELECT dept
  716. FROM student
  717. WHERE sname = '李洋'
  718. );
  719. #7、将计算机系全体学生的成绩置零。
  720. UPDATE sg
  721. set grade = 0
  722. WHERE sno IN (SELECT sno
  723. FROM student
  724. WHERE sdept = '计算机系');
  725. #8、删除学生表中学号为05019的学生记录。
  726. DELETE FROM student
  727. WHERE sno = 05019
  728. #9、删除计算机系所有学生的成绩记录。
  729. DELETE FROM sg
  730. WHERE sno IN (SELECT sno
  731. FROM student
  732. WHERE dept = '计算机系');
  733. ######################################################################
  734. #练习7
  735. #1、建立数据库:test_library
  736. CREATE DATABASE IF NOT EXISTS test_library;
  737. USE test_library;
  738. #2、建立如下三个表:
  739. /*
  740. 表一:press出版社 属性:编号pressid(int)、名称pressname(varchar)、
  741. 地址address(varchar)
  742. 表二:sort种类 属性:编号sortno(int)、数量scount(int)
  743. 表三:book图书 属性:编号bid(int)、名称bname(varchar)、
  744. 种类bsortno(int)、出版社编号pressid(int)
  745. */
  746. #创建表一
  747. CREATE TABLE press(
  748. pressid INT PRIMARY KEY,
  749. pressname VARCHAR(30),
  750. address VARCHAR(50)
  751. );
  752. #创建表二
  753. CREATE TABLE sort(
  754. sortno INT PRIMARY KEY,
  755. scount INT
  756. );
  757. #创建表三
  758. CREATE TABLE book(
  759. bid INT PRIMARY KEY,
  760. bname VARCHAR(20),
  761. bsortno INT,
  762. pressid INT,
  763. CONSTRAINT fk_p_b_pid FOREIGN KEY(pressid) REFERENCES press(pressid),
  764. CONSTRAINT fk_s_b_sno FOREIGN KEY(bsortno) REFERENCES sort(sortno)
  765. );
  766. #3、给sort表中添加一列属性:描述describes(varchar)
  767. ALTER TABLE sort
  768. ADD describes VARCHAR(30);
  769. DESC sort;
  770. #4、向三个表中各插入几条数据
  771. #表一:press
  772. /*
  773. pressid pressname address
  774. 100 外研社 上海
  775. 101 北大出版社 北京
  776. 102 教育出版社 北京
  777. */
  778. #表二:sort
  779. /*
  780. sortno scount describes
  781. 11 50 小说
  782. 12 300 科幻
  783. 13 100 神话
  784. */
  785. #表三:book
  786. /*
  787. bid bname bsortno pressid
  788. 1 红与黑 11 100
  789. 2 幻城 12 102
  790. 3 希腊神话 13 102
  791. 4 一千零一夜 13 102
  792. */
  793. #向表一插入数据
  794. INSERT INTO press VALUES
  795. (100,'外研社','上海'),
  796. (101,'北大出版社','北京'),
  797. (102,'教育出版社','北京');
  798. #向表二插入数据
  799. INSERT INTO sort VALUES
  800. (11,50,'小说'),
  801. (12,300,'科幻'),
  802. (13,100,'神话');
  803. #向表三插入数据
  804. INSERT INTO book VALUES
  805. (1,'红与黑',11,100),
  806. (2,'幻城',12,102),
  807. (3,'希腊神话',13,102),
  808. (4,'一千零一夜',13,102);
  809. #5、查询出版社id为100的书的全部信息
  810. SELECT * FROM press;
  811. SELECT * FROM sort;
  812. SELECT * FROM book;
  813. SELECT *
  814. FROM book
  815. WHERE pressid = 100;
  816. #6、查询出版社为外研社的书的全部信息
  817. SELECT *
  818. FROM book
  819. WHERE pressid = (
  820. SELECT pressid
  821. FROM press
  822. WHERE pressname = '外研社'
  823. );
  824. #7、查询图书数量(scount)大于100的种类
  825. SELECT *
  826. FROM sort
  827. WHERE scount > 100;
  828. #8、查询图书种类最多的出版社信息
  829. #我做的
  830. SELECT *
  831. FROM press
  832. WHERE pressid = (
  833. SELECT pressid
  834. FROM book
  835. GROUP BY bsortno
  836. ORDER BY count(*) DESC
  837. LIMIT 0,1
  838. );
  839. #老师给的参考答案
  840. #方式一(报错,无法运行)
  841. SELECT * FROM press WHERE pressid=(
  842. SELECT temp.pressid FROM
  843. (SELECT pressid,MAX(t,c) FROM (SELECT pressid,COUNT(*) AS c FROM book GROUP BY pressid ORDER BY c DESC) AS t) AS temp);
  844. #方式二(可以运行)
  845. SELECT * FROM press WHERE pressid = (
  846. SELECT pressid
  847. FROM (SELECT pressid,bsortno FROM book GROUP BY pressid,bsortno) temp
  848. GROUP BY pressid
  849. ORDER BY COUNT(*) DESC
  850. LIMIT 0,1);
  851. ######################################################################
  852. #练习8
  853. #1、建立数据库:test_tour
  854. CREATE DATABASE IF NOT EXISTS test_tour;
  855. USE test_tour;
  856. #2、建立如下两个表
  857. #agency旅行社表:
  858. /*
  859. 列名(英文名) 列名(中文名) 数据类型 允许空值 说明
  860. Id 旅行社编号 INT NO 主键
  861. Name 旅行社名 VARCHAR NO
  862. Address 旅行社地址 VARCHAR NO
  863. Areaid 所属区域id INT YES
  864. */
  865. #travel旅行线路表
  866. /*
  867. 列名(英文名) 列名(中文名) 数据类型 允许空值 说明
  868. Tid 旅行线路编号 INT NO 主键
  869. Time 所需时间 VARCHAR NO
  870. Position 目的地 VARCHAR NO
  871. Money 花费 FLOAT YES
  872. Aid 所属旅行社id INT NO 外键
  873. Count 报名人数 INT YES
  874. */
  875. #创建旅行社表
  876. CREATE TABLE agency(
  877. id INT PRIMARY KEY,
  878. `name` VARCHAR(20) NOT NULL,
  879. address VARCHAR(100) NOT NULL,
  880. areaid INT
  881. );
  882. DESC agency;
  883. #创建旅行线路表
  884. CREATE TABLE travel(
  885. tid INT PRIMARY KEY,
  886. time VARCHAR(50) NOT NULL,
  887. `position` VARCHAR(100) NOT NULL,
  888. money FLOAT,
  889. aid INT NOT NULL,
  890. count INT,
  891. CONSTRAINT fk_tr_aid FOREIGN KEY travel(aid) REFERENCES agency(id)
  892. );
  893. DESC travel;
  894. #3、添加记录
  895. #agency表数据
  896. /*
  897. id name address
  898. 101 青年旅行社 北京海淀
  899. 102 天天旅行社 天津海院
  900. */
  901. #travel表数据
  902. /*
  903. tid time position money aid rcount
  904. 1 5天 八达岭 3000 101 10
  905. 2 7天 水长城 5000 101 14
  906. 3 8天 水长城 6000 102 11
  907. */
  908. #向表agency添加记录
  909. INSERT INTO agency(id,`name`,address) VALUES
  910. (101,'青年旅行社','北京海淀'),
  911. (102,'天天旅行社','天津海院');
  912. SELECT * FROM agency;
  913. #向表travel添加记录
  914. INSERT INTO travel VALUES
  915. (1,'5天','八达岭',3000,101,10),
  916. (2,'7天','水长城',5000,101,14),
  917. (3,'8天','水长城',6000,102,11);
  918. SELECT * FROM travel;
  919. #4、查出旅行线路最多的旅社
  920. #我做的,分了四步,后一步的代码都包含了前一步的代码
  921. #第一步:对旅行线路表中的旅行社进行分组
  922. SELECT aid,COUNT(*) AS c
  923. FROM travel
  924. GROUP BY aid
  925. #第二步:在第一步的分组结果中,取旅行社统计数量最大值的数量和id
  926. SELECT MAX(new.c),new.aid
  927. FROM (
  928. SELECT aid,COUNT(*) AS c
  929. FROM travel
  930. GROUP BY aid
  931. ) AS new
  932. #第三步:从第二步的表中取出旅行社的id
  933. SELECT maxsheet.aid
  934. FROM (SELECT MAX(new.c),new.aid
  935. FROM (
  936. SELECT aid,COUNT(*) AS c
  937. FROM travel
  938. GROUP BY aid
  939. ) AS new
  940. ) as maxsheet;
  941. #第四步:根据第三步取出的旅行社id,在旅行社表中查出旅行社信息
  942. SELECT *
  943. FROM agency
  944. WHERE id = (SELECT maxsheet.aid
  945. FROM (SELECT MAX(new.c),new.aid
  946. FROM (
  947. SELECT aid,COUNT(*) AS c
  948. FROM travel
  949. GROUP BY aid
  950. ) AS new
  951. ) as maxsheet
  952. );
  953. #老师给的参考答案
  954. SELECT *
  955. FROM agency INNER JOIN (SELECT t.aid,MAX(t.c) FROM (SELECT aid,COUNT(*) AS c FROM travel GROUP BY aid) AS t) temp
  956. ON agency.id = temp.aid;
  957. #5、查出最热门的旅行线路(也就是查询出报名人数最多的线路)
  958. #我做的
  959. SELECT *
  960. FROM travel
  961. ORDER BY count DESC
  962. LIMIT 0,1;
  963. #老师提供的答案
  964. SELECT *
  965. FROM travel
  966. WHERE count = (
  967. SELECT MAX(count)
  968. FROM travel
  969. );
  970. #6、查询花费少于5000的旅行线路
  971. SELECT *
  972. FROM travel
  973. WHERE money < 5000;
  974. #7、找到一次旅行花费最昂贵的旅行社名
  975. #先找到最贵的费用是多少
  976. SELECT MAX(money)
  977. FROM travel;
  978. #再查找最贵费用的旅行社aid
  979. SELECT aid
  980. FROM travel
  981. WHERE money = (
  982. SELECT MAX(money)
  983. FROM travel
  984. );
  985. #然后根据旅行社aid查找旅行社名称
  986. SELECT name
  987. FROM agency
  988. WHERE id = (
  989. SELECT aid
  990. FROM travel
  991. WHERE money = (
  992. SELECT MAX(money)
  993. FROM travel
  994. )
  995. );
  996. #老师给的答案
  997. SELECT name
  998. FROM agency
  999. WHERE id = (
  1000. SELECT aid
  1001. FROM travel
  1002. WHERE money = (
  1003. SELECT MAX(money)
  1004. FROM travel
  1005. )
  1006. );
  1007. #8、查出青年旅社所有的旅行线路都玩一遍需要多少时间
  1008. #先查出青年旅社的id
  1009. SELECT id
  1010. FROM agency
  1011. WHERE name = '青年旅行社';
  1012. #根据旅行社id在线路表进行查找求和
  1013. SELECT SUM(time)
  1014. FROM travel
  1015. WHERE aid = (
  1016. SELECT id
  1017. FROM agency
  1018. WHERE name = '青年旅行社'
  1019. );
  1020. #老师给的答案
  1021. SELECT SUM(time)
  1022. FROM travel
  1023. WHERE aid = (
  1024. SELECT id
  1025. FROM agency
  1026. WHERE name = '青年旅行社'
  1027. );