├── .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 | 36 | 37 | 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 | 25 | 26 | 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 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 255 | 256 | 257 | 258 | 259 | 279 | 280 | 281 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 1556414884169 315 | 320 | 321 | 322 | 323 | 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 | 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 | --------------------------------------------------------------------------------