├── .idea
├── MysqlTutorial.iml
├── dataSources.local.xml
├── dataSources.xml
├── dataSources
│ ├── 7714a252-3168-45b0-9838-18379bbef042.xml
│ ├── c1370569-b008-47d7-873f-4d96009a1419.xml
│ └── c1370569-b008-47d7-873f-4d96009a1419
│ │ └── storage_v2
│ │ └── _src_
│ │ └── schema
│ │ ├── mysql_tutorial.WzIDNQ.meta
│ │ └── mysql_tutorial.WzIDNQ.zip
├── encodings.xml
├── libraries
│ └── R_User_Library.xml
├── markdown-navigator.xml
├── markdown-navigator
│ └── profiles_settings.xml
├── misc.xml
├── modules.xml
├── sqldialects.xml
├── vcs.xml
└── workspace.xml
├── 001创建数据库.sql
├── 002查看数据库和创建表.sql
├── 003向数据表插入数据.sql
├── 004查看数据表中的所有数据.sql
├── 005删除表.sql
├── 006根据字段查询数据.sql
├── 007where语句查询.sql
├── 008更新数据.sql
├── 009删除数据.sql
├── 010模糊查询.sql
├── 011联合查询.sql
├── 012排序.sql
├── 013myemployees.sql
├── 014girls.sql
├── 015工资等级.sql
├── 016基础查询.sql
├── 017基础查询.sql
├── 018条件查询.sql
├── 020【案例讲解】排序查询.sql
├── 021排序查询.sql
├── 022常见函数.sql
├── 023【案例讲解】单行函数.sql
├── 024分组函数.sql
├── 025【练习讲解】分组函数.sql
├── 026分组查询.sql
├── 027【案例讲解】分组查询.sql
├── 028连接查询.sql
├── 030【作业讲解】连接查询.sql
├── 031sql99语法的连接查询.sql
├── 032【案例讲解】外连接.sql
├── 033子查询.sql
├── 034【案例讲解】子查询.sql
├── 035分页查询.sql
├── 036student.sql
├── 037【作业讲解】查询.sql
├── 038子查询经典案例.sql
├── 039联合查询.sql
├── 040数据的增删改.sql
├── 041【案例讲解】数据的增删改.sql
├── 042库和表的管理.sql
├── 043【案例讲解】库和表的管理.sql
├── 044数据类型.sql
├── 045常见约束.sql
├── 046【案例讲解】常见约束.sql
├── 047标识列.sql
├── 048事务.sql
├── 048视图.sql
├── 049【案例讲解】视图.sql
├── 050变量.sql
├── 051存储过程.sql
├── README.md
├── example001
├── hw_001_基础查询.sql
├── hw_002_条件查询.sql
├── hw_003_排序查询.sql
├── hw_004_常见函数.sql
├── hw_005_单行函数.sql
├── hw_006_分组函数.sql
├── hw_007_分组查询.sql
├── hw_008_链接查询.sql
├── hw_009_外连接查询.sql
└── hw_010_子查询.sql
├── example002
├── hw_001_创建表并添加数据.sql
├── hw_002_pymysql的使用.py
├── hw_003_用户登录.py
└── hw_004_用户注册.py
├── 【案例讲解】存储过程.sql
├── 函数.sql
├── 流程控制经典案例讲解.sql
└── 流程控制结构.sql
/.idea/MysqlTutorial.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/dataSources.local.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #@
7 | `
8 |
9 |
10 | master_key
11 | root
12 | *:@,mysql_tutorial
13 |
14 |
15 |
16 | #@
17 | `
18 |
19 |
20 | master_key
21 | lxgzhw
22 | *:@,mysql_tutorial
23 |
24 |
25 |
--------------------------------------------------------------------------------
/.idea/dataSources.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | mysql
6 | true
7 | com.mysql.jdbc.Driver
8 | jdbc:mysql://cdb-5ssi1fam.bj.tencentcdb.com:10068
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | mysql
20 | true
21 | com.mysql.jdbc.Driver
22 | jdbc:mysql://cdb-5ssi1fam.bj.tencentcdb.com:10068/mysql_tutorial
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/.idea/dataSources/c1370569-b008-47d7-873f-4d96009a1419/storage_v2/_src_/schema/mysql_tutorial.WzIDNQ.meta:
--------------------------------------------------------------------------------
1 | #n:mysql_tutorial
--------------------------------------------------------------------------------
/.idea/dataSources/c1370569-b008-47d7-873f-4d96009a1419/storage_v2/_src_/schema/mysql_tutorial.WzIDNQ.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lxgzhw520/MySQLTutorial/13107afc545e7676553a5e4f40c302c25bc5baec/.idea/dataSources/c1370569-b008-47d7-873f-4d96009a1419/storage_v2/_src_/schema/mysql_tutorial.WzIDNQ.zip
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/libraries/R_User_Library.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/markdown-navigator.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/.idea/markdown-navigator/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/sqldialects.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
128 |
129 |
130 |
131 | gb2312
132 |
133 |
134 | utf8
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 | 1556414884169
315 |
316 |
317 | 1556414884169
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
--------------------------------------------------------------------------------
/001创建数据库.sql:
--------------------------------------------------------------------------------
1 | create database mysql_tutorial charset =utf8;
2 | show databases ;
--------------------------------------------------------------------------------
/002查看数据库和创建表.sql:
--------------------------------------------------------------------------------
1 | # 查看数据库
2 | show databases;
3 |
4 | #选择数据库
5 | use mysql_tutorial;
6 | #创建表
7 | create table if not exists python002
8 | (
9 | id int primary key auto_increment,
10 | name varchar(24) not null,
11 | age int not null,
12 | gender char(1) not null,
13 | class_no varchar(24) not null
14 | );
15 |
16 | #查看表
17 | show tables;
18 |
19 |
20 | # 另一种创建表的方式 完整
21 | create table if not exists `python001`#if not exist 如果不存在
22 | (#飘号是为了防止关键字冲突
23 | `id` int unsigned auto_increment,#unsigned无符号类型 auto_increment表示自增
24 | `name` varchar(24) not null,#notnull表示不能为空 varchar()表示字符串类型
25 | `age` int unsigned not null,#int表示数字类型
26 | `gender` char(1) not null,#char表示字符类型
27 | `class_no` varchar(24) not null,
28 | primary key (`id`)#最后指定主键为id
29 | ) engine = InnoDB
30 | default charset = utf8;#设置默认编码为utf8 引擎为InnoDB
--------------------------------------------------------------------------------
/003向数据表插入数据.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | #向数据表插入数据 insert into 向某个表插入数据 (括号里面写要插入的字段)
4 | #value表示单个值(具体值,与前面指定的字段一一对应)
5 | insert into python001(name, age, gender, class_no) value (
6 | "东周",18,'男',"Python001"
7 | );
8 |
9 |
10 | #向数据表插入多行数据 values表示插入多条数据 后面一个()表示一条数据
11 | insert into python001(name, age, gender, class_no) values(
12 | "丁一",17,'男',"Python001"
13 | ),(
14 | "李皇",22,'男',"Python001"
15 | )
--------------------------------------------------------------------------------
/004查看数据表中的所有数据.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | #查看数据表中的所有数据
4 | select *from python001;
--------------------------------------------------------------------------------
/005删除表.sql:
--------------------------------------------------------------------------------
1 | create table test(
2 | id int primary key auto_increment
3 | );
4 |
5 | show tables ;
6 | #删除数据表
7 | drop table test;
8 | show tables ;
--------------------------------------------------------------------------------
/006根据字段查询数据.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | #查询数据表中的姓名和年龄
4 | select name,age from python001;
5 |
6 | #查询数据表中的id
7 | select id from python001;
8 |
9 |
--------------------------------------------------------------------------------
/007where语句查询.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | #查询id为1的所有字段
4 | select *from python001 where id=1;
5 |
6 | #查询id为1的姓名和年龄
7 | select name,age from python001 where id=1;
8 |
9 | #查询年龄为18的字段
10 | select *from python001 where age=18;
11 |
12 | #查询年龄大于18的所有字段
13 | select *from python001 where age>18;
14 |
15 |
--------------------------------------------------------------------------------
/008更新数据.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 | insert into python001(name, age, gender, class_no) value(
3 | "要被修改的姓名",33,'男',"Python001"
4 | );
5 |
6 | select *from python001;
7 |
8 | #修改数据
9 | update python001 set name="李安" where id=4;
10 | #用单引号也能表示字符串 且是推荐的方式
11 | update python001 set name='李安111' where id=4;
--------------------------------------------------------------------------------
/009删除数据.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 | insert into python001 (name, age, gender, class_no) value (
3 | '要被删除的',111,'女','Python001'
4 | );
5 |
6 | select *from python001;
7 |
8 | #根据id删除
9 | delete from python001 where id=5;
10 |
11 | update python001 set name='李安' where id=4;
--------------------------------------------------------------------------------
/010模糊查询.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | #模糊查询 like
4 | select *from python001 where name like '%安';#%表示多个任意字符串
5 | select *from python001 where name like '_安';#_表示一个任意字符串
6 |
7 | # '%a' //以a结尾的数据
8 | # 'a%' //以a开头的数据
9 | # '%a%' //含有a的数据
10 | # '_a_' //三位且中间字母是a的 _表示一个任意数据
11 | # '_a' //两位且结尾字母是a的
12 | # 'a_' //两位且开头字母是a的
--------------------------------------------------------------------------------
/011联合查询.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | insert into python002(name, age, gender, class_no) values
4 | ('东周',18,'男','Python002'),
5 | ('李皇',22,'男','Python002');
6 |
7 | #联合查询,实际上是将两张表合并为一张表
8 | select *from python001 union select *from python002;
--------------------------------------------------------------------------------
/012排序.sql:
--------------------------------------------------------------------------------
1 | show tables ;
2 |
3 | #desc降序
4 | select *from python001 union select *from python002 order by age desc ;
5 | #asc升序
6 | select *from python001 union select *from python002 order by age asc ;
7 |
8 |
--------------------------------------------------------------------------------
/013myemployees.sql:
--------------------------------------------------------------------------------
1 | use mysql_tutorial;
2 | show tables ;
3 |
4 | DROP TABLE IF EXISTS `departments`;
5 |
6 | CREATE TABLE `departments`
7 | (
8 | `department_id` int(4) NOT NULL AUTO_INCREMENT,#部门编号
9 | `department_name` varchar(3) DEFAULT NULL,#部门名称
10 | `manager_id` int(6) DEFAULT NULL,#部门领导的员工编号
11 | `location_id` int(4) DEFAULT NULL,#位置编号
12 | PRIMARY KEY (`department_id`),
13 | KEY `loc_id_fk` (`location_id`),
14 | CONSTRAINT `loc_id_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`)
15 | ) ENGINE = InnoDB
16 | AUTO_INCREMENT = 271
17 | DEFAULT CHARSET = utf8;
18 |
19 | /*Data for the table `departments` */
20 |
21 | insert into `departments`(`department_id`, #部门编号
22 | `department_name`,#部门名称
23 | `manager_id`, #部门领导的员工编号
24 | `location_id`)#位置编号
25 | values (10, 'Adm', 200, 1700),
26 | (20, 'Mar', 201, 1800),
27 | (30, 'Pur', 114, 1700),
28 | (40, 'Hum', 203, 2400),
29 | (50, 'Shi', 121, 1500),
30 | (60, 'IT', 103, 1400),
31 | (70, 'Pub', 204, 2700),
32 | (80, 'Sal', 145, 2500),
33 | (90, 'Exe', 100, 1700),
34 | (100, 'Fin', 108, 1700),
35 | (110, 'Acc', 205, 1700),
36 | (120, 'Tre', NULL, 1700),
37 | (130, 'Cor', NULL, 1700),
38 | (140, 'Con', NULL, 1700),
39 | (150, 'Sha', NULL, 1700),
40 | (160, 'Ben', NULL, 1700),
41 | (170, 'Man', NULL, 1700),
42 | (180, 'Con', NULL, 1700),
43 | (190, 'Con', NULL, 1700),
44 | (200, 'Ope', NULL, 1700),
45 | (210, 'IT ', NULL, 1700),
46 | (220, 'NOC', NULL, 1700),
47 | (230, 'IT ', NULL, 1700),
48 | (240, 'Gov', NULL, 1700),
49 | (250, 'Ret', NULL, 1700),
50 | (260, 'Rec', NULL, 1700),
51 | (270, 'Pay', NULL, 1700);
52 |
53 | /*Table structure for table `employees` */
54 |
55 | DROP TABLE IF EXISTS `employees`;
56 |
57 | CREATE TABLE `employees`
58 | (
59 | `employee_id` int(6) NOT NULL AUTO_INCREMENT,#员工编号
60 | `first_name` varchar(20) DEFAULT NULL,#名
61 | `last_name` varchar(25) DEFAULT NULL,#姓
62 | `email` varchar(25) DEFAULT NULL,#邮箱
63 | `phone_number` varchar(20) DEFAULT NULL,#电话号码
64 | `job_id` varchar(10) DEFAULT NULL,#工种编号
65 | `salary` double(10, 2) DEFAULT NULL,#月薪
66 | `commission_pct` double(4, 2) DEFAULT NULL,#奖金率
67 | `manager_id` int(6) DEFAULT NULL,#上级领导的员工编号
68 | `department_id` int(4) DEFAULT NULL,#部门编号
69 | `hiredate` datetime DEFAULT NULL,#入职日期
70 | PRIMARY KEY (`employee_id`),
71 | KEY `dept_id_fk` (`department_id`),
72 | KEY `job_id_fk` (`job_id`),
73 | CONSTRAINT `dept_id_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
74 | CONSTRAINT `job_id_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`)
75 | ) ENGINE = InnoDB
76 | AUTO_INCREMENT = 207
77 | DEFAULT CHARSET = utf8;
78 |
79 | # 奖金率 上级领导的员工编号
80 | insert into `employees`(`employee_id`, `first_name`, `last_name`, `email`, `phone_number`, `job_id`, `salary`,
81 | `commission_pct`,#奖金率
82 | `manager_id`, #上级领导的员工编号
83 | `department_id`, #部门编号
84 | `hiredate`)#入职时间
85 | values (100, 'Steven', 'K_ing', 'SKING', '515.123.4567', 'AD_PRES', 24000.00, NULL, NULL, 90, '1992-04-03 00:00:00'),
86 | (101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568', 'AD_VP', 17000.00, NULL, 100, 90, '1992-04-03 00:00:00'),
87 | (102, 'Lex', 'De Haan', 'LDEHAAN', '515.123.4569', 'AD_VP', 17000.00, NULL, 100, 90, '1992-04-03 00:00:00'),
88 | (103, 'Alexander', 'Hunold', 'AHUNOLD', '590.423.4567', 'IT_PROG', 9000.00, NULL, 102, 60,
89 | '1992-04-03 00:00:00'),
90 | (104, 'Bruce', 'Ernst', 'BERNST', '590.423.4568', 'IT_PROG', 6000.00, NULL, 103, 60, '1992-04-03 00:00:00'),
91 | (105, 'David', 'Austin', 'DAUSTIN', '590.423.4569', 'IT_PROG', 4800.00, NULL, 103, 60, '1998-03-03 00:00:00'),
92 | (106, 'Valli', 'Pataballa', 'VPATABAL', '590.423.4560', 'IT_PROG', 4800.00, NULL, 103, 60,
93 | '1998-03-03 00:00:00'),
94 | (107, 'Diana', 'Lorentz', 'DLORENTZ', '590.423.5567', 'IT_PROG', 4200.00, NULL, 103, 60, '1998-03-03 00:00:00'),
95 | (108, 'Nancy', 'Greenberg', 'NGREENBE', '515.124.4569', 'FI_MGR', 12000.00, NULL, 101, 100,
96 | '1998-03-03 00:00:00'),
97 | (109, 'Daniel', 'Faviet', 'DFAVIET', '515.124.4169', 'FI_ACCOUNT', 9000.00, NULL, 108, 100,
98 | '1998-03-03 00:00:00'),
99 | (110, 'John', 'Chen', 'JCHEN', '515.124.4269', 'FI_ACCOUNT', 8200.00, NULL, 108, 100, '2000-09-09 00:00:00'),
100 | (111, 'Ismael', 'Sciarra', 'ISCIARRA', '515.124.4369', 'FI_ACCOUNT', 7700.00, NULL, 108, 100,
101 | '2000-09-09 00:00:00'),
102 | (112, 'Jose Manuel', 'Urman', 'JMURMAN', '515.124.4469', 'FI_ACCOUNT', 7800.00, NULL, 108, 100,
103 | '2000-09-09 00:00:00'),
104 | (113, 'Luis', 'Popp', 'LPOPP', '515.124.4567', 'FI_ACCOUNT', 6900.00, NULL, 108, 100, '2000-09-09 00:00:00'),
105 | (114, 'Den', 'Raphaely', 'DRAPHEAL', '515.127.4561', 'PU_MAN', 11000.00, NULL, 100, 30, '2000-09-09 00:00:00'),
106 | (115, 'Alexander', 'Khoo', 'AKHOO', '515.127.4562', 'PU_CLERK', 3100.00, NULL, 114, 30, '2000-09-09 00:00:00'),
107 | (116, 'Shelli', 'Baida', 'SBAIDA', '515.127.4563', 'PU_CLERK', 2900.00, NULL, 114, 30, '2000-09-09 00:00:00'),
108 | (117, 'Sigal', 'Tobias', 'STOBIAS', '515.127.4564', 'PU_CLERK', 2800.00, NULL, 114, 30, '2000-09-09 00:00:00'),
109 | (118, 'Guy', 'Himuro', 'GHIMURO', '515.127.4565', 'PU_CLERK', 2600.00, NULL, 114, 30, '2000-09-09 00:00:00'),
110 | (119, 'Karen', 'Colmenares', 'KCOLMENA', '515.127.4566', 'PU_CLERK', 2500.00, NULL, 114, 30,
111 | '2000-09-09 00:00:00'),
112 | (120, 'Matthew', 'Weiss', 'MWEISS', '650.123.1234', 'ST_MAN', 8000.00, NULL, 100, 50, '2004-02-06 00:00:00'),
113 | (121, 'Adam', 'Fripp', 'AFRIPP', '650.123.2234', 'ST_MAN', 8200.00, NULL, 100, 50, '2004-02-06 00:00:00'),
114 | (122, 'Payam', 'Kaufling', 'PKAUFLIN', '650.123.3234', 'ST_MAN', 7900.00, NULL, 100, 50, '2004-02-06 00:00:00'),
115 | (123, 'Shanta', 'Vollman', 'SVOLLMAN', '650.123.4234', 'ST_MAN', 6500.00, NULL, 100, 50, '2004-02-06 00:00:00'),
116 | (124, 'Kevin', 'Mourgos', 'KMOURGOS', '650.123.5234', 'ST_MAN', 5800.00, NULL, 100, 50, '2004-02-06 00:00:00'),
117 | (125, 'Julia', 'Nayer', 'JNAYER', '650.124.1214', 'ST_CLERK', 3200.00, NULL, 120, 50, '2004-02-06 00:00:00'),
118 | (126, 'Irene', 'Mikkilineni', 'IMIKKILI', '650.124.1224', 'ST_CLERK', 2700.00, NULL, 120, 50,
119 | '2004-02-06 00:00:00'),
120 | (127, 'James', 'Landry', 'JLANDRY', '650.124.1334', 'ST_CLERK', 2400.00, NULL, 120, 50, '2004-02-06 00:00:00'),
121 | (128, 'Steven', 'Markle', 'SMARKLE', '650.124.1434', 'ST_CLERK', 2200.00, NULL, 120, 50, '2004-02-06 00:00:00'),
122 | (129, 'Laura', 'Bissot', 'LBISSOT', '650.124.5234', 'ST_CLERK', 3300.00, NULL, 121, 50, '2004-02-06 00:00:00'),
123 | (130, 'Mozhe', 'Atkinson', 'MATKINSO', '650.124.6234', 'ST_CLERK', 2800.00, NULL, 121, 50,
124 | '2004-02-06 00:00:00'),
125 | (131, 'James', 'Marlow', 'JAMRLOW', '650.124.7234', 'ST_CLERK', 2500.00, NULL, 121, 50, '2004-02-06 00:00:00'),
126 | (132, 'TJ', 'Olson', 'TJOLSON', '650.124.8234', 'ST_CLERK', 2100.00, NULL, 121, 50, '2004-02-06 00:00:00'),
127 | (133, 'Jason', 'Mallin', 'JMALLIN', '650.127.1934', 'ST_CLERK', 3300.00, NULL, 122, 50, '2004-02-06 00:00:00'),
128 | (134, 'Michael', 'Rogers', 'MROGERS', '650.127.1834', 'ST_CLERK', 2900.00, NULL, 122, 50, '2002-12-23 00:00:00'),
129 | (135, 'Ki', 'Gee', 'KGEE', '650.127.1734', 'ST_CLERK', 2400.00, NULL, 122, 50, '2002-12-23 00:00:00'),
130 | (136, 'Hazel', 'Philtanker', 'HPHILTAN', '650.127.1634', 'ST_CLERK', 2200.00, NULL, 122, 50,
131 | '2002-12-23 00:00:00'),
132 | (137, 'Renske', 'Ladwig', 'RLADWIG', '650.121.1234', 'ST_CLERK', 3600.00, NULL, 123, 50, '2002-12-23 00:00:00'),
133 | (138, 'Stephen', 'Stiles', 'SSTILES', '650.121.2034', 'ST_CLERK', 3200.00, NULL, 123, 50, '2002-12-23 00:00:00'),
134 | (139, 'John', 'Seo', 'JSEO', '650.121.2019', 'ST_CLERK', 2700.00, NULL, 123, 50, '2002-12-23 00:00:00'),
135 | (140, 'Joshua', 'Patel', 'JPATEL', '650.121.1834', 'ST_CLERK', 2500.00, NULL, 123, 50, '2002-12-23 00:00:00'),
136 | (141, 'Trenna', 'Rajs', 'TRAJS', '650.121.8009', 'ST_CLERK', 3500.00, NULL, 124, 50, '2002-12-23 00:00:00'),
137 | (142, 'Curtis', 'Davies', 'CDAVIES', '650.121.2994', 'ST_CLERK', 3100.00, NULL, 124, 50, '2002-12-23 00:00:00'),
138 | (143, 'Randall', 'Matos', 'RMATOS', '650.121.2874', 'ST_CLERK', 2600.00, NULL, 124, 50, '2002-12-23 00:00:00'),
139 | (144, 'Peter', 'Vargas', 'PVARGAS', '650.121.2004', 'ST_CLERK', 2500.00, NULL, 124, 50, '2002-12-23 00:00:00'),
140 | (145, 'John', 'Russell', 'JRUSSEL', '011.44.1344.429268', 'SA_MAN', 14000.00, 0.40, 100, 80,
141 | '2002-12-23 00:00:00'),
142 | (146, 'Karen', 'Partners', 'KPARTNER', '011.44.1344.467268', 'SA_MAN', 13500.00, 0.30, 100, 80,
143 | '2002-12-23 00:00:00'),
144 | (147, 'Alberto', 'Errazuriz', 'AERRAZUR', '011.44.1344.429278', 'SA_MAN', 12000.00, 0.30, 100, 80,
145 | '2002-12-23 00:00:00'),
146 | (148, 'Gerald', 'Cambrault', 'GCAMBRAU', '011.44.1344.619268', 'SA_MAN', 11000.00, 0.30, 100, 80,
147 | '2002-12-23 00:00:00'),
148 | (149, 'Eleni', 'Zlotkey', 'EZLOTKEY', '011.44.1344.429018', 'SA_MAN', 10500.00, 0.20, 100, 80,
149 | '2002-12-23 00:00:00'),
150 | (150, 'Peter', 'Tucker', 'PTUCKER', '011.44.1344.129268', 'SA_REP', 10000.00, 0.30, 145, 80,
151 | '2014-03-05 00:00:00'),
152 | (151, 'David', 'Bernstein', 'DBERNSTE', '011.44.1344.345268', 'SA_REP', 9500.00, 0.25, 145, 80,
153 | '2014-03-05 00:00:00'),
154 | (152, 'Peter', 'Hall', 'PHALL', '011.44.1344.478968', 'SA_REP', 9000.00, 0.25, 145, 80, '2014-03-05 00:00:00'),
155 | (153, 'Christopher', 'Olsen', 'COLSEN', '011.44.1344.498718', 'SA_REP', 8000.00, 0.20, 145, 80,
156 | '2014-03-05 00:00:00'),
157 | (154, 'Nanette', 'Cambrault', 'NCAMBRAU', '011.44.1344.987668', 'SA_REP', 7500.00, 0.20, 145, 80,
158 | '2014-03-05 00:00:00'),
159 | (155, 'Oliver', 'Tuvault', 'OTUVAULT', '011.44.1344.486508', 'SA_REP', 7000.00, 0.15, 145, 80,
160 | '2014-03-05 00:00:00'),
161 | (156, 'Janette', 'K_ing', 'JKING', '011.44.1345.429268', 'SA_REP', 10000.00, 0.35, 146, 80,
162 | '2014-03-05 00:00:00'),
163 | (157, 'Patrick', 'Sully', 'PSULLY', '011.44.1345.929268', 'SA_REP', 9500.00, 0.35, 146, 80,
164 | '2014-03-05 00:00:00'),
165 | (158, 'Allan', 'McEwen', 'AMCEWEN', '011.44.1345.829268', 'SA_REP', 9000.00, 0.35, 146, 80,
166 | '2014-03-05 00:00:00'),
167 | (159, 'Lindsey', 'Smith', 'LSMITH', '011.44.1345.729268', 'SA_REP', 8000.00, 0.30, 146, 80,
168 | '2014-03-05 00:00:00'),
169 | (160, 'Louise', 'Doran', 'LDORAN', '011.44.1345.629268', 'SA_REP', 7500.00, 0.30, 146, 80,
170 | '2014-03-05 00:00:00'),
171 | (161, 'Sarath', 'Sewall', 'SSEWALL', '011.44.1345.529268', 'SA_REP', 7000.00, 0.25, 146, 80,
172 | '2014-03-05 00:00:00'),
173 | (162, 'Clara', 'Vishney', 'CVISHNEY', '011.44.1346.129268', 'SA_REP', 10500.00, 0.25, 147, 80,
174 | '2014-03-05 00:00:00'),
175 | (163, 'Danielle', 'Greene', 'DGREENE', '011.44.1346.229268', 'SA_REP', 9500.00, 0.15, 147, 80,
176 | '2014-03-05 00:00:00'),
177 | (164, 'Mattea', 'Marvins', 'MMARVINS', '011.44.1346.329268', 'SA_REP', 7200.00, 0.10, 147, 80,
178 | '2014-03-05 00:00:00'),
179 | (165, 'David', 'Lee', 'DLEE', '011.44.1346.529268', 'SA_REP', 6800.00, 0.10, 147, 80, '2014-03-05 00:00:00'),
180 | (166, 'Sundar', 'Ande', 'SANDE', '011.44.1346.629268', 'SA_REP', 6400.00, 0.10, 147, 80, '2014-03-05 00:00:00'),
181 | (167, 'Amit', 'Banda', 'ABANDA', '011.44.1346.729268', 'SA_REP', 6200.00, 0.10, 147, 80, '2014-03-05 00:00:00'),
182 | (168, 'Lisa', 'Ozer', 'LOZER', '011.44.1343.929268', 'SA_REP', 11500.00, 0.25, 148, 80, '2014-03-05 00:00:00'),
183 | (169, 'Harrison', 'Bloom', 'HBLOOM', '011.44.1343.829268', 'SA_REP', 10000.00, 0.20, 148, 80,
184 | '2014-03-05 00:00:00'),
185 | (170, 'Tayler', 'Fox', 'TFOX', '011.44.1343.729268', 'SA_REP', 9600.00, 0.20, 148, 80, '2014-03-05 00:00:00'),
186 | (171, 'William', 'Smith', 'WSMITH', '011.44.1343.629268', 'SA_REP', 7400.00, 0.15, 148, 80,
187 | '2014-03-05 00:00:00'),
188 | (172, 'Elizabeth', 'Bates', 'EBATES', '011.44.1343.529268', 'SA_REP', 7300.00, 0.15, 148, 80,
189 | '2014-03-05 00:00:00'),
190 | (173, 'Sundita', 'Kumar', 'SKUMAR', '011.44.1343.329268', 'SA_REP', 6100.00, 0.10, 148, 80,
191 | '2014-03-05 00:00:00'),
192 | (174, 'Ellen', 'Abel', 'EABEL', '011.44.1644.429267', 'SA_REP', 11000.00, 0.30, 149, 80, '2014-03-05 00:00:00'),
193 | (175, 'Alyssa', 'Hutton', 'AHUTTON', '011.44.1644.429266', 'SA_REP', 8800.00, 0.25, 149, 80,
194 | '2014-03-05 00:00:00'),
195 | (176, 'Jonathon', 'Taylor', 'JTAYLOR', '011.44.1644.429265', 'SA_REP', 8600.00, 0.20, 149, 80,
196 | '2014-03-05 00:00:00'),
197 | (177, 'Jack', 'Livingston', 'JLIVINGS', '011.44.1644.429264', 'SA_REP', 8400.00, 0.20, 149, 80,
198 | '2014-03-05 00:00:00'),
199 | (178, 'Kimberely', 'Grant', 'KGRANT', '011.44.1644.429263', 'SA_REP', 7000.00, 0.15, 149, NULL,
200 | '2014-03-05 00:00:00'),
201 | (179, 'Charles', 'Johnson', 'CJOHNSON', '011.44.1644.429262', 'SA_REP', 6200.00, 0.10, 149, 80,
202 | '2014-03-05 00:00:00'),
203 | (180, 'Winston', 'Taylor', 'WTAYLOR', '650.507.9876', 'SH_CLERK', 3200.00, NULL, 120, 50, '2014-03-05 00:00:00'),
204 | (181, 'Jean', 'Fleaur', 'JFLEAUR', '650.507.9877', 'SH_CLERK', 3100.00, NULL, 120, 50, '2014-03-05 00:00:00'),
205 | (182, 'Martha', 'Sullivan', 'MSULLIVA', '650.507.9878', 'SH_CLERK', 2500.00, NULL, 120, 50,
206 | '2014-03-05 00:00:00'),
207 | (183, 'Girard', 'Geoni', 'GGEONI', '650.507.9879', 'SH_CLERK', 2800.00, NULL, 120, 50, '2014-03-05 00:00:00'),
208 | (184, 'Nandita', 'Sarchand', 'NSARCHAN', '650.509.1876', 'SH_CLERK', 4200.00, NULL, 121, 50,
209 | '2014-03-05 00:00:00'),
210 | (185, 'Alexis', 'Bull', 'ABULL', '650.509.2876', 'SH_CLERK', 4100.00, NULL, 121, 50, '2014-03-05 00:00:00'),
211 | (186, 'Julia', 'Dellinger', 'JDELLING', '650.509.3876', 'SH_CLERK', 3400.00, NULL, 121, 50,
212 | '2014-03-05 00:00:00'),
213 | (187, 'Anthony', 'Cabrio', 'ACABRIO', '650.509.4876', 'SH_CLERK', 3000.00, NULL, 121, 50, '2014-03-05 00:00:00'),
214 | (188, 'Kelly', 'Chung', 'KCHUNG', '650.505.1876', 'SH_CLERK', 3800.00, NULL, 122, 50, '2014-03-05 00:00:00'),
215 | (189, 'Jennifer', 'Dilly', 'JDILLY', '650.505.2876', 'SH_CLERK', 3600.00, NULL, 122, 50, '2014-03-05 00:00:00'),
216 | (190, 'Timothy', 'Gates', 'TGATES', '650.505.3876', 'SH_CLERK', 2900.00, NULL, 122, 50, '2014-03-05 00:00:00'),
217 | (191, 'Randall', 'Perkins', 'RPERKINS', '650.505.4876', 'SH_CLERK', 2500.00, NULL, 122, 50,
218 | '2014-03-05 00:00:00'),
219 | (192, 'Sarah', 'Bell', 'SBELL', '650.501.1876', 'SH_CLERK', 4000.00, NULL, 123, 50, '2014-03-05 00:00:00'),
220 | (193, 'Britney', 'Everett', 'BEVERETT', '650.501.2876', 'SH_CLERK', 3900.00, NULL, 123, 50,
221 | '2014-03-05 00:00:00'),
222 | (194, 'Samuel', 'McCain', 'SMCCAIN', '650.501.3876', 'SH_CLERK', 3200.00, NULL, 123, 50, '2014-03-05 00:00:00'),
223 | (195, 'Vance', 'Jones', 'VJONES', '650.501.4876', 'SH_CLERK', 2800.00, NULL, 123, 50, '2014-03-05 00:00:00'),
224 | (196, 'Alana', 'Walsh', 'AWALSH', '650.507.9811', 'SH_CLERK', 3100.00, NULL, 124, 50, '2014-03-05 00:00:00'),
225 | (197, 'Kevin', 'Feeney', 'KFEENEY', '650.507.9822', 'SH_CLERK', 3000.00, NULL, 124, 50, '2014-03-05 00:00:00'),
226 | (198, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', 'SH_CLERK', 2600.00, NULL, 124, 50,
227 | '2014-03-05 00:00:00'),
228 | (199, 'Douglas', 'Grant', 'DGRANT', '650.507.9844', 'SH_CLERK', 2600.00, NULL, 124, 50, '2014-03-05 00:00:00'),
229 | (200, 'Jennifer', 'Whalen', 'JWHALEN', '515.123.4444', 'AD_ASST', 4400.00, NULL, 101, 10, '2016-03-03 00:00:00'),
230 | (201, 'Michael', 'Hartstein', 'MHARTSTE', '515.123.5555', 'MK_MAN', 13000.00, NULL, 100, 20,
231 | '2016-03-03 00:00:00'),
232 | (202, 'Pat', 'Fay', 'PFAY', '603.123.6666', 'MK_REP', 6000.00, NULL, 201, 20, '2016-03-03 00:00:00'),
233 | (203, 'Susan', 'Mavris', 'SMAVRIS', '515.123.7777', 'HR_REP', 6500.00, NULL, 101, 40, '2016-03-03 00:00:00'),
234 | (204, 'Hermann', 'Baer', 'HBAER', '515.123.8888', 'PR_REP', 10000.00, NULL, 101, 70, '2016-03-03 00:00:00'),
235 | (205, 'Shelley', 'Higgins', 'SHIGGINS', '515.123.8080', 'AC_MGR', 12000.00, NULL, 101, 110,
236 | '2016-03-03 00:00:00'),
237 | (206, 'William', 'Gietz', 'WGIETZ', '515.123.8181', 'AC_ACCOUNT', 8300.00, NULL, 205, 110,
238 | '2016-03-03 00:00:00');
239 |
240 | /*Table structure for table `jobs` */
241 |
242 | DROP TABLE IF EXISTS `jobs`;
243 |
244 | CREATE TABLE `jobs`
245 | (
246 | `job_id` varchar(10) NOT NULL,
247 | `job_title` varchar(35) DEFAULT NULL,#工种名称
248 | `min_salary` int(6) DEFAULT NULL,#最低工资
249 | `max_salary` int(6) DEFAULT NULL,#最高工资
250 | PRIMARY KEY (`job_id`)
251 | ) ENGINE = InnoDB
252 | DEFAULT CHARSET = utf8;
253 |
254 | /*Data for the table `jobs` */
255 |
256 | insert into `jobs`(`job_id`, `job_title`, `min_salary`, `max_salary`)
257 | values ('AC_ACCOUNT', 'Public Accountant', 4200, 9000),
258 | ('AC_MGR', 'Accounting Manager', 8200, 16000),
259 | ('AD_ASST', 'Administration Assistant', 3000, 6000),
260 | ('AD_PRES', 'President', 20000, 40000),
261 | ('AD_VP', 'Administration Vice President', 15000, 30000),
262 | ('FI_ACCOUNT', 'Accountant', 4200, 9000),
263 | ('FI_MGR', 'Finance Manager', 8200, 16000),
264 | ('HR_REP', 'Human Resources Representative', 4000, 9000),
265 | ('IT_PROG', 'Programmer', 4000, 10000),
266 | ('MK_MAN', 'Marketing Manager', 9000, 15000),
267 | ('MK_REP', 'Marketing Representative', 4000, 9000),
268 | ('PR_REP', 'Public Relations Representative', 4500, 10500),
269 | ('PU_CLERK', 'Purchasing Clerk', 2500, 5500),
270 | ('PU_MAN', 'Purchasing Manager', 8000, 15000),
271 | ('SA_MAN', 'Sales Manager', 10000, 20000),
272 | ('SA_REP', 'Sales Representative', 6000, 12000),
273 | ('SH_CLERK', 'Shipping Clerk', 2500, 5500),
274 | ('ST_CLERK', 'Stock Clerk', 2000, 5000),
275 | ('ST_MAN', 'Stock Manager', 5500, 8500);
276 |
277 | /*Table structure for table `locations` */
278 |
279 | DROP TABLE IF EXISTS `locations`;
280 |
281 | CREATE TABLE `locations`
282 | (
283 | `location_id` int(11) NOT NULL AUTO_INCREMENT,#位置编号
284 | `street_address` varchar(40) DEFAULT NULL,#街道
285 | `postal_code` varchar(12) DEFAULT NULL,#邮编
286 | `city` varchar(30) DEFAULT NULL,#城市
287 | `state_province` varchar(25) DEFAULT NULL,#州/省
288 | `country_id` varchar(2) DEFAULT NULL,#国家编号
289 | PRIMARY KEY (`location_id`)
290 | ) ENGINE = InnoDB
291 | AUTO_INCREMENT = 3201
292 | DEFAULT CHARSET = utf8;
293 |
294 | /*Data for the table `locations` */
295 |
296 | insert into `locations`(`location_id`, `street_address`, `postal_code`, `city`, `state_province`, `country_id`)
297 | values (1000, '1297 Via Cola di Rie', '00989', 'Roma', NULL, 'IT'),
298 | (1100, '93091 Calle della Testa', '10934', 'Venice', NULL, 'IT'),
299 | (1200, '2017 Shinjuku-ku', '1689', 'Tokyo', 'Tokyo Prefecture', 'JP'),
300 | (1300, '9450 Kamiya-cho', '6823', 'Hiroshima', NULL, 'JP'),
301 | (1400, '2014 Jabberwocky Rd', '26192', 'Southlake', 'Texas', 'US'),
302 | (1500, '2011 Interiors Blvd', '99236', 'South San Francisco', 'California', 'US'),
303 | (1600, '2007 Zagora St', '50090', 'South Brunswick', 'New Jersey', 'US'),
304 | (1700, '2004 Charade Rd', '98199', 'Seattle', 'Washington', 'US'),
305 | (1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario', 'CA'),
306 | (1900, '6092 Boxwood St', 'YSW 9T2', 'Whitehorse', 'Yukon', 'CA'),
307 | (2000, '40-5-12 Laogianggen', '190518', 'Beijing', NULL, 'CN'),
308 | (2100, '1298 Vileparle (E)', '490231', 'Bombay', 'Maharashtra', 'IN'),
309 | (2200, '12-98 Victoria Street', '2901', 'Sydney', 'New South Wales', 'AU'),
310 | (2300, '198 Clementi North', '540198', 'Singapore', NULL, 'SG'),
311 | (2400, '8204 Arthur St', NULL, 'London', NULL, 'UK'),
312 | (2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford', 'UK'),
313 | (2600, '9702 Chester Road', '09629850293', 'Stretford', 'Manchester', 'UK'),
314 | (2700, 'Schwanthalerstr. 7031', '80925', 'Munich', 'Bavaria', 'DE'),
315 | (2800, 'Rua Frei Caneca 1360 ', '01307-002', 'Sao Paulo', 'Sao Paulo', 'BR'),
316 | (2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve', 'CH'),
317 | (3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE', 'CH'),
318 | (3100, 'Pieter Breughelstraat 837', '3029SK', 'Utrecht', 'Utrecht', 'NL'),
319 | (3200, 'Mariano Escobedo 9991', '11932', 'Mexico City', 'Distrito Federal,', 'MX');
320 |
--------------------------------------------------------------------------------
/014girls.sql:
--------------------------------------------------------------------------------
1 |
2 | DROP TABLE IF EXISTS `admin`;
3 |
4 | CREATE TABLE `admin` (
5 | `id` int(11) NOT NULL AUTO_INCREMENT,
6 | `username` varchar(10) NOT NULL,
7 | `password` varchar(10) NOT NULL,
8 | PRIMARY KEY (`id`)
9 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
10 |
11 | /*Data for the table `admin` */
12 |
13 | insert into `admin`(`id`,`username`,`password`) values (1,'john','8888'),(2,'lyt','6666');
14 |
15 | /*Table structure for table `beauty` */
16 |
17 | DROP TABLE IF EXISTS `beauty`;
18 |
19 | CREATE TABLE `beauty` (
20 | `id` int(11) NOT NULL AUTO_INCREMENT,
21 | `name` varchar(50) NOT NULL,
22 | `sex` char(1) DEFAULT '女',
23 | `borndate` datetime DEFAULT '1987-01-01 00:00:00',
24 | `phone` varchar(11) NOT NULL,
25 | `photo` blob,
26 | `boyfriend_id` int(11) DEFAULT NULL,
27 | PRIMARY KEY (`id`)
28 | ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
29 |
30 | /*Data for the table `beauty` */
31 |
32 | 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);
33 |
34 | /*Table structure for table `boys` */
35 |
36 | DROP TABLE IF EXISTS `boys`;
37 |
38 | CREATE TABLE `boys` (
39 | `id` int(11) NOT NULL AUTO_INCREMENT,
40 | `boyName` varchar(20) DEFAULT NULL,
41 | `userCP` int(11) DEFAULT NULL,
42 | PRIMARY KEY (`id`)
43 | ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
44 |
45 | /*Data for the table `boys` */
46 |
47 | insert into `boys`(`id`,`boyName`,`userCP`) values (1,'张无忌',100),(2,'鹿晗',800),(3,'黄晓明',50),(4,'段誉',300);
48 |
49 |
--------------------------------------------------------------------------------
/015工资等级.sql:
--------------------------------------------------------------------------------
1 |
2 | CREATE TABLE job_grades
3 | (grade_level VARCHAR(3),
4 | lowest_sal int,
5 | highest_sal int);
6 |
7 | INSERT INTO job_grades
8 | VALUES ('A', 1000, 2999);
9 |
10 | INSERT INTO job_grades
11 | VALUES ('B', 3000, 5999);
12 |
13 | INSERT INTO job_grades
14 | VALUES('C', 6000, 9999);
15 |
16 | INSERT INTO job_grades
17 | VALUES('D', 10000, 14999);
18 |
19 | INSERT INTO job_grades
20 | VALUES('E', 15000, 24999);
21 |
22 | INSERT INTO job_grades
23 | VALUES('F', 25000, 40000);
--------------------------------------------------------------------------------
/016基础查询.sql:
--------------------------------------------------------------------------------
1 | #进阶1:基础查询
2 | /*
3 | 语法:
4 | select 查询列表 from 表名;
5 |
6 |
7 | 类似于:System.out.println(打印东西);
8 |
9 | 特点:
10 |
11 | 1、查询列表可以是:表中的字段、常量值、表达式、函数
12 | 2、查询的结果是一个虚拟的表格
13 | */
14 |
15 | show tables;
16 | #1.查询表中的单个字段
17 |
18 | SELECT last_name
19 | FROM employees;
20 |
21 | #2.查询表中的多个字段
22 | SELECT last_name, salary, email
23 | FROM employees;
24 |
25 | #3.查询表中的所有字段
26 |
27 | #方式一:
28 | SELECT `employee_id`,
29 | `first_name`,
30 | `last_name`,
31 | `phone_number`,
32 | `last_name`,
33 | `job_id`,
34 | `phone_number`,
35 | `job_id`,
36 | `salary`,
37 | `commission_pct`,
38 | `manager_id`,
39 | `department_id`,
40 | `hiredate`
41 | FROM employees;
42 | #方式二:
43 | SELECT *
44 | FROM employees;
45 |
46 | #4.查询常量值
47 | SELECT 100;
48 | SELECT 'john';
49 |
50 | #5.查询表达式
51 |
52 |
53 | #6.查询函数
54 |
55 | SELECT VERSION();
56 |
57 |
58 | #7.起别名
59 | /*
60 | ①便于理解
61 | ②如果要查询的字段有重名的情况,使用别名可以区分开来
62 |
63 | */
64 | #方式一:使用as
65 | SELECT 100 % 98 AS 结果;
66 | SELECT last_name AS 姓, first_name AS 名
67 | FROM employees;
68 |
69 | #方式二:使用空格
70 | SELECT last_name 姓, first_name 名
71 | FROM employees;
72 |
73 |
74 | #案例:查询salary,显示结果为 out put
75 | SELECT salary AS "out put"
76 | FROM employees;
77 |
78 |
79 | #8.去重
80 |
81 |
82 | #案例:查询员工表中涉及到的所有的部门编号
83 | SELECT DISTINCT department_id
84 | FROM employees;
85 |
86 | # 不去重
87 | SELECT department_id
88 | FROM employees;
89 |
90 |
91 |
92 | #9.+号的作用
93 |
94 | /*
95 |
96 | java中的+号:
97 | ①运算符,两个操作数都为数值型
98 | ②连接符,只要有一个操作数为字符串
99 |
100 | mysql中的+号:
101 | 仅仅只有一个功能:运算符
102 |
103 | select 100+90; 两个操作数都为数值型,则做加法运算
104 | select '123'+90;只要其中一方为字符型,试图将字符型数值转换成数值型
105 | 如果转换成功,则继续做加法运算
106 | select 'john'+90; 如果转换失败,则将字符型数值转换成0
107 |
108 | select null+10; 只要其中一方为null,则结果肯定为null
109 |
110 | */
111 |
112 | #案例:查询员工名和姓连接成一个字段,并显示为 姓名
113 |
114 |
115 | SELECT CONCAT('a', 'b', 'c') AS 结果;
116 |
117 | SELECT CONCAT(last_name, first_name) AS 姓名
118 | FROM employees;
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
--------------------------------------------------------------------------------
/017基础查询.sql:
--------------------------------------------------------------------------------
1 | #1. 下面的语句是否可以执行成功
2 | SELECT last_name , job_id , salary AS sal
3 | FROM employees;
4 |
5 | #2.下面的语句是否可以执行成功
6 | SELECT * FROM employees;
7 |
8 |
9 | #3.找出下面语句中的错误
10 | SELECT employee_id , last_name,
11 | salary * 12 AS "ANNUAL SALARY"
12 | FROM employees;
13 |
14 |
15 |
16 | #4.显示表departments的结构,并查询其中的全部数据
17 |
18 | DESC departments;
19 | SELECT * FROM `departments`;
20 |
21 | #5.显示出表employees中的全部job_id(不能重复)
22 | SELECT DISTINCT job_id FROM employees;
23 |
24 | #6.显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
25 |
26 | SELECT
27 | IFNULL(commission_pct,0) AS 奖金率,
28 | commission_pct
29 | FROM
30 | employees;
31 |
32 |
33 | #-------------------------------------------
34 | # null和任意字段拼接,结果都为null
35 | SELECT
36 | CONCAT(`first_name`,',',`last_name`,',',`job_id`,',',IFNULL(commission_pct,0)) AS out_put
37 | FROM
38 | employees;
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/018条件查询.sql:
--------------------------------------------------------------------------------
1 | #进阶2:条件查询
2 | /*
3 |
4 | 语法:
5 | select
6 | 查询列表
7 | from
8 | 表名
9 | where
10 | 筛选条件;
11 |
12 | 分类:
13 | 一、按条件表达式筛选
14 |
15 | 简单条件运算符:> < = != <> >= <=
16 |
17 | 二、按逻辑表达式筛选
18 | 逻辑运算符:
19 | 作用:用于连接条件表达式
20 | && || !
21 | and or not
22 |
23 | &&和and:两个条件都为true,结果为true,反之为false
24 | ||或or: 只要有一个条件为true,结果为true,反之为false
25 | !或not: 如果连接的条件本身为false,结果为true,反之为false
26 |
27 | 三、模糊查询
28 | like
29 | between and
30 | in
31 | is null
32 |
33 | */
34 | #一、按条件表达式筛选
35 |
36 | #案例1:查询工资>12000的员工信息
37 |
38 | SELECT *
39 | FROM employees
40 | WHERE salary > 12000;
41 |
42 |
43 | #案例2:查询部门编号不等于90号的员工名和部门编号
44 | SELECT last_name,
45 | department_id
46 | FROM employees
47 | WHERE department_id <> 90;
48 |
49 |
50 | #二、按逻辑表达式筛选
51 |
52 | #案例1:查询工资z在10000到20000之间的员工名、工资以及奖金
53 | SELECT last_name,
54 | salary,
55 | commission_pct
56 | FROM employees
57 | WHERE salary >= 10000
58 | AND salary <= 20000;
59 | #案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
60 | SELECT *
61 | FROM employees
62 | WHERE NOT (department_id >= 90 AND department_id <= 110)
63 | OR salary > 15000;
64 | #三、模糊查询
65 | /*
66 | like
67 |
68 |
69 |
70 | between and
71 | in
72 | is null|is not null
73 |
74 | */
75 | #1.like
76 | /*
77 | 特点:
78 | ①一般和通配符搭配使用
79 | 通配符:
80 | % 任意多个字符,包含0个字符
81 | _ 任意单个字符
82 | */
83 |
84 | #案例1:查询员工名中包含字符a的员工信息
85 |
86 | select *
87 | from employees
88 | where last_name like '%a%';
89 | #abc
90 | #案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
91 | select last_name,
92 | salary
93 | FROM employees
94 | WHERE last_name LIKE '__n_l%';
95 |
96 |
97 | #案例3:查询员工名中第二个字符为_的员工名
98 |
99 | SELECT last_name
100 | FROM employees
101 | WHERE last_name LIKE '_$_%' ESCAPE '$';
102 |
103 | #可以escape指定自定义的转义符号
104 | SELECT last_name
105 | FROM employees
106 | WHERE last_name LIKE '_#_%' ESCAPE '#';
107 |
108 | #不指定转义字符的用法
109 | SELECT last_name
110 | FROM employees
111 | WHERE last_name LIKE '_\_%';
112 |
113 |
114 | #2.between and
115 | /*
116 | ①使用between and 可以提高语句的简洁度
117 | ②包含临界值
118 | ③两个临界值不要调换顺序
119 |
120 | */
121 |
122 |
123 | #案例1:查询员工编号在100到120之间的员工信息
124 |
125 | SELECT *
126 | FROM employees
127 | WHERE employee_id <= 120
128 | AND employee_id >= 100;
129 | #----------------------
130 | SELECT *
131 | FROM employees
132 | WHERE employee_id BETWEEN 100 AND 120;
133 |
134 | #3.in
135 | /*
136 | 含义:判断某字段的值是否属于in列表中的某一项
137 | 特点:
138 | ①使用in提高语句简洁度
139 | ②in列表的值类型必须一致或兼容
140 | ③in列表中不支持通配符
141 |
142 |
143 | */
144 | #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
145 |
146 | SELECT last_name,
147 | job_id
148 | FROM employees
149 | WHERE job_id = 'IT_PROT'
150 | OR job_id = 'AD_VP'
151 | OR JOB_ID = 'AD_PRES';
152 |
153 |
154 | #------------------
155 |
156 | SELECT last_name,
157 | job_id
158 | FROM employees
159 | WHERE job_id IN ('IT_PROT', 'AD_VP', 'AD_PRES');
160 |
161 | #4、is null
162 | /*
163 | =或<>不能用于判断null值
164 | is null或is not null 可以判断null值
165 |
166 |
167 |
168 |
169 | */
170 |
171 | #案例1:查询没有奖金的员工名和奖金率
172 | SELECT last_name,
173 | commission_pct
174 | FROM employees
175 | WHERE commission_pct IS NULL;
176 |
177 |
178 | #案例1:查询有奖金的员工名和奖金率
179 | SELECT last_name,
180 | commission_pct
181 | FROM employees
182 | WHERE commission_pct IS NOT NULL;
183 |
184 | #----------以下为错误的用法
185 | SELECT last_name,
186 | commission_pct
187 | FROM employees
188 |
189 | WHERE salary IS 12000;
190 |
191 |
192 | #安全等于 <=>
193 |
194 |
195 | #案例1:查询没有奖金的员工名和奖金率
196 | SELECT last_name,
197 | commission_pct
198 | FROM employees
199 | WHERE commission_pct <=> NULL;
200 |
201 |
202 | #案例2:查询工资为12000的员工信息
203 | SELECT last_name,
204 | salary
205 | FROM employees
206 |
207 | WHERE salary <=> 12000;
208 |
209 |
210 | #is null pk <=>
211 |
212 | # IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
213 | # <=> :既可以判断NULL值,又可以判断普通的数值,可读性较低
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
--------------------------------------------------------------------------------
/020【案例讲解】排序查询.sql:
--------------------------------------------------------------------------------
1 | #1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
2 |
3 | SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪
4 | FROM employees
5 | ORDER BY 年薪 DESC,last_name ASC;
6 |
7 |
8 | #2.选择工资不在8000到17000的员工的姓名和工资,按工资降序
9 | SELECT last_name,salary
10 | FROM employees
11 |
12 | WHERE salary NOT BETWEEN 8000 AND 17000
13 | ORDER BY salary DESC;
14 |
15 | #3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
16 |
17 | SELECT *,LENGTH(email)
18 | FROM employees
19 | WHERE email LIKE '%e%'
20 | ORDER BY LENGTH(email) DESC,department_id ASC;
21 |
--------------------------------------------------------------------------------
/021排序查询.sql:
--------------------------------------------------------------------------------
1 | #进阶3:排序查询
2 | /*
3 | 语法:
4 | select 查询列表
5 | from 表名
6 | 【where 筛选条件】
7 | order by 排序的字段或表达式;
8 |
9 |
10 | 特点:
11 | 1、asc代表的是升序,可以省略
12 | desc代表的是降序
13 |
14 | 2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段
15 |
16 | 3、order by子句在查询语句的最后面,除了limit子句
17 |
18 | */
19 |
20 | #1、按单个字段排序
21 | SELECT * FROM employees ORDER BY salary DESC;
22 |
23 | #2、添加筛选条件再排序
24 |
25 | #案例:查询部门编号>=90的员工信息,并按员工编号降序
26 |
27 | SELECT *
28 | FROM employees
29 | WHERE department_id>=90
30 | ORDER BY employee_id DESC;
31 |
32 |
33 | #3、按表达式排序
34 | #案例:查询员工信息 按年薪降序
35 |
36 |
37 | SELECT *,salary*12*(1+IFNULL(commission_pct,0))
38 | FROM employees
39 | ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
40 |
41 |
42 | #4、按别名排序
43 | #案例:查询员工信息 按年薪升序
44 |
45 | SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
46 | FROM employees
47 | ORDER BY 年薪 ASC;
48 |
49 | #5、按函数排序
50 | #案例:查询员工名,并且按名字的长度降序
51 |
52 | SELECT LENGTH(last_name),last_name
53 | FROM employees
54 | ORDER BY LENGTH(last_name) DESC;
55 |
56 | #6、按多个字段排序
57 |
58 | #案例:查询员工信息,要求先按工资降序,再按employee_id升序
59 | SELECT *
60 | FROM employees
61 | ORDER BY salary DESC,employee_id ASC;
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/022常见函数.sql:
--------------------------------------------------------------------------------
1 | #进阶4:常见函数
2 |
3 | /*
4 |
5 | 概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
6 | 好处:1、隐藏了实现细节 2、提高代码的重用性
7 | 调用:select 函数名(实参列表) 【from 表】;
8 | 特点:
9 | ①叫什么(函数名)
10 | ②干什么(函数功能)
11 |
12 | 分类:
13 | 1、单行函数
14 | 如 concat、length、ifnull等
15 | 2、分组函数
16 |
17 | 功能:做统计使用,又称为统计函数、聚合函数、组函数
18 |
19 | 常见函数:
20 | 一、单行函数
21 | 字符函数:
22 | length:获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
23 | concat
24 | substr
25 | instr
26 | trim
27 | upper
28 | lower
29 | lpad
30 | rpad
31 | replace
32 |
33 | 数学函数:
34 | round
35 | ceil
36 | floor
37 | truncate
38 | mod
39 |
40 | 日期函数:
41 | now
42 | curdate
43 | curtime
44 | year
45 | month
46 | monthname
47 | day
48 | hour
49 | minute
50 | second
51 | str_to_date
52 | date_format
53 | 其他函数:
54 | version
55 | database
56 | user
57 | 控制函数
58 | if
59 | case
60 |
61 |
62 |
63 |
64 | */
65 |
66 |
67 | #一、字符函数
68 |
69 | #1.length 获取参数值的字节个数
70 | SELECT LENGTH('john');
71 | SELECT LENGTH('张三丰hahaha');
72 |
73 | SHOW VARIABLES LIKE '%char%';
74 |
75 | #2.concat 拼接字符串
76 |
77 | SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;
78 |
79 | #3.upper、lower
80 | SELECT UPPER('john');
81 | SELECT LOWER('joHn');
82 | #示例:将姓变大写,名变小写,然后拼接
83 | SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;
84 |
85 | #4.substr、substring
86 | # 注意:索引从1开始
87 | #截取从指定索引处后面所有字符
88 | SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;
89 |
90 | #截取从指定索引处指定字符长度的字符
91 | SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;
92 |
93 |
94 | #案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来
95 |
96 | SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put
97 | FROM employees;
98 |
99 | #5.instr 返回子串第一次出现的索引,如果找不到返回0
100 |
101 | SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS out_put;
102 | SELECT INSTR('杨不悔爱上了殷六侠','殷7侠') AS out_put;
103 |
104 | #6.trim
105 |
106 | SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put;
107 |
108 | SELECT TRIM('aa' FROM 'aaaaaaaaa张aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;
109 | SELECT TRIM('a' FROM 'aaaaaaaaa张aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;
110 |
111 | #7.lpad 用指定的字符实现左填充指定长度
112 |
113 | SELECT LPAD('殷素素',2,'*') AS out_put;
114 |
115 | #8.rpad 用指定的字符实现右填充指定长度
116 |
117 | SELECT RPAD('殷素素',12,'ab') AS out_put;
118 |
119 |
120 | #9.replace 替换
121 |
122 | SELECT REPLACE('周芷若周芷若周芷若周芷若张无忌爱上了周芷若','周芷若','赵敏') AS out_put;
123 |
124 |
125 |
126 | #二、数学函数
127 |
128 | #round 四舍五入
129 | SELECT ROUND(-1.55);
130 | SELECT ROUND(1.567,2);
131 |
132 |
133 | #ceil 向上取整,返回>=该参数的最小整数
134 |
135 | SELECT CEIL(-1.02);
136 |
137 | #floor 向下取整,返回<=该参数的最大整数
138 | SELECT FLOOR(-9.99);
139 |
140 | #truncate 截断
141 |
142 | SELECT TRUNCATE(1.69999,1);
143 |
144 | #mod取余
145 | /*
146 | mod(a,b) : a-a/b*b
147 |
148 | mod(-10,-3):-10- (-10)/(-3)*(-3)=-1
149 | */
150 | SELECT MOD(10,-3);
151 | SELECT 10%3;
152 |
153 |
154 | #三、日期函数
155 |
156 | #now 返回当前系统日期+时间
157 | SELECT NOW();
158 |
159 | #curdate 返回当前系统日期,不包含时间
160 | SELECT CURDATE();
161 |
162 | #curtime 返回当前时间,不包含日期
163 | SELECT CURTIME();
164 |
165 |
166 | #可以获取指定的部分,年、月、日、小时、分钟、秒
167 | SELECT YEAR(NOW()) 年;
168 | SELECT YEAR('1998-1-1') 年;
169 |
170 | SELECT YEAR(hiredate) 年 FROM employees;
171 |
172 | SELECT MONTH(NOW()) 月;
173 | SELECT MONTHNAME(NOW()) 月;
174 |
175 |
176 | #str_to_date 将字符通过指定的格式转换成日期
177 |
178 | SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;
179 | SELECT STR_TO_DATE('1998-3-2','%Y-%m-%d') AS out_put;
180 |
181 | #查询入职日期为1992--4-3的员工信息
182 | SELECT * FROM employees WHERE hiredate = '1992-4-3';
183 |
184 | SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
185 |
186 |
187 | #date_format 将日期转换成字符
188 |
189 | SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
190 |
191 | #查询有奖金的员工名和入职日期(xx月/xx日 xx年)
192 | SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') 入职日期
193 | FROM employees
194 | WHERE commission_pct IS NOT NULL;
195 |
196 |
197 | #四、其他函数
198 |
199 | SELECT VERSION();
200 | SELECT DATABASE();
201 | SELECT USER();
202 |
203 |
204 | #五、流程控制函数
205 | #1.if函数: if else 的效果
206 |
207 | SELECT IF(10<5,'大','小');
208 |
209 | SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注
210 | FROM employees;
211 |
212 |
213 |
214 |
215 | #2.case函数的使用一: switch case 的效果
216 |
217 | /*
218 | java中
219 | switch(变量或表达式){
220 | case 常量1:语句1;break;
221 | ...
222 | default:语句n;break;
223 |
224 |
225 | }
226 |
227 | mysql中
228 |
229 | case 要判断的字段或表达式
230 | when 常量1 then 要显示的值1或语句1;
231 | when 常量2 then 要显示的值2或语句2;
232 | ...
233 | else 要显示的值n或语句n;
234 | end
235 | */
236 |
237 | /*案例:查询员工的工资,要求
238 |
239 | 部门号=30,显示的工资为1.1倍
240 | 部门号=40,显示的工资为1.2倍
241 | 部门号=50,显示的工资为1.3倍
242 | 其他部门,显示的工资为原工资
243 |
244 | */
245 |
246 |
247 | SELECT salary 原始工资,department_id,
248 | CASE department_id
249 | WHEN 30 THEN salary*1.1
250 | WHEN 40 THEN salary*1.2
251 | WHEN 50 THEN salary*1.3
252 | ELSE salary
253 | END AS 新工资
254 | FROM employees;
255 |
256 |
257 |
258 | #3.case 函数的使用二:类似于 多重if
259 | /*
260 | java中:
261 | if(条件1){
262 | 语句1;
263 | }else if(条件2){
264 | 语句2;
265 | }
266 | ...
267 | else{
268 | 语句n;
269 | }
270 |
271 | mysql中:
272 |
273 | case
274 | when 条件1 then 要显示的值1或语句1
275 | when 条件2 then 要显示的值2或语句2
276 | 。。。
277 | else 要显示的值n或语句n
278 | end
279 | */
280 |
281 | #案例:查询员工的工资的情况
282 | # 如果工资>20000,显示A级别
283 | # 如果工资>15000,显示B级别
284 | # 如果工资>10000,显示C级别
285 | # 否则,显示D级别
286 |
287 |
288 | SELECT salary,
289 | CASE
290 | WHEN salary>20000 THEN 'A'
291 | WHEN salary>15000 THEN 'B'
292 | WHEN salary>10000 THEN 'C'
293 | ELSE 'D'
294 | END AS 工资级别
295 | FROM employees;
296 |
297 |
298 |
299 | SELECT salary,
300 | CASE salary
301 | WHEN 20000 THEN 'A'
302 | WHEN 15000 THEN 'B'
303 | WHEN 10000 THEN 'C'
304 | ELSE 'D'
305 | END AS 工资级别
306 | FROM employees;
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
--------------------------------------------------------------------------------
/023【案例讲解】单行函数.sql:
--------------------------------------------------------------------------------
1 | #1. 显示系统时间(注:日期+时间)
2 | SELECT NOW();
3 |
4 | #2. 查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
5 |
6 | SELECT employee_id,last_name,salary,salary*1.2 "new salary"
7 | FROM employees;
8 | #3. 将员工的姓名按首字母排序,并写出姓名的长度(length)
9 |
10 | SELECT LENGTH(last_name) 长度,SUBSTR(last_name,1,1) 首字符,last_name
11 | FROM employees
12 | ORDER BY 首字符;
13 |
14 |
15 |
16 |
17 | #4. 做一个查询,产生下面的结果
18 | # earns monthly but wants
19 | # Dream Salary
20 | # King earns 24000 monthly but wants 72000
21 |
22 |
23 | SELECT CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3) AS "Dream Salary"
24 | FROM employees
25 | WHERE salary=24000;
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | #5. 使用case-when,按照下面的条件:
35 | # job grade
36 | # AD_PRES A
37 | # ST_MAN B
38 | # IT_PROG C
39 | # SA_REP D
40 | # ST_CLERK E
41 | # 产生下面的结果
42 | # Last_name Job_id Grade
43 | # king AD_PRES A
44 |
45 |
46 |
47 |
48 | SELECT last_name,job_id AS job,
49 | CASE job_id
50 | WHEN 'AD_PRES' THEN 'A'
51 | WHEN 'ST_MAN' THEN 'B'
52 | WHEN 'IT_PROG' THEN 'C'
53 | WHEN 'SA_PRE' THEN 'D'
54 | WHEN 'ST_CLERK' THEN 'E'
55 | END AS Grade
56 | FROM employees
57 | WHERE job_id = 'AD_PRES';
58 |
59 |
--------------------------------------------------------------------------------
/024分组函数.sql:
--------------------------------------------------------------------------------
1 | #二、分组函数
2 | /*
3 | 功能:用作统计使用,又称为聚合函数或统计函数或组函数
4 |
5 | 分类:
6 | sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数
7 |
8 | 特点:
9 | 1、sum、avg一般用于处理数值型
10 | max、min、count可以处理任何类型
11 | 2、以上分组函数都忽略null值
12 |
13 | 3、可以和distinct搭配实现去重的运算
14 |
15 | 4、count函数的单独介绍
16 | 一般使用count(*)用作统计行数
17 |
18 | 5、和分组函数一同查询的字段要求是group by后的字段
19 |
20 | */
21 |
22 |
23 | #1、简单 的使用
24 | SELECT SUM(salary) FROM employees;
25 | SELECT AVG(salary) FROM employees;
26 | SELECT MIN(salary) FROM employees;
27 | SELECT MAX(salary) FROM employees;
28 | SELECT COUNT(salary) FROM employees;
29 |
30 |
31 | SELECT SUM(salary) 和,AVG(salary) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
32 | FROM employees;
33 |
34 | SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
35 | FROM employees;
36 |
37 | #2、参数支持哪些类型
38 |
39 | SELECT SUM(last_name) ,AVG(last_name) FROM employees;
40 | SELECT SUM(hiredate) ,AVG(hiredate) FROM employees;
41 |
42 | SELECT MAX(last_name),MIN(last_name) FROM employees;
43 |
44 | SELECT MAX(hiredate),MIN(hiredate) FROM employees;
45 |
46 | SELECT COUNT(commission_pct) FROM employees;
47 | SELECT COUNT(last_name) FROM employees;
48 |
49 | #3、是否忽略null
50 |
51 | SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees;
52 |
53 | SELECT MAX(commission_pct) ,MIN(commission_pct) FROM employees;
54 |
55 | SELECT COUNT(commission_pct) FROM employees;
56 | SELECT commission_pct FROM employees;
57 |
58 |
59 | #4、和distinct搭配
60 |
61 | SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
62 |
63 | SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;
64 |
65 |
66 |
67 | #5、count函数的详细介绍
68 |
69 | SELECT COUNT(salary) FROM employees;
70 |
71 |
72 | SELECT COUNT(*) FROM employees;
73 |
74 | #新开了全部数据都为1 的一列
75 | SELECT COUNT(1) FROM employees;
76 |
77 | # 效率:
78 | # MYISAM存储引擎下 ,COUNT(*)的效率高
79 | # INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
80 |
81 |
82 | #6、和分组函数一同查询的字段有限制
83 |
84 | SELECT AVG(salary),employee_id FROM employees;
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/025【练习讲解】分组函数.sql:
--------------------------------------------------------------------------------
1 | #1.查询公司员工工资的最大值,最小值,平均值,总和
2 |
3 | SELECT MAX(salary) 最大值,MIN(salary) 最小值,AVG(salary) 平均值,SUM(salary) 和
4 | FROM employees;
5 | #2.查询员工表中的最大入职时间和最小入职时间的相差天数 (DIFFRENCE)
6 |
7 | SELECT MAX(hiredate) 最大,MIN(hiredate) 最小,(MAX(hiredate)-MIN(hiredate))/1000/3600/24 DIFFRENCE
8 | FROM employees;
9 |
10 | SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) DIFFRENCE
11 | FROM employees;
12 |
13 | SELECT DATEDIFF('1995-2-7','1995-2-6');
14 |
15 |
16 | #3.查询部门编号为90的员工个数
17 |
18 | SELECT COUNT(*) FROM employees WHERE department_id = 90;
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/026分组查询.sql:
--------------------------------------------------------------------------------
1 |
2 | #进阶5:分组查询
3 |
4 | /*
5 | 语法:
6 |
7 | select 查询列表
8 | from 表
9 | 【where 筛选条件】
10 | group by 分组的字段
11 | 【order by 排序的字段】;
12 |
13 | 特点:
14 | 1、和分组函数一同查询的字段必须是group by后出现的字段
15 | 2、筛选分为两类:分组前筛选和分组后筛选
16 | 针对的表 位置 连接的关键字
17 | 分组前筛选 原始表 group by前 where
18 |
19 | 分组后筛选 group by后的结果集 group by后 having
20 |
21 | 问题1:分组函数做筛选能不能放在where后面
22 | 答:不能
23 |
24 | 问题2:where——group by——having
25 |
26 | 一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率
27 |
28 | 3、分组可以按单个字段也可以按多个字段
29 | 4、可以搭配着排序使用
30 |
31 |
32 |
33 |
34 | */
35 |
36 | show tables ;
37 |
38 | #引入:查询每个部门的员工个数
39 |
40 | SELECT COUNT(*) FROM employees WHERE department_id=90;
41 | #1.简单的分组
42 |
43 | #案例1:查询每个工种的员工平均工资
44 | SELECT AVG(salary),job_id
45 | FROM employees
46 | GROUP BY job_id;
47 |
48 | #案例2:查询每个位置的部门个数
49 |
50 | SELECT COUNT(*),location_id
51 | FROM departments
52 | GROUP BY location_id;
53 |
54 |
55 | #2、可以实现分组前的筛选
56 |
57 | #案例1:查询邮箱中包含a字符的 每个部门的最高工资
58 |
59 | SELECT MAX(salary),department_id
60 | FROM employees
61 | WHERE email LIKE '%a%'
62 | GROUP BY department_id;
63 |
64 |
65 | #案例2:查询有奖金的每个领导手下员工的平均工资
66 |
67 | SELECT AVG(salary),manager_id
68 | FROM employees
69 | WHERE commission_pct IS NOT NULL
70 | GROUP BY manager_id;
71 |
72 |
73 |
74 | #3、分组后筛选
75 |
76 | #案例:查询哪个部门的员工个数>5
77 |
78 | #①查询每个部门的员工个数
79 | SELECT COUNT(*),department_id
80 | FROM employees
81 | GROUP BY department_id;
82 |
83 | #② 筛选刚才①结果
84 |
85 | SELECT COUNT(*),department_id
86 | FROM employees
87 |
88 | GROUP BY department_id
89 |
90 | HAVING COUNT(*)>5;
91 |
92 |
93 | #案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
94 |
95 | SELECT job_id,MAX(salary)
96 | FROM employees
97 | WHERE commission_pct IS NOT NULL
98 | GROUP BY job_id
99 | HAVING MAX(salary)>12000;
100 |
101 |
102 | SELECT job_id,MAX(salary) 最高工资
103 | FROM employees
104 | WHERE commission_pct IS NOT NULL
105 | GROUP BY job_id
106 | HAVING MAX(salary)>12000;
107 |
108 | SELECT job_id,MAX(salary) '最高工资'
109 | FROM employees
110 | WHERE commission_pct IS NOT NULL
111 | GROUP BY job_id
112 | HAVING MAX(salary)>12000;
113 |
114 |
115 |
116 |
117 | #案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资
118 |
119 | # manager_id>102
120 |
121 | SELECT manager_id,MIN(salary)
122 | FROM employees
123 | GROUP BY manager_id
124 | HAVING MIN(salary)>5000;#分组后的筛选
125 |
126 |
127 | SELECT manager_id 领导编号,MIN(salary) 最低工资
128 | FROM employees
129 | where manager_id is not null
130 | GROUP BY manager_id
131 | HAVING MIN(salary)>5000;#分组后的筛选
132 |
133 |
134 | #4.添加排序
135 |
136 | #案例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
137 |
138 | SELECT job_id,MAX(salary) m
139 | FROM employees
140 | WHERE commission_pct IS NOT NULL
141 | GROUP BY job_id
142 | HAVING m>6000
143 | ORDER BY m ;
144 |
145 |
146 |
147 |
148 | #5.按多个字段分组
149 |
150 | #案例:查询每个工种每个部门的最低工资,并按最低工资降序
151 |
152 | SELECT MIN(salary),job_id,department_id
153 | FROM employees
154 | GROUP BY department_id,job_id
155 | ORDER BY MIN(salary) DESC;
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
--------------------------------------------------------------------------------
/027【案例讲解】分组查询.sql:
--------------------------------------------------------------------------------
1 | #1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
2 |
3 | SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary),job_id
4 | FROM employees
5 | GROUP BY job_id
6 | ORDER BY job_id;
7 |
8 |
9 | #2.查询员工最高工资和最低工资的差距(DIFFERENCE)
10 | SELECT MAX(salary)-MIN(salary) DIFFRENCE
11 | FROM employees;
12 | #3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
13 | SELECT MIN(salary),manager_id
14 | FROM employees
15 | WHERE manager_id IS NOT NULL
16 | GROUP BY manager_id
17 | HAVING MIN(salary)>=6000;
18 |
19 |
20 |
21 | #4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
22 | SELECT department_id,COUNT(*),AVG(salary) a
23 | FROM employees
24 | GROUP BY department_id
25 | ORDER BY a DESC;
26 |
27 | SELECT department_id,COUNT(*),ceil(AVG(salary)) 平均工资
28 | FROM employees
29 | GROUP BY department_id
30 | ORDER BY 平均工资 DESC;
31 |
32 |
33 | #5.选择具有各个job_id的员工人数
34 | SELECT COUNT(*) 个数,job_id
35 | FROM employees
36 | GROUP BY job_id;
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/028连接查询.sql:
--------------------------------------------------------------------------------
1 | #进阶6:连接查询
2 | /*
3 | 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
4 |
5 | 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
6 |
7 | 发生原因:没有有效的连接条件
8 | 如何避免:添加有效的连接条件
9 |
10 | 分类:
11 |
12 | 按年代分类:
13 | sql92标准:仅仅支持内连接
14 | sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
15 |
16 | 按功能分类:
17 | 内连接:
18 | 等值连接
19 | 非等值连接
20 | 自连接
21 | 外连接:
22 | 左外连接
23 | 右外连接
24 | 全外连接
25 |
26 | 交叉连接
27 |
28 |
29 | */
30 |
31 | SELECT * FROM beauty;
32 |
33 | SELECT * FROM boys;
34 |
35 |
36 | SELECT NAME,boyName FROM boys,beauty
37 | WHERE beauty.boyfriend_id= boys.id;
38 |
39 | #一、sql92标准
40 | #1、等值连接
41 | /*
42 |
43 | ① 多表等值连接的结果为多表的交集部分
44 | ②n表连接,至少需要n-1个连接条件
45 | ③ 多表的顺序没有要求
46 | ④一般需要为表起别名
47 | ⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
48 |
49 |
50 | */
51 |
52 |
53 |
54 | #案例1:查询女神名和对应的男神名
55 | SELECT NAME,boyName
56 | FROM boys,beauty
57 | WHERE beauty.boyfriend_id= boys.id;
58 |
59 | #案例2:查询员工名和对应的部门名
60 |
61 | SELECT last_name,department_name
62 | FROM employees,departments
63 | WHERE employees.`department_id`=departments.`department_id`;
64 |
65 |
66 |
67 | #2、为表起别名
68 | /*
69 | ①提高语句的简洁度
70 | ②区分多个重名的字段
71 |
72 | 注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
73 |
74 | */
75 | #查询员工名、工种号、工种名
76 |
77 | SELECT e.last_name,e.job_id,j.job_title
78 | FROM employees e,jobs j
79 | WHERE e.`job_id`=j.`job_id`;
80 |
81 |
82 | #3、两个表的顺序是否可以调换
83 |
84 | #查询员工名、工种号、工种名
85 |
86 | SELECT e.last_name,e.job_id,j.job_title
87 | FROM jobs j,employees e
88 | WHERE e.`job_id`=j.`job_id`;
89 |
90 |
91 | #4、可以加筛选
92 |
93 |
94 | #案例:查询有奖金的员工名、部门名
95 |
96 | SELECT last_name,department_name,commission_pct
97 |
98 | FROM employees e,departments d
99 | WHERE e.`department_id`=d.`department_id`
100 | AND e.`commission_pct` IS NOT NULL;
101 |
102 | #案例2:查询城市名中第二个字符为o的部门名和城市名
103 |
104 | SELECT department_name,city
105 | FROM departments d,locations l
106 | WHERE d.`location_id` = l.`location_id`
107 | AND city LIKE '_o%';
108 |
109 | #5、可以加分组
110 |
111 |
112 | #案例1:查询每个城市的部门个数
113 |
114 | SELECT COUNT(*) 个数,city
115 | FROM departments d,locations l
116 | WHERE d.`location_id`=l.`location_id`
117 | GROUP BY city;
118 |
119 |
120 | #案例2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
121 | SELECT department_name,d.`manager_id`,MIN(salary)
122 | FROM departments d,employees e
123 | WHERE d.`department_id`=e.`department_id`
124 | AND commission_pct IS NOT NULL
125 | GROUP BY department_name,d.`manager_id`;
126 | #6、可以加排序
127 |
128 |
129 | #案例:查询每个工种的工种名和员工的个数,并且按员工个数降序
130 |
131 | SELECT job_title,COUNT(*)
132 | FROM employees e,jobs j
133 | WHERE e.`job_id`=j.`job_id`
134 | GROUP BY job_title
135 | ORDER BY COUNT(*) DESC;
136 |
137 |
138 |
139 |
140 | #7、可以实现三表连接?
141 |
142 | #案例:查询员工名、部门名和所在的城市
143 |
144 | SELECT last_name,department_name,city
145 | FROM employees e,departments d,locations l
146 | WHERE e.`department_id`=d.`department_id`
147 | AND d.`location_id`=l.`location_id`
148 | AND city LIKE 's%'
149 |
150 | ORDER BY department_name DESC;
151 |
152 |
153 |
154 | #2、非等值连接
155 |
156 |
157 | #案例1:查询员工的工资和工资级别
158 |
159 |
160 | SELECT salary,grade_level
161 | FROM employees e,job_grades g
162 | WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
163 | AND g.`grade_level`='A';
164 |
165 | /*
166 | select salary,employee_id from employees;
167 | select * from job_grades;
168 | CREATE TABLE job_grades
169 | (grade_level VARCHAR(3),
170 | lowest_sal int,
171 | highest_sal int);
172 |
173 | INSERT INTO job_grades
174 | VALUES ('A', 1000, 2999);
175 |
176 | INSERT INTO job_grades
177 | VALUES ('B', 3000, 5999);
178 |
179 | INSERT INTO job_grades
180 | VALUES('C', 6000, 9999);
181 |
182 | INSERT INTO job_grades
183 | VALUES('D', 10000, 14999);
184 |
185 | INSERT INTO job_grades
186 | VALUES('E', 15000, 24999);
187 |
188 | INSERT INTO job_grades
189 | VALUES('F', 25000, 40000);
190 |
191 | */
192 |
193 |
194 |
195 |
196 | #3、自连接
197 |
198 |
199 |
200 | #案例:查询 员工名和上级的名称
201 |
202 | SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
203 | FROM employees e,employees m
204 | WHERE e.`manager_id`=m.`employee_id`;
205 |
206 |
207 |
208 | SELECT e.employee_id,e.`manager_id`,e.last_name,m.employee_id,m.last_name
209 | FROM employees e,employees m
210 | WHERE e.`manager_id`=m.`employee_id`;
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
--------------------------------------------------------------------------------
/030【作业讲解】连接查询.sql:
--------------------------------------------------------------------------------
1 | #1.显示所有员工的姓名,部门号和部门名称。
2 |
3 | SELECT last_name,d.department_id,department_name
4 | FROM employees e,departments d
5 | WHERE e.`department_id` = d.`department_id`;
6 |
7 |
8 | #2.查询90号部门员工的job_id和90号部门的location_id
9 |
10 | SELECT job_id,location_id
11 | FROM employees e,departments d
12 | WHERE e.`department_id`=d.`department_id`
13 | AND e.`department_id`=90;
14 |
15 |
16 |
17 | #3. 选择所有有奖金的员工的
18 | # last_name , department_name , location_id , city
19 |
20 |
21 | SELECT last_name , department_name , l.location_id , city
22 | FROM employees e,departments d,locations l
23 | WHERE e.department_id = d.department_id
24 | AND d.location_id=l.location_id
25 | AND e.commission_pct IS NOT NULL;
26 |
27 |
28 | #4.选择city在Toronto工作的员工的
29 | # last_name , job_id , department_id , department_name
30 |
31 | SELECT last_name , job_id , d.department_id , department_name
32 | FROM employees e,departments d ,locations l
33 | WHERE e.department_id = d.department_id
34 | AND d.location_id=l.location_id
35 | AND city = 'Toronto';
36 |
37 |
38 |
39 | #5.查询每个工种、每个部门的部门名、工种名和最低工资
40 |
41 |
42 | SELECT department_name,job_title,MIN(salary) 最低工资
43 | FROM employees e,departments d,jobs j
44 | WHERE e.`department_id`=d.`department_id`
45 | AND e.`job_id`=j.`job_id`
46 | GROUP BY department_name,job_title;
47 |
48 |
49 |
50 | #6.查询每个国家下的部门个数大于2的国家编号
51 |
52 | SELECT country_id,COUNT(*) 部门个数
53 | FROM departments d,locations l
54 | WHERE d.`location_id`=l.`location_id`
55 | GROUP BY country_id
56 | HAVING 部门个数>2;
57 |
58 |
59 |
60 |
61 |
62 | #7、选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
63 | # employees Emp# manager Mgr#
64 | # kochhar 101 king 100
65 |
66 |
67 | SELECT e.last_name employees,e.employee_id "Emp#",m.last_name manager,m.employee_id "Mgr#"
68 | FROM employees e,employees m
69 | WHERE e.manager_id = m.employee_id
70 | AND e.last_name='kochhar';
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/031sql99语法的连接查询.sql:
--------------------------------------------------------------------------------
1 | #二、sql99语法
2 | /*
3 | 语法:
4 | select 查询列表
5 | from 表1 别名 【连接类型】
6 | join 表2 别名
7 | on 连接条件
8 | 【where 筛选条件】
9 | 【group by 分组】
10 | 【having 筛选条件】
11 | 【order by 排序列表】
12 |
13 |
14 | 分类:
15 | 内连接(★):inner
16 | 外连接
17 | 左外(★):left 【outer】
18 | 右外(★):right 【outer】
19 | 全外:full【outer】
20 | 交叉连接:cross
21 |
22 | */
23 |
24 |
25 | #一)内连接
26 | /*
27 | 语法:
28 |
29 | select 查询列表
30 | from 表1 别名
31 | inner join 表2 别名
32 | on 连接条件;
33 |
34 | 分类:
35 | 等值
36 | 非等值
37 | 自连接
38 |
39 | 特点:
40 | ①添加排序、分组、筛选
41 | ②inner可以省略
42 | ③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
43 | ④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
44 |
45 |
46 |
47 |
48 |
49 | */
50 |
51 |
52 | #1、等值连接
53 | #案例1.查询员工名、部门名
54 |
55 | SELECT last_name, department_name
56 | FROM departments d
57 | JOIN employees e
58 | ON e.`department_id` = d.`department_id`;
59 |
60 |
61 | #案例2.查询名字中包含e的员工名和工种名(添加筛选)
62 | SELECT last_name, job_title
63 | FROM employees e
64 | INNER JOIN jobs j
65 | ON e.`job_id` = j.`job_id`
66 | WHERE e.`last_name` LIKE '%e%';
67 |
68 |
69 |
70 | #3. 查询部门个数>3的城市名和部门个数,(添加分组+筛选)
71 |
72 | #①查询每个城市的部门个数
73 | #②在①结果上筛选满足条件的
74 | SELECT city, COUNT(*) 部门个数
75 | FROM departments d
76 | INNER JOIN locations l
77 | ON d.`location_id` = l.`location_id`
78 | GROUP BY city
79 | HAVING COUNT(*) > 3;
80 |
81 |
82 |
83 | #案例4.查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)
84 |
85 | #①查询每个部门的员工个数
86 | SELECT COUNT(*), department_name
87 | FROM employees e
88 | INNER JOIN departments d
89 | ON e.`department_id` = d.`department_id`
90 | GROUP BY department_name;
91 |
92 | #② 在①结果上筛选员工个数>3的记录,并排序
93 |
94 | SELECT COUNT(*) 个数, department_name
95 | FROM employees e
96 | INNER JOIN departments d
97 | ON e.`department_id` = d.`department_id`
98 | GROUP BY department_name
99 | HAVING COUNT(*) > 3
100 | ORDER BY COUNT(*) DESC;
101 |
102 | #5.查询员工名、部门名、工种名,并按部门名降序(添加三表连接)
103 |
104 | SELECT last_name, department_name, job_title
105 | FROM employees e
106 | INNER JOIN departments d ON e.`department_id` = d.`department_id`
107 | INNER JOIN jobs j ON e.`job_id` = j.`job_id`
108 |
109 | ORDER BY department_name DESC;
110 |
111 | #二)非等值连接
112 |
113 | #查询员工的工资级别
114 |
115 | SELECT salary, grade_level
116 | FROM employees e
117 | JOIN job_grades g
118 | ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
119 |
120 |
121 | #查询工资级别的个数>20的个数,并且按工资级别降序
122 | SELECT COUNT(*) 总数, grade_level
123 | FROM employees e
124 | JOIN job_grades g
125 | ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
126 | GROUP BY grade_level
127 | HAVING COUNT(*) > 20
128 | ORDER BY grade_level DESC;
129 |
130 |
131 | #三)自连接
132 |
133 | #查询员工的名字、上级的名字
134 | SELECT e.last_name, m.last_name
135 | FROM employees e
136 | JOIN employees m
137 | ON e.`manager_id` = m.`employee_id`;
138 |
139 | #查询姓名中包含字符k的员工的名字、上级的名字
140 | SELECT e.last_name, m.last_name
141 | FROM employees e
142 | JOIN employees m
143 | ON e.`manager_id` = m.`employee_id`
144 | WHERE e.`last_name` LIKE '%k%';
145 |
146 |
147 | #二、外连接
148 |
149 | /*
150 | 应用场景:用于查询一个表中有,另一个表没有的记录
151 |
152 | 特点:
153 | 1、外连接的查询结果为主表中的所有记录
154 | 如果从表中有和它匹配的,则显示匹配的值
155 | 如果从表中没有和它匹配的,则显示null
156 | 外连接查询结果=内连接结果+主表中有而从表没有的记录
157 | 2、左外连接,left join左边的是主表
158 | 右外连接,right join右边的是主表
159 | 3、左外和右外交换两个表的顺序,可以实现同样的效果
160 | 4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
161 | */
162 | #引入:查询男朋友 不在男神表的的女神名
163 |
164 | SELECT *
165 | FROM beauty;
166 | SELECT *
167 | FROM boys;
168 |
169 | #左外连接
170 | SELECT b.*, bo.*
171 | FROM boys bo
172 | LEFT OUTER JOIN beauty b
173 | ON b.`boyfriend_id` = bo.`id`
174 | # WHERE b.`id` IS NULL;
175 |
176 |
177 | #案例1:查询哪个部门没有员工
178 | #左外
179 | SELECT d.*, e.employee_id
180 | FROM departments d
181 | LEFT OUTER JOIN employees e
182 | ON d.`department_id` = e.`department_id`
183 | WHERE e.`employee_id` IS NULL;
184 |
185 |
186 | #右外
187 |
188 | SELECT d.*, e.employee_id
189 | FROM employees e
190 | RIGHT OUTER JOIN departments d
191 | ON d.`department_id` = e.`department_id`
192 | WHERE e.`employee_id` IS NULL;
193 |
194 |
195 | #全外
196 |
197 |
198 | # USE girls;
199 | # SELECT b.*, bo.*
200 | # FROM beauty b
201 | # FULL OUTER JOIN boys bo
202 | # ON b.`boyfriend_id` = bo.id;
203 |
204 |
205 | #交叉连接
206 |
207 | SELECT b.*, bo.*
208 | FROM beauty b
209 | CROSS JOIN boys bo;
210 |
211 |
212 |
213 | #sql92和 sql99pk
214 | /*
215 | 功能:sql99支持的较多
216 | 可读性:sql99实现连接条件和筛选条件的分离,可读性较高
217 | */
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
--------------------------------------------------------------------------------
/032【案例讲解】外连接.sql:
--------------------------------------------------------------------------------
1 |
2 |
3 | #一、查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,用null填充
4 |
5 |
6 | SELECT b.id,b.name,bo.*
7 | FROM beauty b
8 | LEFT OUTER JOIN boys bo
9 | ON b.`boyfriend_id` = bo.`id`
10 | WHERE b.`id`>3;
11 | #二、查询哪个城市没有部门
12 |
13 | SELECT city
14 | FROM departments d
15 | RIGHT OUTER JOIN locations l
16 | ON d.`location_id`=l.`location_id`
17 | WHERE d.`department_id` IS NULL;
18 |
19 | #三、查询部门名为SAL或IT的员工信息
20 |
21 | SELECT e.*,d.department_name,d.`department_id`
22 | FROM departments d
23 | LEFT JOIN employees e
24 | ON d.`department_id` = e.`department_id`
25 | WHERE d.`department_name` IN('SAL','IT');
26 |
27 |
28 | SELECT * FROM departments
29 | WHERE `department_name` IN('SAL','IT');
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/033子查询.sql:
--------------------------------------------------------------------------------
1 | #进阶7:子查询
2 | /*
3 | 含义:
4 | 出现在其他语句中的select语句,称为子查询或内查询
5 | 外部的查询语句,称为主查询或外查询
6 |
7 | 分类:
8 | 按子查询出现的位置:
9 | select后面:
10 | 仅仅支持标量子查询
11 |
12 | from后面:
13 | 支持表子查询
14 | where或having后面:★
15 | 标量子查询(单行) √
16 | 列子查询 (多行) √
17 |
18 | 行子查询
19 |
20 | exists后面(相关子查询)
21 | 表子查询
22 | 按结果集的行列数不同:
23 | 标量子查询(结果集只有一行一列)
24 | 列子查询(结果集只有一列多行)
25 | 行子查询(结果集有一行多列)
26 | 表子查询(结果集一般为多行多列)
27 |
28 |
29 |
30 | */
31 |
32 |
33 | #一、where或having后面
34 | /*
35 | 1、标量子查询(单行子查询)
36 | 2、列子查询(多行子查询)
37 |
38 | 3、行子查询(多列多行)
39 |
40 | 特点:
41 | ①子查询放在小括号内
42 | ②子查询一般放在条件的右侧
43 | ③标量子查询,一般搭配着单行操作符使用
44 | > < >= <= = <>
45 |
46 | 列子查询,一般搭配着多行操作符使用
47 | in、any/some、all
48 |
49 | ④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
50 |
51 | */
52 | #1.标量子查询★
53 |
54 | #案例1:谁的工资比 Abel 高?
55 |
56 | #①查询Abel的工资
57 | SELECT salary
58 | FROM employees
59 | WHERE last_name = 'Abel';
60 |
61 | #②查询员工的信息,满足 salary>①结果
62 | SELECT *
63 | FROM employees
64 | WHERE salary > (
65 | SELECT salary
66 | FROM employees
67 | WHERE last_name = 'Abel'
68 | );
69 |
70 | SELECT last_name
71 | FROM employees
72 | WHERE salary > (
73 | SELECT salary
74 | FROM employees
75 | WHERE last_name = 'Abel'
76 | );
77 |
78 | #案例2:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和工资
79 |
80 | #①查询141号员工的job_id
81 | SELECT job_id
82 | FROM employees
83 | WHERE employee_id = 141;
84 |
85 | #②查询143号员工的salary
86 | SELECT salary
87 | FROM employees
88 | WHERE employee_id = 143;
89 |
90 | #③查询员工的姓名,job_id 和工资,要求job_id=①并且salary>②
91 |
92 | SELECT last_name, job_id, salary
93 | FROM employees
94 | WHERE job_id = (
95 | SELECT job_id
96 | FROM employees
97 | WHERE employee_id = 141
98 | )
99 | AND salary > (
100 | SELECT salary
101 | FROM employees
102 | WHERE employee_id = 143
103 | );
104 |
105 |
106 | #案例3:返回公司工资最少的员工的last_name,job_id和salary
107 |
108 | #①查询公司的 最低工资
109 | SELECT MIN(salary)
110 | FROM employees;
111 |
112 | #②查询last_name,job_id和salary,要求salary=①
113 | SELECT last_name, job_id, salary
114 | FROM employees
115 | WHERE salary = (
116 | SELECT MIN(salary)
117 | FROM employees
118 | );
119 |
120 |
121 | #案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
122 |
123 | #①查询50号部门的最低工资
124 | SELECT MIN(salary)
125 | FROM employees
126 | WHERE department_id = 50;
127 |
128 | #②查询每个部门的最低工资
129 |
130 | SELECT MIN(salary), department_id
131 | FROM employees
132 | GROUP BY department_id;
133 |
134 | #③ 在②基础上筛选,满足min(salary)>①
135 | SELECT MIN(salary), department_id
136 | FROM employees
137 | GROUP BY department_id
138 | HAVING MIN(salary) > (
139 | SELECT MIN(salary)
140 | FROM employees
141 | WHERE department_id = 50
142 | );
143 |
144 | #非法使用标量子查询
145 |
146 | SELECT MIN(salary), department_id
147 | FROM employees
148 | GROUP BY department_id
149 | HAVING MIN(salary) > (
150 | SELECT salary
151 | FROM employees
152 | WHERE department_id = 250
153 | );
154 |
155 |
156 |
157 | #2.列子查询(多行子查询)★
158 | #案例1:返回location_id是1400或1700的部门中的所有员工姓名
159 |
160 | #①查询location_id是1400或1700的部门编号
161 | SELECT DISTINCT department_id
162 | FROM departments
163 | WHERE location_id IN (1400, 1700);
164 |
165 | #②查询员工姓名,要求部门号是①列表中的某一个
166 |
167 | SELECT last_name
168 | FROM employees
169 | WHERE department_id <> ALL (
170 | SELECT DISTINCT department_id
171 | FROM departments
172 | WHERE location_id IN (1400, 1700)
173 | );
174 |
175 |
176 | SELECT last_name
177 | FROM employees
178 | WHERE department_id != ALL (
179 | SELECT DISTINCT department_id
180 | FROM departments
181 | WHERE location_id IN (1400, 1700)
182 | );
183 | #案例2:返回其它工种中比job_id为‘IT_PROG’工种任一工资低的员工的员工号、姓名、job_id 以及salary
184 |
185 | #①查询job_id为‘IT_PROG’部门任一工资
186 |
187 | SELECT DISTINCT salary
188 | FROM employees
189 | WHERE job_id = 'IT_PROG';
190 |
191 | #②查询员工号、姓名、job_id 以及salary,salary<(①)的任意一个
192 | SELECT last_name, employee_id, job_id, salary
193 | FROM employees
194 | WHERE salary < ANY (
195 | SELECT DISTINCT salary
196 | FROM employees
197 | WHERE job_id = 'IT_PROG'
198 | )
199 | AND job_id <> 'IT_PROG';
200 |
201 | #或
202 | SELECT last_name, employee_id, job_id, salary
203 | FROM employees
204 | WHERE salary < (
205 | SELECT MAX(salary)
206 | FROM employees
207 | WHERE job_id = 'IT_PROG'
208 | )
209 | AND job_id <> 'IT_PROG';
210 |
211 |
212 | #案例3:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工 的员工号、姓名、job_id 以及salary
213 |
214 | SELECT last_name, employee_id, job_id, salary
215 | FROM employees
216 | WHERE salary < ALL (
217 | SELECT DISTINCT salary
218 | FROM employees
219 | WHERE job_id = 'IT_PROG'
220 | )
221 | AND job_id <> 'IT_PROG';
222 |
223 | #或
224 |
225 | SELECT last_name, employee_id, job_id, salary
226 | FROM employees
227 | WHERE salary < (
228 | SELECT MIN(salary)
229 | FROM employees
230 | WHERE job_id = 'IT_PROG'
231 | )
232 | AND job_id <> 'IT_PROG';
233 |
234 |
235 |
236 | #3、行子查询(结果集一行多列或多行多列)
237 |
238 | #案例:查询员工编号最小并且工资最高的员工信息
239 |
240 |
241 | SELECT *
242 | FROM employees
243 | #筛选条件用括号括起来 与子查询一一对应
244 | WHERE (employee_id, salary) = (
245 | SELECT MIN(employee_id), MAX(salary)
246 | FROM employees
247 | );
248 |
249 | #①查询最小的员工编号
250 | SELECT MIN(employee_id)
251 | FROM employees;
252 |
253 |
254 | #②查询最高工资
255 | SELECT MAX(salary)
256 | FROM employees;
257 |
258 |
259 | #③查询员工信息
260 | SELECT *
261 | FROM employees
262 | WHERE employee_id = (
263 | SELECT MIN(employee_id)
264 | FROM employees
265 | )
266 | AND salary = (
267 | SELECT MAX(salary)
268 | FROM employees
269 | );
270 |
271 |
272 | #二、select后面
273 | /*
274 | 仅仅支持标量子查询
275 | */
276 |
277 | #案例:查询每个部门的员工个数
278 |
279 |
280 | SELECT d.*,
281 | (
282 | SELECT COUNT(*)
283 | FROM employees e
284 | WHERE e.department_id = d.`department_id`
285 | ) 个数
286 | FROM departments d;
287 |
288 |
289 | #案例2:查询员工号=102的部门名
290 |
291 | SELECT (
292 | SELECT department_name, e.department_id
293 | FROM departments d
294 | INNER JOIN employees e
295 | ON d.department_id = e.department_id
296 | WHERE e.employee_id = 102
297 | ) 部门名;
298 |
299 |
300 |
301 | #三、from后面
302 | /*
303 | 将子查询结果充当一张表,要求必须起别名
304 | */
305 |
306 | #案例:查询每个部门的平均工资的工资等级
307 | #①查询每个部门的平均工资
308 | SELECT AVG(salary), department_id
309 | FROM employees
310 | GROUP BY department_id;
311 |
312 |
313 | SELECT *
314 | FROM job_grades;
315 |
316 |
317 | #②连接①的结果集和job_grades表,筛选条件平均工资 between lowest_sal and highest_sal
318 |
319 | SELECT ag_dep.*, g.`grade_level`
320 | FROM (
321 | SELECT AVG(salary) ag, department_id
322 | FROM employees
323 | GROUP BY department_id
324 | ) ag_dep
325 | INNER JOIN job_grades g
326 | ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
327 |
328 |
329 |
330 | #四、exists后面(相关子查询)
331 |
332 | /*
333 | 语法:
334 | exists(完整的查询语句)
335 | 结果:
336 | 1或0
337 |
338 |
339 |
340 | */
341 |
342 | SELECT EXISTS(SELECT employee_id FROM employees WHERE salary = 300000);
343 |
344 | #案例1:查询有员工的部门名
345 |
346 | #in
347 | SELECT department_name
348 | FROM departments d
349 | WHERE d.`department_id` IN (
350 | SELECT department_id
351 | FROM employees
352 | );
353 |
354 | #exists
355 |
356 | SELECT department_name
357 | FROM departments d
358 | WHERE EXISTS(
359 | SELECT *
360 | FROM employees e
361 | WHERE d.`department_id` = e.`department_id`
362 | );
363 |
364 |
365 | #案例2:查询没有女朋友的男神信息
366 |
367 | #in
368 |
369 | SELECT bo.*
370 | FROM boys bo
371 | WHERE bo.id NOT IN (
372 | SELECT boyfriend_id
373 | FROM beauty
374 | );
375 |
376 | #exists
377 | SELECT bo.*
378 | FROM boys bo
379 | WHERE NOT EXISTS(
380 | SELECT boyfriend_id
381 | FROM beauty b
382 | WHERE bo.`id` = b.`boyfriend_id`
383 | );
384 |
385 |
386 |
--------------------------------------------------------------------------------
/034【案例讲解】子查询.sql:
--------------------------------------------------------------------------------
1 | #1. 查询和Zlotkey相同部门的员工姓名和工资
2 |
3 | #①查询Zlotkey的部门
4 | SELECT department_id
5 | FROM employees
6 | WHERE last_name = 'Zlotkey'
7 |
8 | #②查询部门号=①的姓名和工资
9 | SELECT last_name,salary
10 | FROM employees
11 | WHERE department_id = (
12 | SELECT department_id
13 | FROM employees
14 | WHERE last_name = 'Zlotkey'
15 |
16 | );
17 |
18 | #2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
19 |
20 | #①查询平均工资
21 | SELECT AVG(salary)
22 | FROM employees;
23 |
24 | #②查询工资>①的员工号,姓名和工资。
25 |
26 | SELECT last_name,employee_id,salary
27 | FROM employees
28 | WHERE salary>(
29 |
30 | SELECT AVG(salary)
31 | FROM employees
32 | );
33 |
34 |
35 |
36 | #3.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
37 | #①查询各部门的平均工资
38 | SELECT AVG(salary),department_id
39 | FROM employees
40 | GROUP BY department_id;
41 |
42 | #②连接①结果集和employees表,进行筛选
43 | SELECT employee_id,last_name,salary,e.department_id
44 | FROM employees e
45 | INNER JOIN (
46 | SELECT AVG(salary) ag,department_id
47 | FROM employees
48 | GROUP BY department_id
49 | ) ag_dep
50 | ON e.department_id = ag_dep.department_id
51 | WHERE salary>ag_dep.ag ;
52 |
53 |
54 |
55 | #4. 查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
56 | #①查询姓名中包含字母u的员工的部门
57 |
58 | SELECT DISTINCT department_id
59 | FROM employees
60 | WHERE last_name LIKE '%u%';
61 |
62 | #②查询部门号=①中的任意一个的员工号和姓名
63 | SELECT last_name,employee_id
64 | FROM employees
65 | WHERE department_id IN(
66 | SELECT DISTINCT department_id
67 | FROM employees
68 | WHERE last_name LIKE '%u%'
69 | );
70 |
71 |
72 | #5. 查询在部门的location_id为1700的部门工作的员工的员工号
73 |
74 | #①查询location_id为1700的部门
75 |
76 | SELECT DISTINCT department_id
77 | FROM departments
78 | WHERE location_id = 1700;
79 |
80 |
81 | #②查询部门号=①中的任意一个的员工号
82 | SELECT employee_id
83 | FROM employees
84 | WHERE department_id =ANY(
85 | SELECT DISTINCT department_id
86 | FROM departments
87 | WHERE location_id = 1700
88 |
89 | );
90 | #6.查询管理者是King的员工姓名和工资
91 |
92 | #①查询姓名为king的员工编号
93 | SELECT employee_id
94 | FROM employees
95 | WHERE last_name = 'K_ing'
96 |
97 | #②查询哪个员工的manager_id = ①
98 | SELECT last_name,salary
99 | FROM employees
100 | WHERE manager_id IN(
101 | SELECT employee_id
102 | FROM employees
103 | WHERE last_name = 'K_ing'
104 |
105 | );
106 |
107 | #7.查询工资最高的员工的姓名,要求first_name和last_name显示为一列,列名为 姓.名
108 |
109 |
110 | #①查询最高工资
111 | SELECT MAX(salary)
112 | FROM employees
113 |
114 | #②查询工资=①的姓.名
115 |
116 | SELECT CONCAT(first_name,last_name) "姓.名"
117 | FROM employees
118 | WHERE salary=(
119 | SELECT MAX(salary)
120 | FROM employees
121 |
122 | );
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/035分页查询.sql:
--------------------------------------------------------------------------------
1 | #进阶8:分页查询 ★
2 | /*
3 |
4 | 应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
5 | 语法:
6 | select 查询列表
7 | from 表
8 | 【join type join 表2
9 | on 连接条件
10 | where 筛选条件
11 | group by 分组字段
12 | having 分组后的筛选
13 | order by 排序的字段】
14 | limit 【offset,】size;
15 |
16 | offset要显示条目的起始索引(起始索引从0开始)
17 | size 要显示的条目个数
18 | 特点:
19 | ①limit语句放在查询语句的最后
20 | ②公式
21 | 要显示的页数 page,每页的条目数size
22 |
23 | select 查询列表
24 | from 表
25 | limit (page-1)*size,size;
26 |
27 | size=10
28 | page
29 | 1 0
30 | 2 10
31 | 3 20
32 |
33 | */
34 | #案例1:查询前五条员工信息
35 |
36 |
37 | SELECT * FROM employees LIMIT 0,5;
38 | SELECT * FROM employees LIMIT 5;
39 |
40 |
41 | #案例2:查询第11条——第25条
42 | SELECT * FROM employees LIMIT 10,15;
43 |
44 |
45 | #案例3:有奖金的员工信息,并且工资较高的前10名显示出来
46 | SELECT
47 | *
48 | FROM
49 | employees
50 | WHERE commission_pct IS NOT NULL
51 | ORDER BY salary DESC
52 | LIMIT 10 ;
53 |
54 |
--------------------------------------------------------------------------------
/036student.sql:
--------------------------------------------------------------------------------
1 |
2 |
3 | CREATE TABLE student(
4 | studentno VARCHAR(10) NOT NULL PRIMARY KEY,
5 | studentname VARCHAR(20) NOT NULL,
6 | loginpwd VARCHAR(8) NOT NULL,
7 | sex CHAR(1) ,
8 | majorid INT NOT NULL REFERENCES grade(majorid),
9 | phone VARCHAR(11),
10 | email VARCHAR(20) ,
11 | borndate DATETIME
12 | );
13 |
14 | CREATE TABLE major(
15 | majorid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
16 | majorname VARCHAR(20) NOT NULL
17 |
18 | );
19 | CREATE TABLE result(
20 | id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
21 | studentno VARCHAR(10) NOT NULL REFERENCES student(studentno),
22 | score DOUBLE
23 | );
24 |
25 |
26 | INSERT INTO major VALUES(NULL,'javaee');
27 | INSERT INTO major VALUES(NULL,'html5');
28 | INSERT INTO major VALUES(NULL,'android');
29 |
30 |
31 | INSERT INTO student VALUES('S001','张三封','8888','男',1,'13288886666','zhangsanfeng@126.com','1966-9-1');
32 | INSERT INTO student VALUES('S002','殷天正','8888','男',1,'13888881234','yintianzheng@qq.com','1976-9-2');
33 | INSERT INTO student VALUES('S003','周伯通','8888','男',2,'13288886666','zhoubotong@126.com','1986-9-3');
34 | INSERT INTO student VALUES('S004','张翠山','8888','男',1,'13288886666',NULL,'1995-9-4');
35 | INSERT INTO student VALUES('S005','小小张','8888','女',3,'13288885678','xiaozhang@126.com','1990-9-5');
36 |
37 | INSERT INTO student VALUES('S006','张无忌','8888','男',2,'13288886666','zhangwuji@126.com','1998-8-9');
38 | INSERT INTO student VALUES('S007','赵敏','0000','女',1,'13288880987','zhaomin@126.com','1998-6-9');
39 | INSERT INTO student VALUES('S008','周芷若','6666','女',1,'13288883456','zhouzhiruo@126.com','1996-7-9');
40 | INSERT INTO student VALUES('S009','殷素素','8888','女',1,'13288886666','yinsusu@163.com','1986-1-9');
41 | INSERT INTO student VALUES('S010','宋远桥','6666','男',3,'1328888890','songyuanqiao@qq.com','1996-2-9');
42 |
43 |
44 | INSERT INTO student VALUES('S011','杨不悔','6666','女',2,'13288882345',NULL,'1995-9-9');
45 | INSERT INTO student VALUES('S012','杨逍','9999','男',1,'13288885432',NULL,'1976-9-9');
46 | INSERT INTO student VALUES('S013','纪晓芙','9999','女',3,'13288888765',NULL,'1976-9-9');
47 | INSERT INTO student VALUES('S014','谢逊','9999','男',1,'13288882211',NULL,'1946-9-9');
48 | INSERT INTO student VALUES('S015','宋青书','9999','男',3,'13288889900',NULL,'1976-6-8');
49 |
50 |
51 |
52 | INSERT INTO result VALUES(NULL,'s001',100);
53 | INSERT INTO result VALUES(NULL,'s002',90);
54 | INSERT INTO result VALUES(NULL,'s003',80);
55 |
56 | INSERT INTO result VALUES(NULL,'s004',70);
57 | INSERT INTO result VALUES(NULL,'s005',60);
58 | INSERT INTO result VALUES(NULL,'s006',50);
59 | INSERT INTO result VALUES(NULL,'s006',40);
60 | INSERT INTO result VALUES(NULL,'s005',95);
61 | INSERT INTO result VALUES(NULL,'s006',88);
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/037【作业讲解】查询.sql:
--------------------------------------------------------------------------------
1 | #一、查询每个专业的学生人数
2 | SELECT majorid,COUNT(*)
3 | FROM student
4 | GROUP BY majorid;
5 |
6 | #二、查询参加考试的学生中,每个学生的平均分、最高分
7 | SELECT AVG(score),MAX(score),studentno
8 | FROM result
9 | GROUP BY studentno;
10 |
11 | #三、查询姓张的每个学生的最低分大于60的学号、姓名
12 | SELECT s.studentno,s.`studentname`,MIN(score)
13 | FROM student s
14 | JOIN result r
15 | ON s.`studentno`=r.`studentno`
16 | WHERE s.`studentname` LIKE '张%'
17 | GROUP BY s.`studentno`
18 | HAVING MIN(score)>60;
19 | #四、查询每个专业生日在“1988-1-1”后的学生姓名、专业名称
20 |
21 | SELECT m.`majorname`,s.`studentname`
22 | FROM student s
23 | JOIN major m
24 | ON m.`majorid`=s.`majorid`
25 | WHERE DATEDIFF(borndate,'1988-1-1')>0
26 | GROUP BY m.`majorid`;
27 |
28 |
29 | #五、查询每个专业的男生人数和女生人数分别是多少
30 |
31 | SELECT COUNT(*),sex,majorid
32 | FROM student
33 | GROUP BY sex,majorid;
34 | #六、查询专业和张翠山一样的学生的最低分
35 | #①查询张翠山的专业编号
36 | SELECT majorid
37 | FROM student
38 | WHERE studentname = '张翠山'
39 |
40 | #②查询编号=①的所有学生编号
41 | SELECT studentno
42 | FROM student
43 | WHERE majorid=(
44 | SELECT majorid
45 | FROM student
46 | WHERE studentname = '张翠山'
47 |
48 | )
49 | #②查询最低分
50 | SELECT MIN(score)
51 | FROM result
52 | WHERE studentno IN(
53 |
54 | SELECT studentno
55 | FROM student
56 | WHERE majorid=(
57 | SELECT majorid
58 | FROM student
59 | WHERE studentname = '张翠山'
60 |
61 | )
62 | )
63 |
64 | #七、查询大于60分的学生的姓名、密码、专业名
65 |
66 | SELECT studentname,loginpwd,majorname
67 | FROM student s
68 | JOIN major m ON s.majorid= m.majorid
69 | JOIN result r ON s.studentno=r.studentno
70 | WHERE r.score>60;
71 | #八、按邮箱位数分组,查询每组的学生个数
72 | SELECT COUNT(*),LENGTH(email)
73 | FROM student
74 | GROUP BY LENGTH(email);
75 | #九、查询学生名、专业名、分数
76 |
77 | SELECT studentname,score,majorname
78 | FROM student s
79 | JOIN major m ON s.majorid= m.majorid
80 | LEFT JOIN result r ON s.studentno=r.studentno
81 |
82 |
83 | #十、查询哪个专业没有学生,分别用左连接和右连接实现
84 | #左
85 | SELECT m.`majorid`,m.`majorname`,s.`studentno`
86 | FROM major m
87 | LEFT JOIN student s ON m.`majorid` = s.`majorid`
88 | WHERE s.`studentno` IS NULL;
89 |
90 | #右
91 | SELECT m.`majorid`,m.`majorname`,s.`studentno`
92 | FROM student s
93 | RIGHT JOIN major m ON m.`majorid` = s.`majorid`
94 | WHERE s.`studentno` IS NULL;
95 | #十一、查询没有成绩的学生人数
96 |
97 | SELECT COUNT(*)
98 | FROM student s
99 | LEFT JOIN result r ON s.`studentno` = r.`studentno`
100 | WHERE r.`id` IS NULL
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/038子查询经典案例.sql:
--------------------------------------------------------------------------------
1 | # 1. 查询工资最低的员工信息: last_name, salary
2 |
3 | #①查询最低的工资
4 | SELECT MIN(salary)
5 | FROM employees;
6 |
7 | #②查询last_name,salary,要求salary=①
8 | SELECT last_name, salary
9 | FROM employees
10 | WHERE salary = (
11 | SELECT MIN(salary)
12 | FROM employees
13 | );
14 |
15 | # 2. 查询平均工资最低的部门信息
16 |
17 | #方式一:
18 | #①各部门的平均工资
19 | SELECT AVG(salary), department_id
20 | FROM employees
21 | GROUP BY department_id;
22 | #②查询①结果上的最低平均工资
23 | SELECT MIN(ag)
24 | FROM (
25 | SELECT AVG(salary) ag, department_id
26 | FROM employees
27 | GROUP BY department_id
28 | ) ag_dep;
29 |
30 | #③查询哪个部门的平均工资=②
31 |
32 | SELECT AVG(salary), department_id
33 | FROM employees
34 | GROUP BY department_id
35 | HAVING AVG(salary) = (
36 | SELECT MIN(ag)
37 | FROM (
38 | SELECT AVG(salary) ag, department_id
39 | FROM employees
40 | GROUP BY department_id
41 | ) ag_dep
42 | );
43 |
44 | #④查询部门信息
45 |
46 | SELECT d.*
47 | FROM departments d
48 | WHERE d.`department_id` = (
49 | SELECT department_id
50 | FROM employees
51 | GROUP BY department_id
52 | HAVING AVG(salary) = (
53 | SELECT MIN(ag)
54 | FROM (
55 | SELECT AVG(salary) ag, department_id
56 | FROM employees
57 | GROUP BY department_id
58 | ) ag_dep
59 | )
60 | );
61 |
62 | #方式二:
63 | #①各部门的平均工资
64 | SELECT AVG(salary), department_id
65 | FROM employees
66 | GROUP BY department_id;
67 |
68 | #②求出最低平均工资的部门编号
69 | SELECT department_id
70 | FROM employees
71 | GROUP BY department_id
72 | ORDER BY AVG(salary)
73 | LIMIT 1;
74 |
75 | #③查询部门信息
76 | SELECT *
77 | FROM departments
78 | WHERE department_id = (
79 | SELECT department_id
80 | FROM employees
81 | GROUP BY department_id
82 | ORDER BY AVG(salary)
83 | LIMIT 1
84 | );
85 |
86 |
87 |
88 | # 3. 查询平均工资最低的部门信息和该部门的平均工资
89 | #①各部门的平均工资
90 | SELECT AVG(salary), department_id
91 | FROM employees
92 | GROUP BY department_id;
93 | #②求出最低平均工资的部门编号
94 | SELECT AVG(salary), department_id
95 | FROM employees
96 | GROUP BY department_id
97 | ORDER BY AVG(salary)
98 | LIMIT 1;
99 | #③查询部门信息
100 | SELECT d.*, ag
101 | FROM departments d
102 | JOIN (
103 | SELECT AVG(salary) ag, department_id
104 | FROM employees
105 | GROUP BY department_id
106 | ORDER BY AVG(salary)
107 | LIMIT 1
108 | ) ag_dep
109 | ON d.`department_id` = ag_dep.department_id;
110 |
111 |
112 |
113 | # 4. 查询平均工资最高的 job 信息
114 | #①查询最高的job的平均工资
115 | SELECT AVG(salary), job_id
116 | FROM employees
117 | GROUP BY job_id
118 | ORDER BY AVG(salary) DESC
119 | LIMIT 1;
120 |
121 | #②查询job信息
122 | SELECT *
123 | FROM jobs
124 | WHERE job_id = (
125 | SELECT job_id
126 | FROM employees
127 | GROUP BY job_id
128 | ORDER BY AVG(salary) DESC
129 | LIMIT 1
130 | );
131 | # 5. 查询平均工资高于公司平均工资的部门有哪些?
132 |
133 | #①查询平均工资
134 | SELECT AVG(salary)
135 | FROM employees;
136 |
137 | #②查询每个部门的平均工资
138 | SELECT AVG(salary), department_id
139 | FROM employees
140 | GROUP BY department_id;
141 |
142 | #③筛选②结果集,满足平均工资>①
143 |
144 | SELECT AVG(salary), department_id
145 | FROM employees
146 | GROUP BY department_id
147 | HAVING AVG(salary) > (
148 | SELECT AVG(salary)
149 | FROM employees
150 | );
151 |
152 | # 6. 查询出公司中所有 manager 的详细信息.
153 | #①查询所有manager的员工编号
154 | SELECT DISTINCT manager_id
155 | FROM employees;
156 |
157 | #②查询详细信息,满足employee_id=①
158 | SELECT *
159 | FROM employees
160 | WHERE employee_id = ANY (
161 | SELECT DISTINCT manager_id
162 | FROM employees
163 | );
164 |
165 | # 7. 各个部门中 最高工资中最低的那个部门的 最低工资是多少
166 |
167 | #①查询各部门的最高工资中最低的部门编号
168 | SELECT department_id
169 | FROM employees
170 | GROUP BY department_id
171 | ORDER BY MAX(salary)
172 | LIMIT 1;
173 |
174 |
175 | #②查询①结果的那个部门的最低工资
176 |
177 | SELECT MIN(salary), department_id
178 | FROM employees
179 | WHERE department_id = (
180 | SELECT department_id
181 | FROM employees
182 | GROUP BY department_id
183 | ORDER BY MAX(salary)
184 | LIMIT 1
185 | );
186 | # 8. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
187 | #①查询平均工资最高的部门编号
188 | SELECT department_id
189 | FROM employees
190 | GROUP BY department_id
191 | ORDER BY AVG(salary) DESC
192 | LIMIT 1;
193 |
194 | #②将employees和departments连接查询,筛选条件是①
195 | SELECT last_name,
196 | d.department_id,
197 | email,
198 | salary
199 | FROM employees e
200 | INNER JOIN departments d
201 | ON d.manager_id = e.employee_id
202 | WHERE d.department_id =
203 | (SELECT department_id
204 | FROM employees
205 | GROUP BY department_id
206 | ORDER BY AVG(salary) DESC
207 | LIMIT 1);
208 |
209 |
--------------------------------------------------------------------------------
/039联合查询.sql:
--------------------------------------------------------------------------------
1 | #进阶9:联合查询
2 | /*
3 | union 联合 合并:将多条查询语句的结果合并成一个结果
4 |
5 | 语法:
6 | 查询语句1
7 | union
8 | 查询语句2
9 | union
10 | ...
11 |
12 |
13 | 应用场景:
14 | 要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
15 |
16 | 特点:★
17 | 1、要求多条查询语句的查询列数是一致的!
18 | 2、要求多条查询语句的查询的每一列的类型和顺序最好一致
19 | 3、union关键字默认去重,如果使用union all 可以包含重复项
20 |
21 | */
22 |
23 |
24 | #引入的案例:查询部门编号>90或邮箱包含a的员工信息
25 |
26 | SELECT *
27 | FROM employees
28 | WHERE email LIKE '%a%'
29 | OR department_id > 90;;
30 |
31 | SELECT *
32 | FROM employees
33 | WHERE email LIKE '%a%'
34 | UNION
35 | SELECT *
36 | FROM employees
37 | WHERE department_id > 90;
38 |
39 |
40 | #案例:查询中国用户中男性的信息以及外国用户中年男性的用户信息
41 |
42 | SELECT id, cname
43 | FROM t_ca
44 | WHERE csex = '男'
45 | UNION ALL
46 | SELECT t_id, tname
47 | FROM t_ua
48 | WHERE tGender = 'male';
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/040数据的增删改.sql:
--------------------------------------------------------------------------------
1 | #DML语言
2 | /*
3 | 数据操作语言:
4 | 插入:insert
5 | 修改:update
6 | 删除:delete
7 |
8 | */
9 |
10 | #一、插入语句
11 | #方式一:经典的插入
12 | /*
13 | 语法:
14 | insert into 表名(列名,...) values(值1,...);
15 |
16 | */
17 | SELECT *
18 | FROM beauty;
19 | #1.插入的值的类型要与列的类型一致或兼容
20 | INSERT INTO beauty(id, NAME, sex, borndate, phone, photo, boyfriend_id)
21 | VALUES (13, '唐艺昕', '女', '1990-4-23', '1898888888', NULL, 2);
22 |
23 | #2.不可以为null的列必须插入值。可以为null的列如何插入值?
24 | #方式一:
25 | INSERT INTO beauty(id, NAME, sex, borndate, phone, photo, boyfriend_id)
26 | VALUES (13, '唐艺昕', '女', '1990-4-23', '1898888888', NULL, 2);
27 |
28 | #方式二:
29 |
30 | INSERT INTO beauty(id, NAME, sex, phone)
31 | VALUES (15, '娜扎', '女', '1388888888');
32 |
33 |
34 | #3.列的顺序是否可以调换
35 | INSERT INTO beauty(NAME, sex, id, phone)
36 | VALUES ('蒋欣', '女', 16, '110');
37 |
38 |
39 | #4.列数和值的个数必须一致
40 |
41 | INSERT INTO beauty(NAME, sex, id, phone)
42 | VALUES ('关晓彤', '女', 17, '110');
43 |
44 | #5.可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
45 |
46 | INSERT INTO beauty
47 | VALUES (18, '张飞', '男', NULL, '119', NULL, NULL);
48 |
49 | #方式二:
50 | /*
51 |
52 | 语法:
53 | insert into 表名
54 | set 列名=值,列名=值,...
55 | */
56 |
57 |
58 | INSERT INTO beauty
59 | SET id=19,
60 | NAME='刘涛',
61 | phone='999';
62 |
63 |
64 | #两种方式大pk ★
65 |
66 |
67 | #1、方式一支持插入多行,方式二不支持
68 |
69 | INSERT INTO beauty
70 | VALUES (23, '唐艺昕1', '女', '1990-4-23', '1898888888', NULL, 2)
71 | , (24, '唐艺昕2', '女', '1990-4-23', '1898888888', NULL, 2)
72 | , (25, '唐艺昕3', '女', '1990-4-23', '1898888888', NULL, 2);
73 |
74 | #2、方式一支持子查询,方式二不支持
75 |
76 | INSERT INTO beauty(id, NAME, phone)
77 | SELECT 26, '宋茜', '11809866';
78 |
79 | INSERT INTO beauty(id, NAME, phone)
80 | SELECT id, boyname, '1234567'
81 | FROM boys
82 | WHERE id < 3;
83 |
84 | #二、修改语句
85 |
86 | /*
87 |
88 | 1.修改单表的记录★
89 |
90 | 语法:
91 | update 表名
92 | set 列=新值,列=新值,...
93 | where 筛选条件;
94 |
95 | 2.修改多表的记录【补充】
96 |
97 | 语法:
98 | sql92语法:
99 | update 表1 别名,表2 别名
100 | set 列=值,...
101 | where 连接条件
102 | and 筛选条件;
103 |
104 | sql99语法:
105 | update 表1 别名
106 | inner|left|right join 表2 别名
107 | on 连接条件
108 | set 列=值,...
109 | where 筛选条件;
110 |
111 |
112 | */
113 |
114 |
115 | #1.修改单表的记录
116 | #案例1:修改beauty表中姓唐的女神的电话为13899888899
117 |
118 | UPDATE beauty
119 | SET phone = '13899888899'
120 | WHERE NAME LIKE '唐%';
121 |
122 | #案例2:修改boys表中id好为2的名称为张飞,魅力值 10
123 | UPDATE boys
124 | SET boyname='张飞',
125 | usercp=10
126 | WHERE id = 2;
127 |
128 |
129 |
130 | #2.修改多表的记录
131 |
132 | #案例 1:修改张无忌的女朋友的手机号为114
133 |
134 | UPDATE boys bo
135 | INNER JOIN beauty b ON bo.`id` = b.`boyfriend_id`
136 | SET b.`phone`='119',
137 | bo.`userCP`=1000
138 | WHERE bo.`boyName` = '张无忌';
139 |
140 |
141 | #案例2:修改没有男朋友的女神的男朋友编号都为2号
142 |
143 | UPDATE boys bo
144 | RIGHT JOIN beauty b ON bo.`id` = b.`boyfriend_id`
145 | SET b.`boyfriend_id`=2
146 | WHERE bo.`id` IS NULL;
147 |
148 | SELECT *
149 | FROM boys;
150 |
151 |
152 | #三、删除语句
153 | /*
154 |
155 | 方式一:delete
156 | 语法:
157 |
158 | 1、单表的删除【★】
159 | delete from 表名 where 筛选条件
160 |
161 | 2、多表的删除【补充】
162 |
163 | sql92语法:
164 | delete 表1的别名,表2的别名
165 | from 表1 别名,表2 别名
166 | where 连接条件
167 | and 筛选条件;
168 |
169 | sql99语法:
170 |
171 | delete 表1的别名,表2的别名
172 | from 表1 别名
173 | inner|left|right join 表2 别名 on 连接条件
174 | where 筛选条件;
175 |
176 |
177 |
178 | 方式二:truncate
179 | 语法:truncate table 表名;
180 |
181 | */
182 |
183 | #方式一:delete
184 | #1.单表的删除
185 | #案例:删除手机号以9结尾的女神信息
186 |
187 | DELETE
188 | FROM beauty
189 | WHERE phone LIKE '%9';
190 | SELECT *
191 | FROM beauty;
192 |
193 |
194 | #2.多表的删除
195 |
196 | #案例:删除张无忌的女朋友的信息
197 |
198 | DELETE b
199 | FROM beauty b
200 | INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
201 | WHERE bo.`boyName` = '张无忌';
202 |
203 |
204 | #案例:删除黄晓明的信息以及他女朋友的信息
205 | DELETE b,bo
206 | FROM beauty b
207 | INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
208 | WHERE bo.`boyName` = '黄晓明';
209 |
210 |
211 |
212 | #方式二:truncate语句
213 |
214 | #案例:将魅力值>100的男神信息删除
215 | TRUNCATE TABLE boys;
216 |
217 |
218 |
219 | #delete pk truncate【面试题★】
220 |
221 | /*
222 |
223 | 1.delete 可以加where 条件,truncate不能加
224 |
225 | 2.truncate删除,效率高一丢丢
226 | 3.假如要删除的表中有自增长列,
227 | 如果用delete删除后,再插入数据,自增长列的值从断点开始,
228 | 而truncate删除后,再插入数据,自增长列的值从1开始。
229 | 4.truncate删除没有返回值,delete删除有返回值
230 |
231 | 5.truncate删除不能回滚,delete删除可以回滚.
232 |
233 | */
234 |
235 | SELECT *
236 | FROM boys;
237 |
238 | DELETE
239 | FROM boys;
240 | TRUNCATE TABLE boys;
241 | INSERT INTO boys (boyname, usercp)
242 | VALUES ('张飞', 100),
243 | ('刘备', 100),
244 | ('关云长', 100);
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
--------------------------------------------------------------------------------
/041【案例讲解】数据的增删改.sql:
--------------------------------------------------------------------------------
1 | #1. 运行以下脚本创建表my_employees
2 | CREATE TABLE my_employees
3 | (
4 | Id INT(10),
5 | First_name VARCHAR(10),
6 | Last_name VARCHAR(10),
7 | Userid VARCHAR(10),
8 | Salary DOUBLE(10, 2)
9 | );
10 | CREATE TABLE users
11 | (
12 | id INT,
13 | userid VARCHAR(10),
14 | department_id INT
15 |
16 | );
17 | #2. 显示表my_employees的结构
18 | DESC my_employees;
19 |
20 | #3. 向my_employees表中插入下列数据
21 | # ID FIRST_NAME LAST_NAME USERID SALARY
22 | # 1 patel Ralph Rpatel 895
23 | # 2 Dancs Betty Bdancs 860
24 | # 3 Biri Ben Bbiri 1100
25 | # 4 Newman Chad Cnewman 750
26 | # 5 Ropeburn Audrey Aropebur 1550
27 |
28 | #方式一:
29 | INSERT INTO my_employees
30 | VALUES (1, 'patel', 'Ralph', 'Rpatel', 895),
31 | (2, 'Dancs', 'Betty', 'Bdancs', 860),
32 | (3, 'Biri', 'Ben', 'Bbiri', 1100),
33 | (4, 'Newman', 'Chad', 'Cnewman', 750),
34 | (5, 'Ropeburn', 'Audrey', 'Aropebur', 1550);
35 | DELETE
36 | FROM my_employees;
37 | #方式二:
38 |
39 | INSERT INTO my_employees
40 | SELECT 1, 'patel', 'Ralph', 'Rpatel', 895
41 | UNION
42 | SELECT 2, 'Dancs', 'Betty', 'Bdancs', 860
43 | UNION
44 | SELECT 3, 'Biri', 'Ben', 'Bbiri', 1100
45 | UNION
46 | SELECT 4, 'Newman', 'Chad', 'Cnewman', 750
47 | UNION
48 | SELECT 5, 'Ropeburn', 'Audrey', 'Aropebur', 1550;
49 |
50 |
51 | #4. 向users表中插入数据
52 | # 1 Rpatel 10
53 | # 2 Bdancs 10
54 | # 3 Bbiri 20
55 | # 4 Cnewman 30
56 | # 5 Aropebur 40
57 |
58 | INSERT INTO users
59 | VALUES (1, 'Rpatel', 10),
60 | (2, 'Bdancs', 10),
61 | (3, 'Bbiri', 20);
62 |
63 |
64 | #5.将3号员工的last_name修改为“drelxer”
65 | UPDATE my_employees
66 | SET last_name='drelxer'
67 | WHERE id = 3;
68 |
69 |
70 | #6.将所有工资少于900的员工的工资修改为1000
71 | UPDATE my_employees
72 | SET salary=1000
73 | WHERE salary < 900;
74 |
75 | #7.将userid 为Bbiri的user表和my_employees表的记录全部删除
76 |
77 | DELETE u,e
78 | FROM users u
79 | JOIN my_employees e ON u.`userid` = e.`Userid`
80 | WHERE u.`userid` = 'Bbiri';
81 |
82 | #8.删除所有数据
83 |
84 | DELETE
85 | FROM my_employees;
86 | DELETE
87 | FROM users;
88 | #9.检查所作的修正
89 |
90 | SELECT *
91 | FROM my_employees;
92 | SELECT *
93 | FROM users;
94 |
95 | #10.清空表my_employees
96 | TRUNCATE TABLE my_employees;
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
--------------------------------------------------------------------------------
/042库和表的管理.sql:
--------------------------------------------------------------------------------
1 | #DDL
2 | /*
3 |
4 | 数据定义语言
5 |
6 | 库和表的管理
7 |
8 | 一、库的管理
9 | 创建、修改、删除
10 | 二、表的管理
11 | 创建、修改、删除
12 |
13 | 创建: create
14 | 修改: alter
15 | 删除: drop
16 |
17 | */
18 |
19 | #一、库的管理
20 | #1、库的创建
21 | /*
22 | 语法:
23 | create database [if not exists]库名;
24 | */
25 |
26 |
27 | #案例:创建库Books
28 |
29 | CREATE DATABASE IF NOT EXISTS books;
30 |
31 |
32 | #2、库的修改
33 |
34 | RENAME
35 | DATABASE books TO 新库名;
36 |
37 | #更改库的字符集
38 |
39 | ALTER DATABASE books CHARACTER SET gbk;
40 |
41 |
42 | #3、库的删除
43 |
44 | DROP DATABASE IF EXISTS books;
45 |
46 |
47 |
48 | #二、表的管理
49 | #1.表的创建 ★
50 |
51 | /*
52 | 语法:
53 | create table 表名(
54 | 列名 列的类型【(长度) 约束】,
55 | 列名 列的类型【(长度) 约束】,
56 | 列名 列的类型【(长度) 约束】,
57 | ...
58 | 列名 列的类型【(长度) 约束】
59 |
60 |
61 | )
62 |
63 |
64 | */
65 | #案例:创建表Book
66 |
67 | CREATE TABLE book
68 | (
69 | id INT,#编号
70 | bName VARCHAR(20),#图书名
71 | price DOUBLE,#价格
72 | authorId INT,#作者编号
73 | publishDate DATETIME #出版日期
74 | );
75 |
76 |
77 | DESC book;
78 |
79 | #案例:创建表author
80 | CREATE TABLE IF NOT EXISTS author
81 | (
82 | id INT,
83 | au_name VARCHAR(20),
84 | nation VARCHAR(10)
85 |
86 | );
87 | DESC author;
88 |
89 |
90 | #2.表的修改
91 |
92 | /*
93 | 语法
94 | alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
95 |
96 | */
97 |
98 | #①修改列名
99 |
100 | ALTER TABLE book
101 | CHANGE COLUMN publishdate pubDate DATETIME;
102 |
103 |
104 | #②修改列的类型或约束
105 | ALTER TABLE book
106 | MODIFY COLUMN pubdate TIMESTAMP;
107 |
108 | #③添加新列
109 | ALTER TABLE author
110 | ADD COLUMN annual DOUBLE;
111 |
112 | #④删除列
113 |
114 | ALTER TABLE book_author
115 | DROP COLUMN annual;
116 | #⑤修改表名
117 |
118 | ALTER TABLE author RENAME TO book_author;
119 |
120 | DESC book;
121 |
122 |
123 | #3.表的删除
124 |
125 | DROP TABLE IF EXISTS book_author;
126 |
127 | SHOW TABLES;
128 |
129 |
130 | #通用的写法:
131 |
132 | DROP DATABASE IF EXISTS 旧库名;
133 | CREATE DATABASE 新库名;
134 |
135 |
136 | DROP TABLE IF EXISTS 旧表名;
137 | CREATE TABLE 表名
138 | (
139 | );
140 |
141 |
142 | #4.表的复制
143 |
144 | INSERT INTO author
145 | VALUES (1, '村上春树', '日本'),
146 | (2, '莫言', '中国'),
147 | (3, '冯唐', '中国'),
148 | (4, '金庸', '中国');
149 |
150 | SELECT *
151 | FROM Author;
152 | SELECT *
153 | FROM copy2;
154 | #1.仅仅复制表的结构
155 |
156 | CREATE TABLE copy LIKE author;
157 |
158 | #2.复制表的结构+数据
159 | CREATE TABLE copy2
160 | SELECT *
161 | FROM author;
162 |
163 | #只复制部分数据
164 | CREATE TABLE copy3
165 | SELECT id, au_name
166 | FROM author
167 | WHERE nation = '中国';
168 |
169 |
170 | #仅仅复制某些字段
171 |
172 | CREATE TABLE copy4
173 | SELECT id, au_name
174 | FROM author
175 | WHERE 0;
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
--------------------------------------------------------------------------------
/043【案例讲解】库和表的管理.sql:
--------------------------------------------------------------------------------
1 | #1. 创建表dept1
2 | NAME NULL? TYPE
3 | id INT(7)
4 | NAME VARCHAR(25)
5 |
6 |
7 | USE test;
8 |
9 | CREATE TABLE dept1(
10 | id INT(7),
11 | NAME VARCHAR(25)
12 |
13 |
14 | );
15 | #2. 将表departments中的数据插入新表dept2中
16 |
17 | CREATE TABLE dept2
18 | SELECT department_id,department_name
19 | FROM myemployees.departments;
20 |
21 |
22 | #3. 创建表emp5
23 | NAME NULL? TYPE
24 | id INT(7)
25 | First_name VARCHAR (25)
26 | Last_name VARCHAR(25)
27 | Dept_id INT(7)
28 |
29 | CREATE TABLE emp5(
30 | id INT(7),
31 | first_name VARCHAR(25),
32 | last_name VARCHAR(25),
33 | dept_id INT(7)
34 |
35 | );
36 |
37 |
38 | #4. 将列Last_name的长度增加到50
39 |
40 | ALTER TABLE emp5 MODIFY COLUMN last_name VARCHAR(50);
41 | #5. 根据表employees创建employees2
42 |
43 | CREATE TABLE employees2 LIKE myemployees.employees;
44 |
45 | #6. 删除表emp5
46 | DROP TABLE IF EXISTS emp5;
47 |
48 | #7. 将表employees2重命名为emp5
49 |
50 | ALTER TABLE employees2 RENAME TO emp5;
51 |
52 | #8.在表dept和emp5中添加新列test_column,并检查所作的操作
53 |
54 | ALTER TABLE emp5 ADD COLUMN test_column INT;
55 | #9.直接删除表emp5中的列 dept_id
56 | DESC emp5;
57 | ALTER TABLE emp5 DROP COLUMN test_column;
--------------------------------------------------------------------------------
/044数据类型.sql:
--------------------------------------------------------------------------------
1 | #常见的数据类型
2 | /*
3 | 数值型:
4 | 整型
5 | 小数:
6 | 定点数
7 | 浮点数
8 | 字符型:
9 | 较短的文本:char、varchar
10 | 较长的文本:text、blob(较长的二进制数据)
11 |
12 | 日期型:
13 |
14 |
15 |
16 | */
17 |
18 | #一、整型
19 | /*
20 | 分类:
21 | tinyint、smallint、mediumint、int/integer、bigint
22 | 1 2 3 4 8
23 |
24 | 特点:
25 | ① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
26 | ② 如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
27 | ③ 如果不设置长度,会有默认的长度
28 | 长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用!
29 |
30 | */
31 |
32 | #1.如何设置无符号和有符号
33 |
34 | DROP TABLE IF EXISTS tab_int;
35 | CREATE TABLE tab_int(
36 | t1 INT(7) ZEROFILL,
37 | t2 INT(7) ZEROFILL
38 |
39 | );
40 |
41 | DESC tab_int;
42 |
43 |
44 | INSERT INTO tab_int VALUES(-123456);
45 | INSERT INTO tab_int VALUES(-123456,-123456);
46 | INSERT INTO tab_int VALUES(2147483648,4294967296);
47 |
48 | INSERT INTO tab_int VALUES(123,123);
49 |
50 |
51 | SELECT * FROM tab_int;
52 |
53 |
54 | #二、小数
55 | /*
56 | 分类:
57 | 1.浮点型
58 | float(M,D)
59 | double(M,D)
60 | 2.定点型
61 | dec(M,D)
62 | decimal(M,D)
63 |
64 | 特点:
65 |
66 | ①
67 | M:整数部位+小数部位
68 | D:小数部位
69 | 如果超过范围,则插入临界值
70 |
71 | ②
72 | M和D都可以省略
73 | 如果是decimal,则M默认为10,D默认为0
74 | 如果是float和double,则会根据插入的数值的精度来决定精度
75 |
76 | ③定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
77 |
78 |
79 | */
80 | #测试M和D
81 |
82 | DROP TABLE tab_float;
83 | CREATE TABLE tab_float(
84 | f1 FLOAT,
85 | f2 DOUBLE,
86 | f3 DECIMAL
87 | );
88 | SELECT * FROM tab_float;
89 | DESC tab_float;
90 |
91 | INSERT INTO tab_float VALUES(123.4523,123.4523,123.4523);
92 | INSERT INTO tab_float VALUES(123.456,123.456,123.456);
93 | INSERT INTO tab_float VALUES(123.4,123.4,123.4);
94 | INSERT INTO tab_float VALUES(1523.4,1523.4,1523.4);
95 |
96 |
97 |
98 | #原则:
99 | /*
100 | 所选择的类型越简单越好,能保存数值的类型越小越好
101 |
102 | */
103 |
104 | #三、字符型
105 | /*
106 | 较短的文本:
107 |
108 | char
109 | varchar
110 |
111 | 其他:
112 |
113 | binary和varbinary用于保存较短的二进制
114 | enum用于保存枚举
115 | set用于保存集合
116 |
117 |
118 | 较长的文本:
119 | text
120 | blob(较大的二进制)
121 |
122 | 特点:
123 |
124 |
125 |
126 | 写法 M的意思 特点 空间的耗费 效率
127 | char char(M) 最大的字符数,可以省略,默认为1 固定长度的字符 比较耗费 高
128 |
129 | varchar varchar(M) 最大的字符数,不可以省略 可变长度的字符 比较节省 低
130 | */
131 |
132 |
133 |
134 | CREATE TABLE tab_char(
135 | c1 ENUM('a','b','c')
136 |
137 |
138 | );
139 |
140 |
141 | INSERT INTO tab_char VALUES('a');
142 | INSERT INTO tab_char VALUES('b');
143 | INSERT INTO tab_char VALUES('c');
144 | INSERT INTO tab_char VALUES('m');
145 | INSERT INTO tab_char VALUES('A');
146 |
147 | SELECT * FROM tab_set;
148 |
149 |
150 |
151 | CREATE TABLE tab_set(
152 |
153 | s1 SET('a','b','c','d')
154 |
155 |
156 |
157 | );
158 | INSERT INTO tab_set VALUES('a');
159 | INSERT INTO tab_set VALUES('A,B');
160 | INSERT INTO tab_set VALUES('a,c,d');
161 |
162 |
163 | #四、日期型
164 |
165 | /*
166 |
167 | 分类:
168 | date只保存日期
169 | time 只保存时间
170 | year只保存年
171 |
172 | datetime保存日期+时间
173 | timestamp保存日期+时间
174 |
175 |
176 | 特点:
177 |
178 | 字节 范围 时区等的影响
179 | datetime 8 1000——9999 不受
180 | timestamp 4 1970-2038 受
181 |
182 | */
183 |
184 |
185 | CREATE TABLE tab_date(
186 | t1 DATETIME,
187 | t2 TIMESTAMP
188 |
189 | );
190 |
191 |
192 |
193 | INSERT INTO tab_date VALUES(NOW(),NOW());
194 |
195 | SELECT * FROM tab_date;
196 |
197 |
198 | SHOW VARIABLES LIKE 'time_zone';
199 |
200 | SET time_zone='+9:00';
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
--------------------------------------------------------------------------------
/045常见约束.sql:
--------------------------------------------------------------------------------
1 | #常见约束
2 |
3 | /*
4 |
5 |
6 | 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
7 |
8 |
9 | 分类:六大约束
10 | NOT NULL:非空,用于保证该字段的值不能为空
11 | 比如姓名、学号等
12 | DEFAULT:默认,用于保证该字段有默认值
13 | 比如性别
14 | PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
15 | 比如学号、员工编号等
16 | UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
17 | 比如座位号
18 | CHECK:检查约束【mysql中不支持】
19 | 比如年龄、性别
20 | FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
21 | 在从表添加外键约束,用于引用主表中某列的值
22 | 比如学生表的专业编号,员工表的部门编号,员工表的工种编号
23 |
24 |
25 | 添加约束的时机:
26 | 1.创建表时
27 | 2.修改表时
28 |
29 |
30 | 约束的添加分类:
31 | 列级约束:
32 | 六大约束语法上都支持,但外键约束没有效果
33 |
34 | 表级约束:
35 |
36 | 除了非空、默认,其他的都支持
37 |
38 |
39 | 主键和唯一的大对比:
40 |
41 | 保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
42 | 主键 √ × 至多有1个 √,但不推荐
43 | 唯一 √ √ 可以有多个 √,但不推荐
44 | 外键:
45 | 1、要求在从表设置外键关系
46 | 2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
47 | 3、主表的关联列必须是一个key(一般是主键或唯一)
48 | 4、插入数据时,先插入主表,再插入从表
49 | 删除数据时,先删除从表,再删除主表
50 |
51 |
52 | */
53 |
54 | CREATE TABLE 表名(
55 | 字段名 字段类型 列级约束,
56 | 字段名 字段类型,
57 | 表级约束
58 |
59 | )
60 | CREATE DATABASE students;
61 | #一、创建表时添加约束
62 |
63 | #1.添加列级约束
64 | /*
65 | 语法:
66 |
67 | 直接在字段名和类型后面追加 约束类型即可。
68 |
69 | 只支持:默认、非空、主键、唯一
70 |
71 |
72 |
73 | */
74 |
75 | USE students;
76 | DROP TABLE stuinfo;
77 | CREATE TABLE stuinfo(
78 | id INT PRIMARY KEY,#主键
79 | stuName VARCHAR(20) NOT NULL UNIQUE,#非空
80 | gender CHAR(1) CHECK(gender='男' OR gender ='女'),#检查
81 | seat INT UNIQUE,#唯一
82 | age INT DEFAULT 18,#默认约束
83 | majorId INT REFERENCES major(id)#外键
84 |
85 | );
86 |
87 |
88 | CREATE TABLE major(
89 | id INT PRIMARY KEY,
90 | majorName VARCHAR(20)
91 | );
92 |
93 | #查看stuinfo中的所有索引,包括主键、外键、唯一
94 | SHOW INDEX FROM stuinfo;
95 |
96 |
97 | #2.添加表级约束
98 | /*
99 |
100 | 语法:在各个字段的最下面
101 | 【constraint 约束名】 约束类型(字段名)
102 | */
103 |
104 | DROP TABLE IF EXISTS stuinfo;
105 | CREATE TABLE stuinfo(
106 | id INT,
107 | stuname VARCHAR(20),
108 | gender CHAR(1),
109 | seat INT,
110 | age INT,
111 | majorid INT,
112 |
113 | CONSTRAINT pk PRIMARY KEY(id),#主键
114 | CONSTRAINT uq UNIQUE(seat),#唯一键
115 | CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#检查
116 | CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键
117 |
118 | );
119 |
120 |
121 |
122 |
123 |
124 | SHOW INDEX FROM stuinfo;
125 |
126 |
127 |
128 | #通用的写法:★
129 |
130 | CREATE TABLE IF NOT EXISTS stuinfo(
131 | id INT PRIMARY KEY,
132 | stuname VARCHAR(20),
133 | sex CHAR(1),
134 | age INT DEFAULT 18,
135 | seat INT UNIQUE,
136 | majorid INT,
137 | CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
138 |
139 | );
140 |
141 |
142 |
143 | #二、修改表时添加约束
144 |
145 | /*
146 | 1、添加列级约束
147 | alter table 表名 modify column 字段名 字段类型 新约束;
148 |
149 | 2、添加表级约束
150 | alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
151 |
152 |
153 | */
154 | DROP TABLE IF EXISTS stuinfo;
155 | CREATE TABLE stuinfo(
156 | id INT,
157 | stuname VARCHAR(20),
158 | gender CHAR(1),
159 | seat INT,
160 | age INT,
161 | majorid INT
162 | )
163 | DESC stuinfo;
164 | #1.添加非空约束
165 | ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
166 | #2.添加默认约束
167 | ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
168 | #3.添加主键
169 | #①列级约束
170 | ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
171 | #②表级约束
172 | ALTER TABLE stuinfo ADD PRIMARY KEY(id);
173 |
174 | #4.添加唯一
175 |
176 | #①列级约束
177 | ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
178 | #②表级约束
179 | ALTER TABLE stuinfo ADD UNIQUE(seat);
180 |
181 |
182 | #5.添加外键
183 | ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
184 |
185 | #三、修改表时删除约束
186 |
187 | #1.删除非空约束
188 | ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
189 |
190 | #2.删除默认约束
191 | ALTER TABLE stuinfo MODIFY COLUMN age INT ;
192 |
193 | #3.删除主键
194 | ALTER TABLE stuinfo DROP PRIMARY KEY;
195 |
196 | #4.删除唯一
197 | ALTER TABLE stuinfo DROP INDEX seat;
198 |
199 | #5.删除外键
200 | ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
201 |
202 | SHOW INDEX FROM stuinfo;
203 |
204 |
205 |
206 |
207 |
208 |
--------------------------------------------------------------------------------
/046【案例讲解】常见约束.sql:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #1.向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)
5 |
6 | ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;
7 | ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);
8 |
9 | #2. 向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)
10 |
11 | #3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
12 | ALTER TABLE emp2 ADD COLUMN dept_id INT;
13 | ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);
14 |
15 | 位置 支持的约束类型 是否可以起约束名
16 | 列级约束: 列的后面 语法都支持,但外键没有效果 不可以
17 | 表级约束: 所有列的下面 默认和非空不支持,其他支持 可以(主键没有效果)
--------------------------------------------------------------------------------
/047标识列.sql:
--------------------------------------------------------------------------------
1 | #标识列
2 | /*
3 | 又称为自增长列
4 | 含义:可以不用手动的插入值,系统提供默认的序列值
5 |
6 |
7 | 特点:
8 | 1、标识列必须和主键搭配吗?不一定,但要求是一个key
9 | 2、一个表可以有几个标识列?至多一个!
10 | 3、标识列的类型只能是数值型
11 | 4、标识列可以通过 SET auto_increment_increment=3;设置步长
12 | 可以通过 手动插入值,设置起始值
13 |
14 |
15 | */
16 |
17 | #一、创建表时设置标识列
18 |
19 |
20 | DROP TABLE IF EXISTS tab_identity;
21 | CREATE TABLE tab_identity(
22 | id INT ,
23 | NAME FLOAT UNIQUE AUTO_INCREMENT,
24 | seat INT
25 |
26 |
27 | );
28 | TRUNCATE TABLE tab_identity;
29 |
30 |
31 | INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
32 | INSERT INTO tab_identity(NAME) VALUES('lucy');
33 | SELECT * FROM tab_identity;
34 |
35 |
36 | SHOW VARIABLES LIKE '%auto_increment%';
37 |
38 |
39 | SET auto_increment_increment=3;
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/048事务.sql:
--------------------------------------------------------------------------------
1 | #TCL
2 | /*
3 | Transaction Control Language 事务控制语言
4 |
5 | 事务:
6 | 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
7 |
8 | 案例:转账
9 |
10 | 张三丰 1000
11 | 郭襄 1000
12 |
13 | update 表 set 张三丰的余额=500 where name='张三丰'
14 | 意外
15 | update 表 set 郭襄的余额=1500 where name='郭襄'
16 |
17 |
18 | 事务的特性:
19 | ACID
20 | 原子性:一个事务不可再分割,要么都执行要么都不执行
21 | 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
22 | 隔离性:一个事务的执行不受其他事务的干扰
23 | 持久性:一个事务一旦提交,则会永久的改变数据库的数据.
24 |
25 |
26 |
27 | 事务的创建
28 | 隐式事务:事务没有明显的开启和结束的标记
29 | 比如insert、update、delete语句
30 |
31 | delete from 表 where id =1;
32 |
33 | 显式事务:事务具有明显的开启和结束的标记
34 | 前提:必须先设置自动提交功能为禁用
35 |
36 | set autocommit=0;
37 |
38 | 步骤1:开启事务
39 | set autocommit=0;
40 | start transaction;可选的
41 | 步骤2:编写事务中的sql语句(select insert update delete)
42 | 语句1;
43 | 语句2;
44 | ...
45 |
46 | 步骤3:结束事务
47 | commit;提交事务
48 | rollback;回滚事务
49 |
50 | savepoint 节点名;设置保存点
51 |
52 |
53 |
54 | 事务的隔离级别:
55 | 脏读 不可重复读 幻读
56 | read uncommitted:√ √ √
57 | read committed: × √ √
58 | repeatable read: × × √
59 | serializable × × ×
60 |
61 |
62 | mysql中默认 第三个隔离级别 repeatable read
63 | oracle中默认第二个隔离级别 read committed
64 | 查看隔离级别
65 | select @@tx_isolation;
66 | 设置隔离级别
67 | set session|global transaction isolation level 隔离级别;
68 |
69 |
70 |
71 |
72 | 开启事务的语句;
73 | update 表 set 张三丰的余额=500 where name='张三丰'
74 |
75 | update 表 set 郭襄的余额=1500 where name='郭襄'
76 | 结束事务的语句;
77 |
78 |
79 |
80 | */
81 |
82 | SHOW VARIABLES LIKE 'autocommit';
83 | SHOW ENGINES;
84 |
85 | #1.演示事务的使用步骤
86 |
87 | #开启事务
88 | SET autocommit=0;
89 | START TRANSACTION;
90 | #编写一组事务的语句
91 | UPDATE account SET balance = 1000 WHERE username='张无忌';
92 | UPDATE account SET balance = 1000 WHERE username='赵敏';
93 |
94 | #结束事务
95 | ROLLBACK;
96 | #commit;
97 |
98 | SELECT * FROM account;
99 |
100 |
101 | #2.演示事务对于delete和truncate的处理的区别
102 |
103 | SET autocommit=0;
104 | START TRANSACTION;
105 |
106 | DELETE FROM account;
107 | ROLLBACK;
108 |
109 |
110 |
111 | #3.演示savepoint 的使用
112 | SET autocommit=0;
113 | START TRANSACTION;
114 | DELETE FROM account WHERE id=25;
115 | SAVEPOINT a;#设置保存点
116 | DELETE FROM account WHERE id=28;
117 | ROLLBACK TO a;#回滚到保存点
118 |
119 |
120 | SELECT * FROM account;
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/048视图.sql:
--------------------------------------------------------------------------------
1 | #视图
2 | /*
3 | 含义:虚拟表,和普通表一样使用
4 | mysql5.1版本出现的新特性,是通过表动态生成的数据
5 |
6 | 比如:舞蹈班和普通班级的对比
7 | 创建语法的关键字 是否实际占用物理空间 使用
8 |
9 | 视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改
10 |
11 | 表 create table 保存了数据 增删改查
12 |
13 |
14 | */
15 |
16 | #案例:查询姓张的学生名和专业名
17 | SELECT stuname,majorname
18 | FROM stuinfo s
19 | INNER JOIN major m ON s.`majorid`= m.`id`
20 | WHERE s.`stuname` LIKE '张%';
21 |
22 | CREATE VIEW v1
23 | AS
24 | SELECT stuname,majorname
25 | FROM stuinfo s
26 | INNER JOIN major m ON s.`majorid`= m.`id`;
27 |
28 | SELECT * FROM v1 WHERE stuname LIKE '张%';
29 |
30 |
31 | #一、创建视图
32 | /*
33 | 语法:
34 | create view 视图名
35 | as
36 | 查询语句;
37 |
38 | */
39 | USE myemployees;
40 |
41 | #1.查询姓名中包含a字符的员工名、部门名和工种信息
42 | #①创建
43 | CREATE VIEW myv1
44 | AS
45 |
46 | SELECT last_name,department_name,job_title
47 | FROM employees e
48 | JOIN departments d ON e.department_id = d.department_id
49 | JOIN jobs j ON j.job_id = e.job_id;
50 |
51 |
52 | #②使用
53 | SELECT * FROM myv1 WHERE last_name LIKE '%a%';
54 |
55 |
56 |
57 |
58 |
59 |
60 | #2.查询各部门的平均工资级别
61 |
62 | #①创建视图查看每个部门的平均工资
63 | CREATE VIEW myv2
64 | AS
65 | SELECT AVG(salary) ag,department_id
66 | FROM employees
67 | GROUP BY department_id;
68 |
69 | #②使用
70 | SELECT myv2.`ag`,g.grade_level
71 | FROM myv2
72 | JOIN job_grades g
73 | ON myv2.`ag` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
74 |
75 |
76 |
77 | #3.查询平均工资最低的部门信息
78 |
79 | SELECT * FROM myv2 ORDER BY ag LIMIT 1;
80 |
81 | #4.查询平均工资最低的部门名和工资
82 |
83 | CREATE VIEW myv3
84 | AS
85 | SELECT * FROM myv2 ORDER BY ag LIMIT 1;
86 |
87 |
88 | SELECT d.*,m.ag
89 | FROM myv3 m
90 | JOIN departments d
91 | ON m.`department_id`=d.`department_id`;
92 |
93 |
94 |
95 |
96 | #二、视图的修改
97 |
98 | #方式一:
99 | /*
100 | create or replace view 视图名
101 | as
102 | 查询语句;
103 |
104 | */
105 | SELECT * FROM myv3 ;
106 |
107 | CREATE OR REPLACE VIEW myv3
108 | AS
109 | SELECT AVG(salary),job_id
110 | FROM employees
111 | GROUP BY job_id;
112 |
113 | #方式二:
114 | /*
115 | 语法:
116 | alter view 视图名
117 | as
118 | 查询语句;
119 |
120 | */
121 | ALTER VIEW myv3
122 | AS
123 | SELECT * FROM employees;
124 |
125 | #三、删除视图
126 |
127 | /*
128 |
129 | 语法:drop view 视图名,视图名,...;
130 | */
131 |
132 | DROP VIEW emp_v1,emp_v2,myv3;
133 |
134 |
135 | #四、查看视图
136 |
137 | DESC myv3;
138 |
139 | SHOW CREATE VIEW myv3;
140 |
141 |
142 | #五、视图的更新
143 |
144 | CREATE OR REPLACE VIEW myv1
145 | AS
146 | SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary"
147 | FROM employees;
148 |
149 | CREATE OR REPLACE VIEW myv1
150 | AS
151 | SELECT last_name,email
152 | FROM employees;
153 |
154 |
155 | SELECT * FROM myv1;
156 | SELECT * FROM employees;
157 | #1.插入
158 |
159 | INSERT INTO myv1 VALUES('张飞','zf@qq.com');
160 |
161 | #2.修改
162 | UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
163 |
164 | #3.删除
165 | DELETE FROM myv1 WHERE last_name = '张无忌';
166 |
167 | #具备以下特点的视图不允许更新
168 |
169 |
170 | #①包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
171 |
172 | CREATE OR REPLACE VIEW myv1
173 | AS
174 | SELECT MAX(salary) m,department_id
175 | FROM employees
176 | GROUP BY department_id;
177 |
178 | SELECT * FROM myv1;
179 |
180 | #更新
181 | UPDATE myv1 SET m=9000 WHERE department_id=10;
182 |
183 | #②常量视图
184 | CREATE OR REPLACE VIEW myv2
185 | AS
186 |
187 | SELECT 'john' NAME;
188 |
189 | SELECT * FROM myv2;
190 |
191 | #更新
192 | UPDATE myv2 SET NAME='lucy';
193 |
194 |
195 |
196 |
197 |
198 | #③Select中包含子查询
199 |
200 | CREATE OR REPLACE VIEW myv3
201 | AS
202 |
203 | SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
204 | FROM departments;
205 |
206 | #更新
207 | SELECT * FROM myv3;
208 | UPDATE myv3 SET 最高工资=100000;
209 |
210 |
211 | #④join
212 | CREATE OR REPLACE VIEW myv4
213 | AS
214 |
215 | SELECT last_name,department_name
216 | FROM employees e
217 | JOIN departments d
218 | ON e.department_id = d.department_id;
219 |
220 | #更新
221 |
222 | SELECT * FROM myv4;
223 | UPDATE myv4 SET last_name = '张飞' WHERE last_name='Whalen';
224 | INSERT INTO myv4 VALUES('陈真','xxxx');
225 |
226 |
227 |
228 | #⑤from一个不能更新的视图
229 | CREATE OR REPLACE VIEW myv5
230 | AS
231 |
232 | SELECT * FROM myv3;
233 |
234 | #更新
235 |
236 | SELECT * FROM myv5;
237 |
238 | UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;
239 |
240 |
241 |
242 | #⑥where子句的子查询引用了from子句中的表
243 |
244 | CREATE OR REPLACE VIEW myv6
245 | AS
246 |
247 | SELECT last_name,email,salary
248 | FROM employees
249 | WHERE employee_id IN(
250 | SELECT manager_id
251 | FROM employees
252 | WHERE manager_id IS NOT NULL
253 | );
254 |
255 | #更新
256 | SELECT * FROM myv6;
257 | UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
--------------------------------------------------------------------------------
/049【案例讲解】视图.sql:
--------------------------------------------------------------------------------
1 | #一、创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
2 |
3 | CREATE OR REPLACE VIEW emp_v1
4 | AS
5 | SELECT last_name,salary,email
6 | FROM employees
7 | WHERE phone_number LIKE '011%';
8 |
9 | #二、创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息
10 |
11 | CREATE OR REPLACE VIEW emp_v2
12 | AS
13 | SELECT MAX(salary) mx_dep,department_id
14 | FROM employees
15 | GROUP BY department_id
16 | HAVING MAX(salary)>12000;
17 |
18 |
19 | SELECT d.*,m.mx_dep
20 | FROM departments d
21 | JOIN emp_v2 m
22 | ON m.department_id = d.`department_id`;
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/050变量.sql:
--------------------------------------------------------------------------------
1 | #变量
2 | /*
3 | 系统变量:
4 | 全局变量
5 | 会话变量
6 |
7 | 自定义变量:
8 | 用户变量
9 | 局部变量
10 |
11 | */
12 | #一、系统变量
13 | /*
14 | 说明:变量由系统定义,不是用户定义,属于服务器层面
15 | 注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
16 | 使用步骤:
17 | 1、查看所有系统变量
18 | show global|【session】variables;
19 | 2、查看满足条件的部分系统变量
20 | show global|【session】 variables like '%char%';
21 | 3、查看指定的系统变量的值
22 | select @@global|【session】系统变量名;
23 | 4、为某个系统变量赋值
24 | 方式一:
25 | set global|【session】系统变量名=值;
26 | 方式二:
27 | set @@global|【session】系统变量名=值;
28 |
29 | */
30 | #1》全局变量
31 | /*
32 | 作用域:针对于所有会话(连接)有效,但不能跨重启
33 | */
34 | #①查看所有全局变量
35 | SHOW GLOBAL VARIABLES;
36 | #②查看满足条件的部分系统变量
37 | SHOW GLOBAL VARIABLES LIKE '%char%';
38 | #③查看指定的系统变量的值
39 | SELECT @@global.autocommit;
40 | #④为某个系统变量赋值
41 | SET @@global.autocommit=0;
42 | SET GLOBAL autocommit=0;
43 |
44 | #2》会话变量
45 | /*
46 | 作用域:针对于当前会话(连接)有效
47 | */
48 | #①查看所有会话变量
49 | SHOW SESSION VARIABLES;
50 | #②查看满足条件的部分会话变量
51 | SHOW SESSION VARIABLES LIKE '%char%';
52 | #③查看指定的会话变量的值
53 | SELECT @@autocommit;
54 | SELECT @@session.tx_isolation;
55 | #④为某个会话变量赋值
56 | SET @@session.tx_isolation='read-uncommitted';
57 | SET SESSION tx_isolation='read-committed';
58 |
59 | #二、自定义变量
60 | /*
61 | 说明:变量由用户自定义,而不是系统提供的
62 | 使用步骤:
63 | 1、声明
64 | 2、赋值
65 | 3、使用(查看、比较、运算等)
66 | */
67 |
68 | #1》用户变量
69 | /*
70 | 作用域:针对于当前会话(连接)有效,作用域同于会话变量
71 | */
72 |
73 | #赋值操作符:=或:=
74 | #①声明并初始化
75 | SET @变量名=值;
76 | SET @变量名:=值;
77 | SELECT @变量名:=值;
78 |
79 | #②赋值(更新变量的值)
80 | #方式一:
81 | SET @变量名=值;
82 | SET @变量名:=值;
83 | SELECT @变量名:=值;
84 | #方式二:
85 | SELECT 字段 INTO @变量名
86 | FROM 表;
87 | #③使用(查看变量的值)
88 | SELECT @变量名;
89 |
90 |
91 | #2》局部变量
92 | /*
93 | 作用域:仅仅在定义它的begin end块中有效
94 | 应用在 begin end中的第一句话
95 | */
96 |
97 | #①声明
98 | DECLARE 变量名 类型;
99 | DECLARE 变量名 类型 【DEFAULT 值】;
100 |
101 |
102 | #②赋值(更新变量的值)
103 |
104 | #方式一:
105 | SET 局部变量名=值;
106 | SET 局部变量名:=值;
107 | SELECT 局部变量名:=值;
108 | #方式二:
109 | SELECT 字段 INTO 具备变量名
110 | FROM 表;
111 | #③使用(查看变量的值)
112 | SELECT 局部变量名;
113 |
114 |
115 | #案例:声明两个变量,求和并打印
116 |
117 | #用户变量
118 | SET @m=1;
119 | SET @n=1;
120 | SET @sum=@m+@n;
121 | SELECT @sum;
122 |
123 | #局部变量
124 | DECLARE m INT DEFAULT 1;
125 | DECLARE n INT DEFAULT 1;
126 | DECLARE SUM INT;
127 | SET SUM=m+n;
128 | SELECT SUM;
129 |
130 |
131 | #用户变量和局部变量的对比
132 |
133 | 作用域 定义位置 语法
134 | 用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
135 | 局部变量 定义它的BEGIN END中 BEGIN END的第一句话 一般不用加@,需要指定类型
136 |
137 |
138 |
139 |
140 |
141 |
--------------------------------------------------------------------------------
/051存储过程.sql:
--------------------------------------------------------------------------------
1 | #存储过程和函数
2 | /*
3 | 存储过程和函数:类似于java中的方法
4 | 好处:
5 | 1、提高代码的重用性
6 | 2、简化操作
7 |
8 |
9 |
10 | */
11 | #存储过程
12 | /*
13 | 含义:一组预先编译好的SQL语句的集合,理解成批处理语句
14 | 1、提高代码的重用性
15 | 2、简化操作
16 | 3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
17 |
18 |
19 |
20 | */
21 |
22 | #一、创建语法
23 |
24 | # CREATE PROCEDURE 存储过程名(参数列表)
25 | # BEGIN
26 | #
27 | # 存储过程体(一组合法的SQL语句)
28 | # END
29 |
30 | #注意:
31 | /*
32 | 1、参数列表包含三部分
33 | 参数模式 参数名 参数类型
34 | 举例:
35 | in stuname varchar(20)
36 |
37 | 参数模式:
38 | in:该参数可以作为输入,也就是该参数需要调用方传入值
39 | out:该参数可以作为输出,也就是该参数可以作为返回值
40 | inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
41 |
42 | 2、如果存储过程体仅仅只有一句话,begin end可以省略
43 | 存储过程体中的每条sql语句的结尾要求必须加分号。
44 | 存储过程的结尾可以使用 delimiter 重新设置
45 | 语法:
46 | delimiter 结束标记
47 | 案例:
48 | delimiter $
49 | */
50 |
51 |
52 | #二、调用语法
53 |
54 | # CALL 存储过程名(实参列表);
55 |
56 | #--------------------------------案例演示-----------------------------------
57 | #1.空参列表
58 | #案例:插入到admin表中五条记录
59 |
60 | SELECT * FROM admin;
61 |
62 | DELIMITER $
63 | CREATE PROCEDURE myp1()
64 | BEGIN
65 | INSERT INTO admin(username,`password`)
66 | VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
67 | END $
68 |
69 |
70 | #调用
71 | CALL myp1()$
72 |
73 | #2.创建带in模式参数的存储过程
74 |
75 | #案例1:创建存储过程实现 根据女神名,查询对应的男神信息
76 |
77 | CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
78 | BEGIN
79 | SELECT bo.*
80 | FROM boys bo
81 | RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
82 | WHERE b.name=beautyName;
83 |
84 |
85 | END $
86 |
87 | #调用
88 | CALL myp2('柳岩')$
89 |
90 | #案例2 :创建存储过程实现,用户是否登录成功
91 |
92 | CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
93 | BEGIN
94 | DECLARE result INT DEFAULT 0;#声明并初始化
95 |
96 | SELECT COUNT(*) INTO result#赋值
97 | FROM admin
98 | WHERE admin.username = username
99 | AND admin.password = PASSWORD;
100 |
101 | SELECT IF(result>0,'成功','失败');#使用
102 | END $
103 |
104 | #调用
105 | CALL myp3('张飞','8888')$
106 |
107 |
108 | #3.创建out 模式参数的存储过程
109 | #案例1:根据输入的女神名,返回对应的男神名
110 |
111 | CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
112 | BEGIN
113 | SELECT bo.boyname INTO boyname
114 | FROM boys bo
115 | RIGHT JOIN
116 | beauty b ON b.boyfriend_id = bo.id
117 | WHERE b.name=beautyName ;
118 |
119 | END $
120 |
121 |
122 | #案例2:根据输入的女神名,返回对应的男神名和魅力值
123 |
124 | CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT)
125 | BEGIN
126 | SELECT boys.boyname ,boys.usercp INTO boyname,usercp
127 | FROM boys
128 | RIGHT JOIN
129 | beauty b ON b.boyfriend_id = boys.id
130 | WHERE b.name=beautyName ;
131 |
132 | END $
133 |
134 |
135 | #调用
136 | CALL myp7('小昭',@name,@cp)$
137 | SELECT @name,@cp$
138 |
139 |
140 |
141 | #4.创建带inout模式参数的存储过程
142 | #案例1:传入a和b两个值,最终a和b都翻倍并返回
143 |
144 | CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
145 | BEGIN
146 | SET a=a*2;
147 | SET b=b*2;
148 | END $
149 |
150 | #调用
151 | SET @m=10$
152 | SET @n=20$
153 | CALL myp8(@m,@n)$
154 | SELECT @m,@n$
155 |
156 |
157 | #三、删除存储过程
158 | #语法:drop procedure 存储过程名
159 | DROP PROCEDURE p1;
160 | DROP PROCEDURE p2,p3;#×
161 |
162 | #四、查看存储过程的信息
163 | DESC myp2;×
164 | SHOW CREATE PROCEDURE myp2;
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MySQL入门教程
2 |
3 | ### day001 001-018 入门实战案例
--------------------------------------------------------------------------------
/example001/hw_001_基础查询.sql:
--------------------------------------------------------------------------------
1 | #字符串拼接 concat
2 | select concat('a','bb','ccc');
3 | #起别名 as
4 | select concat('a','bb','ccc') as 拼接结果;
5 |
--------------------------------------------------------------------------------
/example001/hw_002_条件查询.sql:
--------------------------------------------------------------------------------
1 | #案例1:查询工资>12000的员工信息
2 | show tables;
3 | # drop table if exists departments01;
4 | # drop table if exists jobs01;
5 | # drop table if exists countrys01;
6 | # drop table if exists admin01;
7 | # drop table if exists boys01;
8 | # drop table if exists beauty01;
9 | # drop table if exists employees01;
10 | # drop table if exists job_grades01;
11 | # drop table if exists locations01;
12 |
13 | select *
14 | from employees
15 | where salary > 12000;
16 |
17 |
18 | #案例2:查询部门编号不等于90号的员工名和部门编号
19 | desc employees;#department_id != 90
20 | select concat(first_name, last_name) as 姓名, department_id as 部门编号
21 | from employees
22 | where department_id != 90;
23 |
24 | #案例1:查询工资在10000到20000之间的员工名、工资以及奖金率
25 | desc employees; #concat() salary commission_pct
26 | select concat(first_name, last_name), salary, commission_pct
27 | from employees
28 | where salary > 10000
29 | and salary < 20000;
30 |
31 |
32 | #案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
33 | select *
34 | from employees
35 | where not (department_id >= 90 and department_id <= 110)
36 | or salary > 15000;
37 |
38 | #查询员工名中包含字符a的员工信息
39 | select *
40 | from employees
41 | where last_name like '%a%';
42 |
43 |
44 | #查询员工名中第三个字符为n,第五个字符为l的员工名和工资
45 | select *
46 | from employees
47 | where last_name like '__n_l%';
48 |
49 | # 查询员工名中第二个字符为_的员工名
50 | select *
51 | from employees
52 | where last_name like '_\_%';
53 |
54 | # 查询员工编号在100到120之间的员工信息
55 | select *
56 | from employees
57 | where employee_id between 100 and 200;
58 |
59 | # 查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
60 | select last_name,job_id
61 | from employees
62 | where job_id in ('IT_PROG','AD_VP','AD_PRES');
63 |
64 |
65 | # 查询没有奖金的员工名和奖金率
66 | select last_name,commission_pct
67 | from employees
68 | where commission_pct is null;
69 |
70 | # 查询有奖金的员工名和奖金率
71 | select last_name,commission_pct
72 | from employees
73 | where commission_pct is not null;
74 |
75 | # 查询工资为12000的员工信息
76 | select *
77 | from employees
78 | where salary=12000;
--------------------------------------------------------------------------------
/example001/hw_003_排序查询.sql:
--------------------------------------------------------------------------------
1 | # 查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
2 | show tables ;
3 | select concat(last_name,first_name) as name,department_id,salary
4 | from employees
5 | order by salary desc, name asc;
6 |
7 | #选择工资不在8000到17000的员工的姓名和工资,按工资降序
8 | select concat(last_name,first_name) as name,salary
9 | from employees
10 | where salary not between 8000 and 17000
11 | order by salary desc ;
12 |
13 | # 查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
14 | select *
15 | from employees
16 | where email like '%e%'
17 | order by length(email) desc ,department_id asc ;
18 |
19 | #查询员工信息 按年薪降序
20 | select *,salary*12*(1+ifnull(commission_pct,0)) as year_salary
21 | from employees
22 | order by year_salary desc ;
23 |
24 | # 查询员工名,并且按名字的长度降序
25 | select last_name
26 | from employees
27 | order by length(last_name) desc ;
28 |
29 | # 查询员工信息,要求先按工资降序,再按employee_id升序
30 | select *
31 | from employees
32 | order by salary desc ,employee_id asc ;
--------------------------------------------------------------------------------
/example001/hw_004_常见函数.sql:
--------------------------------------------------------------------------------
1 | #1.length 获取参数值的字节个数
2 | select length('zhangdapeng') as name;
3 |
4 | #2.concat 拼接字符串
5 | #3.upper、lower
6 | #4.substr截取从指定索引处后面所有字符
7 | #5.instr 返回子串第一次出现的索引,如果找不到返回0
8 | #6.trim 去掉空格
9 | select trim(' aaa ') as str;
10 | #7.lpad 用指定的字符实现左填充指定长度
11 | #8.rpad 用指定的字符实现右填充指定长度
12 | #9.replace 替换
13 | select replace('敏感词嘿嘿敏感词哈哈敏感词啊啊啊', '敏感词', '*') as body;
14 | #round 四舍五入
15 | #ceil 向上取整
16 | #floor 向下取整
17 | #truncate 截断
18 | #mod取余
19 | #now 返回当前系统日期+时间
20 | select now() as time;
21 | #curdate 返回当前系统日期,不包含时间
22 | select curdate() as date;
23 | #curtime 返回当前时间,不包含日期
24 | select curtime() as time;
25 | #可以获取指定的部分,年、月、日、小时、分钟、秒
26 | select year(now()) year;
27 | select year('1991-01-01') as year;
28 | select year(hiredate) as year
29 | from employees;
30 | #month
31 | #str_to_date 将字符通过指定的格式转换成日期
32 | select str_to_date('1998-01-01', '%Y-%c-%d') as date;
33 | # 查询入职日期为1992-4-3的员工信息
34 | select *
35 | from employees
36 | where hiredate = '1992-4-3';
37 |
38 | select *
39 | from employees
40 | where hiredate = str_to_date('4-3 1992', '%c-%d %Y');
41 |
42 | #date_format 将日期转换成字符
43 | select date_format(now(), '%c/%d %Y') as date;
44 | #查询有奖金的员工名和入职日期(xx月/xx日 xx年)
45 | select last_name, date_format(hiredate, '%c/%d %Y') as date
46 | from employees
47 | where salary is not null;
48 |
49 | # 其他函数
50 | select VERSION();
51 | select database();
52 | select user() as user;
53 |
54 | #1.if函数
55 | select if(10 < 5, '真的', '假的') as result;
56 | select last_name,
57 | commission_pct,
58 | if(commission_pct is null, 'no commission', 'commisstion') commisstion
59 | from employees;
60 |
61 | /*案例:查询员工的工资,要求
62 |
63 | 部门号=30,显示的工资为1.1倍
64 | 部门号=40,显示的工资为1.2倍
65 | 部门号=50,显示的工资为1.3倍
66 | 其他部门,显示的工资为原工资
67 |
68 | */
69 | select salary,
70 | department_id,
71 | case department_id
72 | when 30 then salary * 1.1
73 | when 40 then salary * 1.2
74 | when 50 then salary * 1.3
75 | else salary
76 | end as new_salary
77 | from employees
78 | order by new_salary desc ;
79 |
80 |
--------------------------------------------------------------------------------
/example001/hw_005_单行函数.sql:
--------------------------------------------------------------------------------
1 | #1. 显示系统时间(注:日期+时间)
2 | select now();
3 | #2. 查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
4 | select employee_id, last_name, salary, salary * 1.2 as `new salary`
5 | from employees;
6 |
7 | #3. 将员工的姓名按首字母排序,并写出姓名的长度(length)
8 | select concat(last_name, first_name) as `name`, length(concat(last_name,first_name)) as length
9 | from employees
10 | order by name;
11 |
12 |
--------------------------------------------------------------------------------
/example001/hw_006_分组函数.sql:
--------------------------------------------------------------------------------
1 | # sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数
2 | #1、简单 的使用
3 | select sum(salary) sum
4 | from employees;
5 | select avg(salary) avg
6 | from employees;
7 | select max(salary) max
8 | from employees;
9 | select min(salary) min
10 | from employees;
11 | select count(salary) count
12 | from employees;
13 |
14 | # 和distinct搭配
15 | select sum(distinct salary) sum, sum(salary) sum1
16 | from employees;
17 |
18 | # 查询公司员工工资的最大值,最小值,平均值,总和
19 | select max(salary) max_salary, min(salary) min_salary, avg(salary) avg_salary, sum(salary) sum_salary
20 | from employees;
21 | # 查询员工表中的最大入职时间和最小入职时间的相差天数
22 | select max(hiredate) max, min(hiredate) min, ((max(hiredate) - min(hiredate)) / 1000 / 3600 / 24) difference
23 | from employees;
24 |
25 | select datediff(max(hiredate), min(hiredate)) difference
26 | from employees;
27 |
28 | # 查询部门编号为90的员工个数
29 | select count(*) count,department_id
30 | from employees
31 | where department_id=90;
--------------------------------------------------------------------------------
/example001/hw_007_分组查询.sql:
--------------------------------------------------------------------------------
1 | # 查询每个部门的员工个数
2 | select count(*) count, department_id
3 | from employees
4 | group by department_id;
5 |
6 | # 查询每个工种的员工平均工资
7 | select avg(salary) avg_salary, job_id
8 | from employees
9 | group by job_id
10 | order by avg_salary desc;
11 |
12 | # 查询每个位置的部门个数
13 | select count(*) count, location_id
14 | from departments
15 | group by location_id
16 | order by count desc;
17 |
18 | # 查询邮箱中包含a字符的 每个部门的最高工资
19 | select max(salary) max_salary, department_id
20 | from employees
21 | where email like '%a%'
22 | group by department_id
23 | order by max_salary desc;
24 |
25 | # 查询有奖金的每个领导手下员工的平均工资
26 | select round(avg(salary)) avg_salary, manager_id
27 | from employees
28 | group by manager_id
29 | order by avg_salary desc;
30 |
31 | # 查询哪个部门的员工个数>5
32 | select count(*) count, department_id
33 | from employees
34 | group by department_id
35 | having count > 5
36 | order by count desc;
37 |
38 | # 每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
39 | select max(salary) max_salary, job_id
40 | from employees
41 | where commission_pct is not null
42 | group by job_id
43 | having max_salary > 12000
44 | order by max_salary desc;
45 |
46 | # 领导编号>102的 每个领导手下的 最低工资大于5000的 领导编号和最低工资
47 | select manager_id, min(salary) min_salary
48 | from employees
49 | where manager_id > 102
50 | group by manager_id
51 | having min_salary > 5000
52 | order by min_salary;
53 |
54 | #每个工种有奖金的员工的 最高工资>6000的 工种编号和最高工资,按最高工资升序
55 | select job_id, max(salary) max_salary
56 | from employees
57 | where commission_pct is not null
58 | group by job_id
59 | having max_salary > 6000
60 | order by max_salary;
61 |
62 | # 查询每个工种每个部门的最低工资,并按最低工资降序
63 | select job_id, department_id, min(salary) min_salary
64 | from employees
65 | group by job_id, department_id
66 | order by min_salary desc;
67 |
68 | #案例
69 | #1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序
70 | select max(salary) max_salary,
71 | min(salary) min_salary,
72 | avg(salary) avg_salary,
73 | sum(salary) sum_salary,
74 | job_id
75 | from employees
76 | group by job_id
77 | order by job_id;
78 |
79 | #2.查询员工最高工资和最低工资的差距(DIFFERENCE)
80 | select max(salary)-min(salary) difference_salary
81 | from employees;
82 |
83 | #3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
84 | select min(salary) min_salary,manager_id
85 | from employees
86 | where salary>=6000 and manager_id is not null
87 | group by manager_id
88 | order by min_salary;
89 |
90 | #4.查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
91 | select department_id,count(*) count,round(avg(salary)) avg_salary
92 | from employees
93 | group by department_id
94 | order by avg_salary desc ;
95 |
96 | #5.选择具有各个job_id的员工人数
97 | select count(*) count,job_id
98 | from employees
99 | where job_id is not null
100 | group by job_id
101 | order by count desc ;
--------------------------------------------------------------------------------
/example001/hw_008_链接查询.sql:
--------------------------------------------------------------------------------
1 | show tables;
2 | # 女神的男朋友
3 | select name, boyName
4 | from beauty,
5 | boys
6 | where beauty.boyfriend_id = boys.id;
7 |
8 | # 查询员工名和对应的部门名
9 | select last_name, department_name
10 | from employees,
11 | departments
12 | where employees.department_id = departments.department_id
13 |
14 | #查询员工名、工种号、工种名
15 | select e.last_name, e.job_id, j.job_title
16 | from jobs j,
17 | employees e
18 | where e.job_id = j.job_id;
19 |
20 | # 查询有奖金的员工名、部门名
21 | select last_name, department_name
22 | from employees e,
23 | departments d
24 | where e.commission_pct is not null
25 | and e.department_id = d.department_id;
26 |
27 | # 查询城市名中第二个字符为o的部门名和城市名
28 | # 城市名 locations.city
29 | # 部门名 departments.department_name
30 | show tables;
31 | desc locations; #city
32 | desc departments;
33 |
34 | select l.city, d.department_name
35 | from locations l,
36 | departments d
37 | where l.city like '_o%'
38 | and d.location_id = l.location_id;
39 |
40 | # 查询每个城市的部门个数
41 | select count(*) count, l.city
42 | from departments d,
43 | locations l
44 | where d.location_id = l.location_id
45 | group by l.city
46 | order by count desc;
47 |
48 | # 查询有奖金的 每个部门的部门名 和部门的领导编号 和该部门的最低工资
49 | desc departments;
50 |
51 | select d.department_name, d.manager_id, min(e.salary) min_salary
52 | from departments d,
53 | employees e
54 | where e.manager_id = d.manager_id
55 | and e.commission_pct is not null
56 | #对唯一的字段进行分组 不然报错
57 | group by d.department_name, d.manager_id
58 | order by min_salary;
59 |
60 | # 查询每个工种的工种名和员工的个数,并且按员工个数降序
61 | select j.job_title, count(*) count
62 | from jobs j,
63 | employees e
64 | where j.job_id = e.job_id
65 | #分组的对象选择 1.要显示的字段 2.显示出来必须唯一不重复的字段
66 | group by j.job_title
67 | order by count desc;
68 |
69 | #查询员工名、部门名和所在的城市
70 | #三表查询一般不能进行分组,很难找出唯一字段
71 | select e.last_name, d.department_name, l.city
72 | from employees e,
73 | locations l,
74 | departments d
75 | where e.department_id = d.department_id
76 | and l.location_id = d.location_id;
77 |
78 |
79 | # 查询员工的工资和工资级别
80 | desc job_grades;
81 | select e.last_name, g.grade_level
82 | from employees e,
83 | job_grades g
84 | where e.salary between g.lowest_sal and g.highest_sal
85 | group by g.grade_level, e.last_name;
86 |
87 | # 查询 员工名和上级的名称
88 | select e.last_name, e.employee_id, m.employee_id, m.last_name
89 | from employees e,
90 | employees m
91 | where e.manager_id = m.employee_id;
92 |
93 | select e.last_name, m.last_name
94 | from employees e,
95 | employees m
96 | where e.manager_id = m.employee_id;
97 |
98 |
99 | # 查询员工名、部门名
100 | select last_name, department_name
101 | from departments d
102 | join employees e on d.department_id = e.department_id;
103 |
104 | # 查询名字中包含e的员工名和工种名(添加筛选)
105 | select last_name, job_title
106 | from employees e
107 | join jobs j on e.job_id = j.job_id
108 | where e.last_name like '%e%';
109 |
110 | # 查询部门个数>3的城市名和部门个数,(添加分组+筛选)
111 | select count(*) count, city
112 | from departments d
113 | #要分组,必须用内连接
114 | inner join locations l on d.location_id = l.location_id
115 | group by city
116 | having count > 3;
117 |
118 | # 查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)
119 | select department_name, count(*) count
120 | from departments d
121 | inner join employees e on d.department_id = e.department_id
122 | group by d.department_name
123 | order by count desc;
124 |
125 | # 查询员工名、部门名、工种名,并按部门名降序(添加三表连接)
126 | select last_name, department_name, job_title
127 | from employees e
128 | inner join departments d on e.department_id = d.department_id
129 | inner join jobs j on e.job_id = j.job_id
130 | order by department_name desc;
131 |
132 | #查询员工的工资级别
133 | select salary, grade_level
134 | from employees e
135 | inner join job_grades g
136 | on e.salary between g.lowest_sal and g.highest_sal;
137 |
138 | #查询工资级别的个数>20的个数,并且按工资级别降序
139 | select count(*) count, grade_level
140 | from employees e
141 | inner join job_grades g
142 | on e.salary between g.lowest_sal and g.highest_sal
143 | group by grade_level
144 | having count > 20
145 | order by grade_level desc;
146 |
147 | #查询员工的名字、上级的名字
148 | select e.last_name, m.last_name
149 | from employees e
150 | inner join employees m on e.manager_id = m.employee_id;
151 |
152 | #查询姓名中包含字符k的员工的名字、上级的名字
153 | select e.last_name, m.last_name
154 | from employees e
155 | inner join employees m on e.manager_id = m.employee_id
156 | where e.last_name like '%k%';
157 |
158 |
--------------------------------------------------------------------------------
/example001/hw_009_外连接查询.sql:
--------------------------------------------------------------------------------
1 | # 用于查询一个表中有,另一个表没有的记录
2 | select b.*, bo.*
3 | from boys bo
4 | left outer join beauty b on b.boyfriend_id = bo.id;
5 |
6 | # 查询哪个部门没有员工
7 | # 左外
8 | select d.*, e.employee_id
9 | from departments d
10 | left outer join employees e on d.department_id = e.department_id
11 | where e.employee_id is null;
12 |
13 | # 右外
14 | select d.*, e.employee_id
15 | from employees e
16 | right outer join departments d on e.department_id = d.department_id
17 | where e.employee_id is null;
18 |
19 | #一、查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,用null填充
20 | select b.id, b.name, bo.*
21 | from beauty b
22 | left outer join boys bo on b.boyfriend_id = bo.id
23 | where b.id > 3;
24 |
25 | # 查询哪个城市没有部门
26 | select city
27 | from departments d
28 | #组成了一张新的表,在新表上进行过滤
29 | right outer join locations l on d.location_id = l.location_id
30 | where d.department_id is null;
31 |
32 | # 查询部门名为SAL或IT的员工信息
33 | select e.*,d.department_name
34 | from employees e
35 | left outer join departments d on e.department_id = d.department_id
36 | where d.department_name = 'SAL'
37 | or d.department_name = 'IT';
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/example001/hw_010_子查询.sql:
--------------------------------------------------------------------------------
1 | # 谁的工资比 Abel 高?
2 | select last_name, salary
3 | from employees
4 | where salary > (
5 | select salary
6 | from employees
7 | where last_name = 'Abel'
8 | );
9 |
10 | # 返回job_id与141号员工相同,salary比143号员工的员工 姓名,job_id 和工资
11 | select last_name, job_id, salary
12 | from employees
13 | where job_id = (
14 | select job_id
15 | from employees
16 | where employee_id = 141
17 | )
18 | and salary = (
19 | select salary
20 | from employees
21 | where employee_id = 143
22 | );
23 |
24 |
25 | # 返回公司工资最少的员工的last_name,job_id和salary
26 | select last_name, job_id, salary
27 | from employees
28 | where salary = (
29 | select min(salary)
30 | from employees
31 | );
32 |
33 |
34 | # 查询最低工资 大于50号部门最低工资的 部门id 和 其最低工资
35 | select department_id, min(salary) min_salary
36 | from employees
37 | group by department_id
38 | having min_salary > (
39 | select min(salary)
40 | from employees
41 | where department_id = 50
42 | );
43 |
44 |
45 | # 返回location_id是1400或1700的部门 中的 所有员工姓名
46 | # 得到所有的部门id
47 | select distinct department_id
48 | from departments
49 | where location_id = 1400
50 | or location_id = 1700;
51 | #根据部门id查员工名
52 |
53 | select last_name, department_id
54 | from employees
55 | where department_id = any (
56 | select distinct department_id
57 | from departments
58 | where location_id = 1400
59 | or location_id = 1700
60 | )
61 | order by department_id;
62 |
63 | # 返回其它工种中比job_id为‘IT_PROG’工种 任一工资低的 员工的员工号、姓名、job_id 以及salary
64 | # 1 job_id为‘IT_PROG’的所有工资
65 | select salary
66 | from employees
67 | where job_id = 'IT_PROG';
68 |
69 | # 2 嵌套查询
70 | select employee_id, last_name, job_id, salary
71 | from employees
72 | where salary < all (
73 | select salary
74 | from employees
75 | where job_id = 'IT_PROG'
76 | )
77 | order by salary;
78 |
79 | # 查询员工编号最小并且工资最高的员工信息
80 | select *
81 | from employees
82 | where employee_id = (
83 | select min(employee_id)
84 | from employees
85 | )
86 | and salary = (
87 | select max(salary)
88 | from employees
89 | );
90 |
91 | # 查询每个部门的员工个数
92 | select count(*) count, department_name
93 | from employees e
94 | inner join departments d on e.department_id = d.department_id
95 | group by department_name
96 | order by count;
97 |
98 | #第二种方法 第一种方法查不出员工为0的部门
99 | select department_name,
100 | (
101 | select count(*)
102 | from employees e
103 | where e.department_id = d.department_id
104 | ) count
105 | from departments d
106 | # having count != 0
107 | order by count;
108 |
109 |
110 | # 查询员工号=102的部门名
111 | select department_name
112 | from departments d
113 | where department_id = (
114 | select department_id
115 | from employees e
116 | where e.employee_id = 102
117 | );
118 |
119 | #第二种方法
120 | select department_name
121 | from departments
122 | left outer join employees e on departments.department_id = e.department_id
123 | where e.employee_id = 102;
124 |
125 | # 查询每个部门的平均工资的工资等级
126 | #1 查询每个部门的平均工资
127 | select round(avg(salary)) avg_salary, department_id
128 | from employees
129 | group by department_id;
130 | #2 嵌套查询 将查询结果作为新表链接
131 | select ag_dep.*, g.grade_level
132 | from (
133 | select round(avg(salary)) avg_salary, department_id
134 | from employees
135 | group by department_id
136 | ) ag_dep
137 | inner join job_grades g on ag_dep.avg_salary between lowest_sal and highest_sal;
138 |
139 |
140 | # 查询所有员工的部门名
141 | select d.department_name
142 | from departments d
143 | where d.department_id in (
144 | select department_id
145 | from employees
146 | );
147 |
148 | select department_name
149 | from departments d
150 | where exists(select *
151 | from employees e
152 | where d.department_id = e.department_id);
153 |
154 | # 查询没有女朋友的男神信息
155 | select bo.*
156 | from boys bo
157 | where bo.id not in (
158 | select boyfriend_id
159 | from beauty
160 | );
161 |
162 | select bo.*
163 | from boys bo
164 | where not exists(
165 | select boyfriend_id
166 | from beauty b
167 | where bo.id = b.boyfriend_id
168 | );
169 |
170 | # 查询和Zlotkey相同部门的员工姓名和工资
171 | # Zlotkey相同部门
172 | select department_id
173 | from employees
174 | where last_name = 'Zlotkey';
175 |
176 | #嵌套
177 | select concat(last_name, first_name) name, salary
178 | from employees
179 | where department_id = (
180 | select department_id
181 | from employees
182 | where last_name = 'Zlotkey'
183 | );
184 |
185 | # 查询工资比公司平均工资高的员工的员工号,姓名和工资
186 | # 公司平均工资
187 | select avg(salary) avg_salary
188 | from employees;
189 |
190 | select employee_id, concat(last_name, first_name) name, salary
191 | from employees
192 | where salary > (
193 | select avg(salary) avg_salary
194 | from employees
195 | );
196 |
197 | # 查询各部门中 工资比本部门平均工资高 的员工的员工号, 姓名和工资
198 | # 本部门平均工资
199 | select avg(salary) avg_salary
200 | from employees
201 | where department_id is not null
202 | group by department_id;
203 |
204 | # 各部门
205 | select distinct department_id
206 | from employees
207 | where department_id is not null;
208 |
209 | #嵌套
210 | select employee_id, concat(last_name, first_name) name, salary, e.department_id
211 | from employees e
212 | inner join (
213 | select avg(salary) avg_salary, department_id
214 | from employees
215 | where department_id is not null
216 | group by department_id
217 | ) ag_dep on e.department_id = ag_dep.department_id
218 | where salary > ag_dep.avg_salary;
219 |
220 |
221 | # 查询和姓名中包含字母u 的员工在 相同部门 的员工的员工号和姓名
222 | # 相同部门
223 | select department_id
224 | from employees
225 | where last_name like '%u%'
226 | group by department_id;
227 |
228 | #嵌套
229 | select employee_id, concat(last_name, first_name) name
230 | from employees e
231 | inner join (
232 | select department_id
233 | from employees
234 | where last_name like '%u%'
235 | group by department_id
236 | ) udepart on e.department_id = udepart.department_id;
237 |
238 | #方法2
239 | select employee_id, concat(last_name, first_name) name
240 | from employees
241 | where department_id in (
242 | select department_id
243 | from employees
244 | where last_name like '%u%'
245 | group by department_id
246 | );
247 |
248 | #方法3
249 | select employee_id, concat(last_name, first_name) name
250 | from employees
251 | where department_id = any (
252 | select department_id
253 | from employees
254 | where last_name like '%u%'
255 | group by department_id
256 | );
257 |
258 |
259 | # 查询在部门的location_id为1700的部门工作的员工的员工号
260 | # location_id为1700的部门
261 | select department_id
262 | from departments d
263 | inner join locations l on d.location_id = l.location_id
264 | where l.location_id = 1700;
265 |
266 | #嵌套
267 | select employee_id
268 | from employees e
269 | where e.department_id = any (
270 | select department_id
271 | from departments d
272 | inner join locations l on d.location_id = l.location_id
273 | where l.location_id = 1700
274 | );
275 |
276 |
277 |
278 | # 查询管理者是K_ing的 员工姓名和工资
279 | # 管理者是K_ing
280 | select employee_id
281 | from employees
282 | where last_name = 'K_ing';
283 |
284 | #嵌套
285 | select concat(last_name, first_name) name, salary
286 | from employees
287 | where manager_id = any (
288 | select employee_id
289 | from employees
290 | where last_name = 'K_ing'
291 | );
292 | # 查询工资最高的员工的姓名,要求first_name和last_name显示为一列,列名为 姓.名
293 | # 工资最高
294 | select max(salary)
295 | from employees;
296 |
297 | #嵌套
298 | select concat(last_name, '.', first_name) name
299 | from employees
300 | where salary = (
301 | select max(salary)
302 | from employees
303 | );
304 |
305 |
306 |
--------------------------------------------------------------------------------
/example002/hw_001_创建表并添加数据.sql:
--------------------------------------------------------------------------------
1 | show tables;
2 |
3 | create table userinfo
4 | (
5 | id int primary key auto_increment,
6 | username varchar(24) not null,
7 | password varchar(68) not null
8 | );
9 | select *
10 | from userinfo;
11 | insert into userinfo(username, password) value ('lxgzhw', 'lxgzhw');
--------------------------------------------------------------------------------
/example002/hw_002_pymysql的使用.py:
--------------------------------------------------------------------------------
1 | # _*_ coding:UTF-8 _*_
2 | # 开发人员: 理想国真恵玩-张大鹏
3 | # 开发团队: 理想国真恵玩
4 | # 开发时间: 2019-04-28 09:32
5 | # 文件名称: hw_002_pymysql的使用.py
6 | # 开发工具: PyCharm
7 | import pymysql
8 | conn = pymysql.connect(host="cdb-5ssi1fam.bj.tencentcdb.com", user='lxgzhw', password='lxgzhw123456',
9 | database="mysql_tutorial", port=10068, charset='utf8')
10 | cursor = conn.cursor()
11 | sql = "select *from userinfo"
12 | cursor.execute(sql)
13 | result = cursor.fetchone()
14 |
15 | cursor.close()
16 | conn.close()
17 | if result:
18 | print('登录成功')
19 | else:
20 | print('登录失败')
21 |
--------------------------------------------------------------------------------
/example002/hw_003_用户登录.py:
--------------------------------------------------------------------------------
1 | # _*_ coding:UTF-8 _*_
2 | # 开发人员: 理想国真恵玩-张大鹏
3 | # 开发团队: 理想国真恵玩
4 | # 开发时间: 2019-04-28 09:32
5 | # 文件名称: hw_002_pymysql的使用.py
6 | # 开发工具: PyCharm
7 | import pymysql
8 |
9 | conn = pymysql.connect(host="cdb-5ssi1fam.bj.tencentcdb.com", user='lxgzhw', password='lxgzhw123456',
10 | database="mysql_tutorial", port=10068, charset='utf8')
11 | cursor = conn.cursor()
12 |
13 | username = input("用户名:")
14 | password = input("密码:")
15 |
16 | sql = "select username,password from userinfo where username='{}' and password='{}'".format(username, password)
17 | cursor.execute(sql)
18 | result = cursor.fetchone()
19 |
20 | cursor.close()
21 | conn.close()
22 | if result:
23 | print('登录成功')
24 | else:
25 | print('登录失败')
26 |
--------------------------------------------------------------------------------
/example002/hw_004_用户注册.py:
--------------------------------------------------------------------------------
1 | # _*_ coding:UTF-8 _*_
2 | # 开发人员: 理想国真恵玩-张大鹏
3 | # 开发团队: 理想国真恵玩
4 | # 开发时间: 2019-04-28 09:32
5 | # 文件名称: hw_002_pymysql的使用.py
6 | # 开发工具: PyCharm
7 | import pymysql
8 |
9 | conn = pymysql.connect(host="cdb-5ssi1fam.bj.tencentcdb.com", user='lxgzhw', password='lxgzhw123456',
10 | database="mysql_tutorial", port=10068, charset='utf8')
11 | cursor = conn.cursor()
12 |
13 | username = input("用户名:")
14 | password = input("密码:")
15 |
16 | sql = "insert into userinfo (username,password) value( '{}' ,'{}')".format(username, password)
17 | result = cursor.execute(sql)
18 | conn.commit()
19 |
20 | cursor.close()
21 | conn.close()
22 |
23 |
24 | if result:
25 | print('注册成功')
26 | else:
27 | print('注册失败')
28 |
--------------------------------------------------------------------------------
/【案例讲解】存储过程.sql:
--------------------------------------------------------------------------------
1 | #一、创建存储过程实现传入用户名和密码,插入到admin表中
2 |
3 | CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR(20))
4 | BEGIN
5 | INSERT INTO admin(admin.username,PASSWORD)
6 | VALUES(username,loginpwd);
7 | END $
8 |
9 | #二、创建存储过程实现传入女神编号,返回女神名称和女神电话
10 |
11 | CREATE PROCEDURE test_pro2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))
12 |
13 | BEGIN
14 | SELECT b.name ,b.phone INTO NAME,phone
15 | FROM beauty b
16 | WHERE b.id = id;
17 |
18 | END $
19 | #三、创建存储存储过程或函数实现传入两个女神生日,返回大小
20 |
21 | CREATE PROCEDURE test_pro3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)
22 | BEGIN
23 | SELECT DATEDIFF(birth1,birth2) INTO result;
24 | END $
25 | #四、创建存储过程或函数实现传入一个日期,格式化成xx年xx月xx日并返回
26 | CREATE PROCEDURE test_pro4(IN mydate DATETIME,OUT strDate VARCHAR(50))
27 | BEGIN
28 | SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
29 | END $
30 |
31 | CALL test_pro4(NOW(),@str)$
32 | SELECT @str $
33 |
34 | #五、创建存储过程或函数实现传入女神名称,返回:女神 and 男神 格式的字符串
35 | 如 传入 :小昭
36 | 返回: 小昭 AND 张无忌
37 | DROP PROCEDURE test_pro5 $
38 | CREATE PROCEDURE test_pro5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))
39 | BEGIN
40 | SELECT CONCAT(beautyName,' and ',IFNULL(boyName,'null')) INTO str
41 | FROM boys bo
42 | RIGHT JOIN beauty b ON b.boyfriend_id = bo.id
43 | WHERE b.name=beautyName;
44 |
45 |
46 | SET str=
47 | END $
48 |
49 | CALL test_pro5('柳岩',@str)$
50 | SELECT @str $
51 |
52 |
53 |
54 | #六、创建存储过程或函数,根据传入的条目数和起始索引,查询beauty表的记录
55 | DROP PROCEDURE test_pro6$
56 | CREATE PROCEDURE test_pro6(IN startIndex INT,IN size INT)
57 | BEGIN
58 | SELECT * FROM beauty LIMIT startIndex,size;
59 | END $
60 |
61 | CALL test_pro6(3,5)$
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/函数.sql:
--------------------------------------------------------------------------------
1 | #函数
2 | /*
3 | 含义:一组预先编译好的SQL语句的集合,理解成批处理语句
4 | 1、提高代码的重用性
5 | 2、简化操作
6 | 3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
7 |
8 | 区别:
9 |
10 | 存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
11 | 函数:有且仅有1 个返回,适合做处理数据后返回一个结果
12 |
13 | */
14 |
15 | #一、创建语法
16 | CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
17 | BEGIN
18 | 函数体
19 | END
20 | /*
21 |
22 | 注意:
23 | 1.参数列表 包含两部分:
24 | 参数名 参数类型
25 |
26 | 2.函数体:肯定会有return语句,如果没有会报错
27 | 如果return语句没有放在函数体的最后也不报错,但不建议
28 |
29 | return 值;
30 | 3.函数体中仅有一句话,则可以省略begin end
31 | 4.使用 delimiter语句设置结束标记
32 |
33 | */
34 |
35 | #二、调用语法
36 | SELECT 函数名(参数列表)
37 |
38 |
39 | #------------------------------案例演示----------------------------
40 | #1.无参有返回
41 | #案例:返回公司的员工个数
42 | CREATE FUNCTION myf1() RETURNS INT
43 | BEGIN
44 |
45 | DECLARE c INT DEFAULT 0;#定义局部变量
46 | SELECT COUNT(*) INTO c#赋值
47 | FROM employees;
48 | RETURN c;
49 |
50 | END $
51 |
52 | SELECT myf1()$
53 |
54 |
55 | #2.有参有返回
56 | #案例1:根据员工名,返回它的工资
57 |
58 | CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
59 | BEGIN
60 | SET @sal=0;#定义用户变量
61 | SELECT salary INTO @sal #赋值
62 | FROM employees
63 | WHERE last_name = empName;
64 |
65 | RETURN @sal;
66 | END $
67 |
68 | SELECT myf2('k_ing') $
69 |
70 | #案例2:根据部门名,返回该部门的平均工资
71 |
72 | CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
73 | BEGIN
74 | DECLARE sal DOUBLE ;
75 | SELECT AVG(salary) INTO sal
76 | FROM employees e
77 | JOIN departments d ON e.department_id = d.department_id
78 | WHERE d.department_name=deptName;
79 | RETURN sal;
80 | END $
81 |
82 | SELECT myf3('IT')$
83 |
84 | #三、查看函数
85 |
86 | SHOW CREATE FUNCTION myf3;
87 |
88 | #四、删除函数
89 | DROP FUNCTION myf3;
90 |
91 | #案例
92 | #一、创建函数,实现传入两个float,返回二者之和
93 |
94 | CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
95 | BEGIN
96 | DECLARE SUM FLOAT DEFAULT 0;
97 | SET SUM=num1+num2;
98 | RETURN SUM;
99 | END $
100 |
101 | SELECT test_fun1(1,2)$
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/流程控制经典案例讲解.sql:
--------------------------------------------------------------------------------
1 | /*一、已知表stringcontent
2 | 其中字段:
3 | id 自增长
4 | content varchar(20)
5 |
6 | 向该表插入指定个数的,随机的字符串
7 | */
8 | DROP TABLE IF EXISTS stringcontent;
9 | CREATE TABLE stringcontent(
10 | id INT PRIMARY KEY AUTO_INCREMENT,
11 | content VARCHAR(20)
12 |
13 | );
14 | DELIMITER $
15 | CREATE PROCEDURE test_randstr_insert(IN insertCount INT)
16 | BEGIN
17 | DECLARE i INT DEFAULT 1;
18 | DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
19 | DECLARE startIndex INT;#代表初始索引
20 | DECLARE len INT;#代表截取的字符长度
21 | WHILE i<=insertcount DO
22 | SET startIndex=FLOOR(RAND()*26+1);#代表初始索引,随机范围1-26
23 | SET len=FLOOR(RAND()*(20-startIndex+1)+1);#代表截取长度,随机范围1-(20-startIndex+1)
24 | INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
25 | SET i=i+1;
26 | END WHILE;
27 |
28 | END $
29 |
30 | CALL test_randstr_insert(10)$
--------------------------------------------------------------------------------
/流程控制结构.sql:
--------------------------------------------------------------------------------
1 | #流程控制结构
2 | /*
3 | 顺序、分支、循环
4 |
5 | */
6 |
7 | #一、分支结构
8 | #1.if函数
9 | /*
10 | 语法:if(条件,值1,值2)
11 | 功能:实现双分支
12 | 应用在begin end中或外面
13 |
14 | */
15 |
16 | #2.case结构
17 | /*
18 | 语法:
19 | 情况1:类似于switch
20 | case 变量或表达式
21 | when 值1 then 语句1;
22 | when 值2 then 语句2;
23 | ...
24 | else 语句n;
25 | end
26 |
27 | 情况2:
28 | case
29 | when 条件1 then 语句1;
30 | when 条件2 then 语句2;
31 | ...
32 | else 语句n;
33 | end
34 |
35 | 应用在begin end 中或外面
36 |
37 |
38 | */
39 |
40 | #3.if结构
41 |
42 | /*
43 | 语法:
44 | if 条件1 then 语句1;
45 | elseif 条件2 then 语句2;
46 | ....
47 | else 语句n;
48 | end if;
49 | 功能:类似于多重if
50 |
51 | 只能应用在begin end 中
52 |
53 | */
54 |
55 | #案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
56 |
57 | CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
58 | BEGIN
59 | DECLARE ch CHAR DEFAULT 'A';
60 | IF score>90 THEN SET ch='A';
61 | ELSEIF score>80 THEN SET ch='B';
62 | ELSEIF score>60 THEN SET ch='C';
63 | ELSE SET ch='D';
64 | END IF;
65 | RETURN ch;
66 |
67 |
68 | END $
69 |
70 | SELECT test_if(87)$
71 |
72 | #案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
73 |
74 |
75 | CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
76 | BEGIN
77 | IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
78 | ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
79 | ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
80 | END IF;
81 |
82 | END $
83 |
84 | CALL test_if_pro(2100)$
85 |
86 | #案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
87 |
88 | CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
89 | BEGIN
90 | DECLARE ch CHAR DEFAULT 'A';
91 |
92 | CASE
93 | WHEN score>90 THEN SET ch='A';
94 | WHEN score>80 THEN SET ch='B';
95 | WHEN score>60 THEN SET ch='C';
96 | ELSE SET ch='D';
97 | END CASE;
98 |
99 | RETURN ch;
100 | END $
101 |
102 | SELECT test_case(56)$
103 |
104 |
105 |
106 | #二、循环结构
107 | /*
108 | 分类:
109 | while、loop、repeat
110 |
111 | 循环控制:
112 |
113 | iterate类似于 continue,继续,结束本次循环,继续下一次
114 | leave 类似于 break,跳出,结束当前所在的循环
115 |
116 | */
117 |
118 | #1.while
119 | /*
120 |
121 | 语法:
122 |
123 | 【标签:】while 循环条件 do
124 | 循环体;
125 | end while【 标签】;
126 |
127 | 联想:
128 |
129 | while(循环条件){
130 |
131 | 循环体;
132 | }
133 |
134 | */
135 |
136 | #2.loop
137 | /*
138 |
139 | 语法:
140 | 【标签:】loop
141 | 循环体;
142 | end loop 【标签】;
143 |
144 | 可以用来模拟简单的死循环
145 |
146 |
147 |
148 | */
149 |
150 | #3.repeat
151 | /*
152 | 语法:
153 | 【标签:】repeat
154 | 循环体;
155 | until 结束循环的条件
156 | end repeat 【标签】;
157 |
158 |
159 | */
160 |
161 | #1.没有添加循环控制语句
162 | #案例:批量插入,根据次数插入到admin表中多条记录
163 | DROP PROCEDURE pro_while1$
164 | CREATE PROCEDURE pro_while1(IN insertCount INT)
165 | BEGIN
166 | DECLARE i INT DEFAULT 1;
167 | WHILE i<=insertCount DO
168 | INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
169 | SET i=i+1;
170 | END WHILE;
171 |
172 | END $
173 |
174 | CALL pro_while1(100)$
175 |
176 |
177 | /*
178 |
179 | int i=1;
180 | while(i<=insertcount){
181 |
182 | //插入
183 |
184 | i++;
185 |
186 | }
187 |
188 | */
189 |
190 |
191 | #2.添加leave语句
192 |
193 | #案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
194 | TRUNCATE TABLE admin$
195 | DROP PROCEDURE test_while1$
196 | CREATE PROCEDURE test_while1(IN insertCount INT)
197 | BEGIN
198 | DECLARE i INT DEFAULT 1;
199 | a:WHILE i<=insertCount DO
200 | INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
201 | IF i>=20 THEN LEAVE a;
202 | END IF;
203 | SET i=i+1;
204 | END WHILE a;
205 | END $
206 |
207 |
208 | CALL test_while1(100)$
209 |
210 |
211 | #3.添加iterate语句
212 |
213 | #案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
214 | TRUNCATE TABLE admin$
215 | DROP PROCEDURE test_while1$
216 | CREATE PROCEDURE test_while1(IN insertCount INT)
217 | BEGIN
218 | DECLARE i INT DEFAULT 0;
219 | a:WHILE i<=insertCount DO
220 | SET i=i+1;
221 | IF MOD(i,2)!=0 THEN ITERATE a;
222 | END IF;
223 |
224 | INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
225 |
226 | END WHILE a;
227 | END $
228 |
229 |
230 | CALL test_while1(100)$
231 |
232 | /*
233 |
234 | int i=0;
235 | while(i<=insertCount){
236 | i++;
237 | if(i%2==0){
238 | continue;
239 | }
240 | 插入
241 |
242 | }
243 |
244 | */
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
--------------------------------------------------------------------------------