zoukankan      html  css  js  c++  java
  • 大数据第25天-约束和分页--杨大伟

       1 cd /d D:MyWorkMySQLmysql-5.7.28-winx64in rem 目的是为了执行mysql.exe
       2 mysql -h127.0.0.1 -P3306 -uroot -p123456 rem 作用是为了让客户端能够正确的连接服务器
       3 mysql --host=127.0.0.1 --port=3306 --user=root --password=123456 world
       4 
       5 -- 查看服务器中有哪些数据库
       6 show databases;
       7 
       8 -- 创建新的数据库
       9 create database company;
      10 
      11 -- 切换工作数据库
      12 use company;
      13 
      14 -- 查看当前数据库中的表
      15 show tables;
      16 
      17 -- 导入.sql文件中的数据
      18 source d:/company.sql;
      19 
      20 -- 查看表中的数据
      21 select * from employees;
      22 
      23 -- 练习 : 创建world数据库, 并切换, 再导入world.sql文件中的数据到world库.
      24 create database world;
      25 
      26 use world;
      27 
      28 source d:/world.sql;
      29 
      30 -- 丢弃数据库
      31 drop database company;
      32 
      33 drop database world;
      34 
      35 -- 查看当前工作数据库
      36 select database();
      37 
      38 -- 查看当前工作数据库的版本
      39 select version();
      40 
      41 -- 查看服务器所有参数
      42 show variables;
      43 
      44 -- 和字符集设置相关的参数 : 
      45 character_set_client                                     | gbk
      46 character_set_connection                                 | gbk
      47 character_set_database                                   | utf8
      48 character_set_filesystem                                 | binary
      49 character_set_results                                    | gbk
      50 character_set_server                                     | utf8
      51 character_set_system                                     | utf8
      52 
      53 -- 如果client,connection和result的设置不是gbk, 必须执行以下语句
      54 
      55 -- 修改客户端编码
      56 set names gbk;
      57 
      58 数据库结构
      59     mysqld 服务器
      60         数据库1(目录形式)
      61             表1
      62                 数据(记录)1
      63                 数据(记录)2
      64                 数据(记录)3
      65                 ....
      66             表2 
      67             表3
      68             ....
      69             
      70         数据库2
      71         ......
      72         
      73 -- 查看表中数据
      74 select * from 表名; 
      75 
      76 -- 查看表结构
      77 describe employees;
      78 desc employees;
      79 
      80 +----------------+--------------+------+-----+---------+----------------+
      81 | Field          | Type         | Null | Key | Default | Extra          |
      82 +----------------+--------------+------+-----+---------+----------------+
      83 | employee_id    | int(6)       | NO   | PRI | NULL    | auto_increment |
      84 | first_name     | varchar(20)  | YES  |     | NULL    |                |
      85 | last_name      | varchar(25)  | YES  |     | NULL    |                |
      86 | email          | varchar(25)  | YES  |     | NULL    |                |
      87 | phone_number   | varchar(20)  | YES  |     | NULL    |                |
      88 | job_id         | varchar(10)  | YES  | MUL | NULL    |                |
      89 | salary         | double(10,2) | YES  |     | NULL    |                |
      90 | commission_pct | double(4,2)  | YES  |     | NULL    |                |
      91 | manager_id     | int(6)       | YES  |     | NULL    |                |
      92 | department_id  | int(4)       | YES  | MUL | NULL    |                |
      93 +----------------+--------------+------+-----+---------+----------------+
      94 
      95 create table customer(
      96     id int,
      97     name varchar(20),
      98     age int,
      99     phone varchar(15),
     100     birthday date
     101 );
     102 
     103 insert into customer (
     104     id,
     105     name,
     106     age,
     107     phone,
     108     birthday
     109 ) values (
     110     1,
     111     '张三',
     112     30,
     113     '134234234',
     114     '1992-5-8'
     115 );
     116 
     117 insert into customer (
     118     id,
     119     name,
     120     age,
     121     phone,
     122     birthday
     123 ) values (
     124     2,
     125     '李四',
     126     40,
     127     '1599234234',
     128     '1991-5-8'
     129 );
     130 
     131 insert into customer (
     132     id,
     133     name,
     134     age,
     135     phone,
     136     birthday
     137 ) values (
     138     3,
     139     '王五',
     140     50,
     141     '135234234',
     142     '1995-11-8'
     143 );
     144 
     145 -- 更新记录(修改数据)
     146 -- 如果更新时不加where过滤, 会导致所有数据被修改
     147 update customer set 
     148     name = '某人',
     149     age = 10;
     150     
     151 update customer set 
     152     name = '张三',
     153     age = 30
     154 where 
     155     id = 1;
     156     
     157 -- 删除记录
     158 -- 如果没有where过滤, 会全部删除.
     159 delete from customer;
     160 
     161 delete from customer 
     162 where id = 2;
     163 
     164 
     165 DML 数据操纵语言.
     166 insert C
     167 select R 
     168 update U
     169 delete D
     170 
     171 +----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
     172 | Field          | Type                                                                                  | Null | Key | Default | Extra |
     173 +----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
     174 | Code           | char(3)   国家代码                                                                            | NO   | PRI |         |       |
     175 | Name           | char(52)  国家名称                                                                    | NO   |     |         |       |
     176 | Continent      | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO   |     | Asia    |       |
     177 | Region         | char(26)          地区                                                                    | NO   |     |         |       |
     178 | SurfaceArea    | float(10,2)       国土面积m                                                                    | NO   |     | 0.00    |       |
     179 | IndepYear      | smallint(6)       独立年                                                                   | YES  |     | NULL    |       |
     180 | Population     | int(11)           国家人口                                                              | NO   |     | 0       |       |
     181 | LifeExpectancy | float(3,1)        平均寿命                                                                    | YES  |     | NULL    |       |
     182 | GNP            | float(10,2)       国民生产总值                                                                    | YES  |     | NULL    |       |
     183 | GNPOld         | float(10,2)                                                                           | YES  |     | NULL    |       |
     184 | LocalName      | char(45)                                                                              | NO   |     |         |       |
     185 | GovernmentForm | char(45)          政府组织                                                                    | NO   |     |         |       |
     186 | HeadOfState    | char(60)          领导人                                                                    | YES  |     | NULL    |       |
     187 | Capital        | int(11)           首都                                                                    | YES  |     | NULL    |       |
     188 | Code2          | char(2)                                                                                   | NO   |     |         |       |
     189 +----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
     190 city
     191 +-------------+----------+------+-----+---------+----------------+
     192 | Field       | Type     | Null | Key | Default | Extra          |
     193 +-------------+----------+------+-----+---------+----------------+
     194 | ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
     195 | Name        | char(35) | NO   |     |         |                |
     196 | CountryCode | char(3)  | NO   | MUL |         |                |
     197 | District    | char(20) | NO   |     |         |                |
     198 | Population  | int(11)  | NO   |     | 0       |                |
     199 +-------------+----------+------+-----+---------+----------------+
     200 SELECT *
     201 FROM   departments;
     202 
     203 SELECT department_id, location_id
     204 FROM   departments;
     205 
     206 select 
     207     code,
     208     name,
     209     continent
     210 from 
     211     country;
     212     
     213 select 
     214     continent,
     215     name,
     216     code
     217 from 
     218     country;
     219 
     220 SQL注意点 :     
     221     SQL 语言大小写不敏感。 
     222     SQL 可以写在一行或者多行
     223     关键字不能被缩写也不能分行
     224     各子句一般要分行写。
     225     使用缩进提高语句的可读性。
     226     
     227 -- 查询国家的人口,名称和代码及首都.
     228 select 
     229     population,
     230     name,
     231     code,
     232     capital
     233 from 
     234     country;
     235 
     236 -- AS用于给列起别名, AS关键字可以省略
     237 SELECT last_name AS name, commission_pct comm
     238 FROM   employees;
     239 
     240 -- 别名可以使用""包围, 目的是让它能原样显示或包含特殊的符号
     241 select 
     242     code 国家代码,
     243     name,
     244     continent as "国家 大洲"
     245 from 
     246     country;
     247 
     248 -- 过滤行 where 条件布尔 : 工作流程就是从基本表中测试每行数据, 都经过条件布尔测试一下, 如果结果为真留下, 为假则丢弃.     
     249 SELECT employee_id, last_name, job_id, department_id
     250 FROM   employees
     251 WHERE  department_id = 90 ;
     252 
     253 -- 查询所有亚洲国家
     254 select 
     255     code,
     256     population,
     257     name
     258 from 
     259     country 
     260 where 
     261     continent = 'asia';
     262     
     263 -- 查询所有亚洲国家 , 下面的SQL是错误的, where中不可以使用列的别名, 因为where先执行.
     264 select 
     265     code,
     266     population,
     267     name,
     268     continent cont
     269 from 
     270     country 
     271 where 
     272     cont = 'asia';
     273     
     274 执行顺序 : from => where => select 
     275 
     276 --查询所有中国城市的人口和名称和id号和国家代码, 给国家代码起别名, 尝试在where中使用别名.
     277 select 
     278     population,
     279     name,
     280     id,
     281     countrycode code 
     282 from 
     283     city 
     284 where 
     285     countrycode = 'chn';
     286 
     287 -- between a and b --等效于salary >= a && salary <= 3500    
     288 SELECT last_name, salary
     289 FROM   employees
     290 WHERE  salary BETWEEN 2500 AND 3500;
     291 
     292 -- id in(a, b, c) -- 等效于id = a || id = b || id = c 
     293 SELECT employee_id, last_name, salary, manager_id
     294 FROM   employees
     295 WHERE  manager_id IN (100, 101, 201);
     296 
     297 select 
     298     code,
     299     continent,
     300     name,
     301     population
     302 from 
     303     country 
     304 where 
     305     name like 'china'; -- name = 'china' 如果模糊查询中的字符串没有通配符, 和=效果一样.
     306     
     307 SELECT    first_name
     308 FROM     employees
     309 WHERE    first_name LIKE 'S%';
     310 
     311 % 代表任意个任意字符
     312 _ 代表一个任意字符
     313 -- 查询国家名称中只要包含ch的都行
     314 
     315 select 
     316     code,
     317     population,
     318     name,
     319     continent 
     320 from 
     321     country 
     322 where 
     323     name like '%ch%'
     324     
     325 -- 名字中第3个和第4个是in的国家
     326 select 
     327     code,
     328     population,
     329     name,
     330     continent 
     331 from 
     332     country 
     333 where 
     334     name like '__in%'
     335     
     336 -- 查询城市表中, 名称的第2个和3个字母是or的城市.
     337 select 
     338     id,
     339     name,
     340     countrycode 
     341 from 
     342     city 
     343 where 
     344     name like '_or%';
     345     
     346 -- 查看哪些国家没有首都
     347 -- null和任意的比较运算, 结果一定是false, 处理null, 必须使用特殊的is来判断
     348 -- null值在进行统计时会被自动忽略.
     349 select 
     350     code,
     351     name,
     352     continent,
     353     capital
     354 from 
     355     country 
     356 where 
     357     capital = null;
     358     
     359 select 
     360     code,
     361     name,
     362     continent,
     363     capital
     364 from 
     365     country 
     366 where 
     367     capital is null;
     368     
     369 select 
     370     code,
     371     name,
     372     continent,
     373     capital
     374 from 
     375     country 
     376 where 
     377     capital is not null;
     378 
     379 -- 哪些国家尚未独立.
     380 select 
     381     name,
     382     code,
     383     indepYear
     384 from 
     385     country 
     386 where 
     387     indepYear is null;
     388 
     389 
     390 SELECT 
     391     employee_id, last_name, job_id, salary
     392 FROM   employees
     393 WHERE  
     394         salary >=10000
     395     AND    
     396         job_id LIKE '%MAN%';
     397 
     398 
     399 SELECT 
     400     employee_id, last_name, job_id, salary
     401 FROM   employees
     402 WHERE  
     403         salary >= 10000
     404     OR     
     405         job_id LIKE '%MAN%';
     406 
     407 -- 查询亚洲国家中人口大于5000万的国家.
     408 select 
     409     code,
     410     name,
     411     continent,
     412     population
     413 from 
     414     country 
     415 where 
     416         continent = 'asia'
     417     and 
     418         population > 50000000;
     419 
     420 -- 查询中国的城市人口小于20万的城市.
     421 select 
     422     *
     423 from 
     424     city 
     425 where 
     426     countrycode = 'chn'
     427     and 
     428     population < 200000;
     429     
     430 -- 去重 distinct, 后面的列最好是有重复数据的
     431 select 
     432     distinct 
     433         continent,
     434         region
     435 from 
     436     country;
     437     
     438 -- 查看中国各有哪些不同的省.
     439 select 
     440     distinct district
     441 from 
     442     city 
     443 where 
     444     countrycode = 'chn';
     445 
     446 SELECT   last_name, job_id, department_id, salary
     447 FROM     employees
     448 ORDER BY salary asc;
     449 
     450 SELECT   last_name, job_id, department_id, salary
     451 FROM     employees
     452 ORDER BY salary desc;
     453 
     454 select 
     455     code,
     456     name,
     457     population pop 
     458 from 
     459     country 
     460 where 
     461     continent = 'asia'
     462 order by 
     463     pop;
     464 
     465 order by中可以使用列的别名, 原因是它最后执行
     466 
     467 顺序 : from => where => select => order by 
     468 
     469 
     470 SELECT last_name, department_id, salary
     471 FROM   employees
     472 ORDER BY department_id asc, salary DESC;
     473 
     474 -- 查询亚洲人口最少的国家
     475 select 
     476     code,
     477     name,
     478     continent,
     479     population pop 
     480 from 
     481     country 
     482 where 
     483     continent = 'asia'
     484 order by 
     485     pop desc;
     486 
     487 -- 查询山东省人口最多的城市
     488 select 
     489     id,
     490     name,
     491     district,
     492     population
     493 from 
     494     city 
     495 where 
     496         countrycode = 'chn'
     497     and 
     498         district = 'shandong'
     499 order by 
     500     population
     501     
     502 
     503     
     504 -- 多表联接 : 会产生笛卡尔集
     505 -- 为了学习, 创建简单表
     506 create table city2
     507 select * from city where name='london';
     508 +------+--------+-------------+----------+------------+
     509 | ID   | Name   | CountryCode | District | Population |
     510 +------+--------+-------------+----------+------------+
     511 |  456 | London | GBR         | England  |    7285000 |
     512 | 1820 | London | CAN         | Ontario  |     339917 |
     513 +------+--------+-------------+----------+------------+
     514 
     515 create table country2
     516 select * from country where code in('gbr', 'can');
     517 +------+----------------+---------------+-----------------+-------------+-----------+------------+----------------+------------+------------+-------------
     518 | Code | Name           | Continent     | Region          | SurfaceArea | IndepYear | Population | LifeExpectancy | GNP        | GNPOld     | LocalName
     519 +------+----------------+---------------+-----------------+-------------+-----------+------------+----------------+------------+------------+-------------
     520 | CAN  | Canada         | North America | North America   |  9970610.00 |      1867 |   31147000 |           79.4 |  598862.00 |  625626.00 | Canada
     521 | GBR  | United Kingdom | Europe        | British Islands |   242900.00 |      1066 |   59623400 |           77.7 | 1378330.00 | 1296830.00 | United Kingd
     522 +------+----------------+---------------+-----------------+-------------+-----------+------------+----------------+------------+------------+-------------
     523 
     524 select * from city2, country2; 
     525 结果集中的绝大多数都是垃圾. 必须要过滤掉
     526 +------+--------+-------------+----------+------------+------+----------------+---------------+-----------------+-------------+-----------+------------+--
     527 | ID   | Name   | CountryCode | District | Population | Code | Name           | Continent     | Region          | SurfaceArea | IndepYear | Population | L
     528 +------+--------+-------------+----------+------------+------+----------------+---------------+-----------------+-------------+-----------+------------+--
     529 |  456 | London | GBR         | England  |    7285000 | CAN  | Canada         | North America | North America   |  9970610.00 |      1867 |   31147000 |
     530 | 1820 | London | CAN         | Ontario  |     339917 | CAN  | Canada         | North America | North America   |  9970610.00 |      1867 |   31147000 |
     531 |  456 | London | GBR         | England  |    7285000 | GBR  | United Kingdom | Europe        | British Islands |   242900.00 |      1066 |   59623400 |
     532 | 1820 | London | CAN         | Ontario  |     339917 | GBR  | United Kingdom | Europe        | British Islands |   242900.00 |      1066 |   59623400 |
     533 +------+--------+-------------+----------+------------+------+----------------+---------------+-----------------+-------------+-----------+------------+--
     534 
     535 select 
     536     * 
     537 from 
     538     city2, 
     539     country2
     540 where 
     541     countrycode = code;
     542     
     543 +------+--------+-------------+----------+------------+------+----------------+---------------+-----------------+-------------+-----------+------------+-
     544 | ID   | Name   | CountryCode | District | Population | Code | Name           | Continent     | Region          | SurfaceArea | IndepYear | Population |
     545 +------+--------+-------------+----------+------------+------+----------------+---------------+-----------------+-------------+-----------+------------+-
     546 | 1820 | London | CAN         | Ontario  |     339917 | CAN  | Canada         | North America | North America   |  9970610.00 |      1867 |   31147000 |
     547 |  456 | London | GBR         | England  |    7285000 | GBR  | United Kingdom | Europe        | British Islands |   242900.00 |      1066 |   59623400 |
     548 +------+--------+-------------+----------+------------+------+----------------+---------------+-----------------+-------------+-----------+------------+-
     549 
     550 -- 下面的SQL是错误的, 因为列名模糊
     551 select 
     552     name,
     553     population,
     554     name,
     555     continent,
     556     population
     557 from 
     558     city2, 
     559     country2
     560 where 
     561     countrycode = code;
     562     
     563 select 
     564     city2.name as cityName,
     565     city2.population cityPop,
     566     country2.name countryName,
     567     country2.continent,
     568     country2.population countryPop
     569 from 
     570     city2, 
     571     country2
     572 where 
     573     city2.countrycode = country2.code;
     574     
     575 -- 表名的使用也麻烦了. 给表起别名    
     576 select 
     577     ci.name as cityName,
     578     ci.population cityPop,
     579     co.name countryName,
     580     co.continent,
     581     co.population countryPop
     582 from 
     583     city2 as ci , 
     584     country2 co 
     585 where 
     586     ci.countrycode = co.code;
     587 
     588 -- 表名一旦指定了别名, 原名就不可以使用了.
     589 select 
     590     city2.name as cityName,
     591     city2.population cityPop,
     592     country2.name countryName,
     593     country2.continent,
     594     country2.population countryPop
     595 from 
     596     city2 as ci, 
     597     country2 as co 
     598 where 
     599     city2.countrycode = country2.code;
     600     
     601 -- 查询所有国家的名称和国家的首都的名称.
     602 select 
     603     co.name country,
     604     ci.name captial,
     605     co.population countryPop,
     606     ci.population cityPop,
     607     co.continent 
     608 from 
     609     country co,
     610     city ci 
     611 where 
     612     co.capital = ci.id
     613     
     614 -- where中有多个条件.
     615 select 
     616     ci.name as cityName,
     617     ci.population cityPop,
     618     co.name countryName,
     619     co.continent,
     620     co.population countryPop
     621 from 
     622     city2 as ci , 
     623     country2 co 
     624 where 
     625         ci.countrycode = co.code -- 联接条件, 比普通过滤更重要.
     626     and 
     627         ci.population > 1000000
     628         
     629 +----------+---------+----------------+-----------+------------+
     630 | cityName | cityPop | countryName    | continent | countryPop |
     631 +----------+---------+----------------+-----------+------------+
     632 | London   | 7285000 | United Kingdom | Europe    |   59623400 |
     633 +----------+---------+----------------+-----------+------------+
     634 
     635 SQL99标准中 内联接不要用,号来写, 而是使用专门的关键字join.... on 联接条件
     636 select 
     637     ci.name as cityName,
     638     ci.population cityPop,
     639     co.name countryName,
     640     co.continent,
     641     co.population countryPop
     642 from 
     643     city2 as ci 
     644 inner join 
     645     country2 co 
     646 on 
     647     ci.countrycode = co.code 
     648 where 
     649     ci.population > 1000000;
     650     
     651 -- on 和 where 效果相同, 但是下面的写法不推荐
     652 select 
     653     ci.name as cityName,
     654     ci.population cityPop,
     655     co.name countryName,
     656     co.continent,
     657     co.population countryPop
     658 from 
     659     city2 as ci 
     660 inner join 
     661     country2 co 
     662 where 
     663         ci.countrycode = co.code 
     664     and 
     665         ci.population > 1000000;
     666     
     667 -- on 和 where 效果相同, 但是下面的写法不推荐    
     668 select 
     669     ci.name as cityName,
     670     ci.population cityPop,
     671     co.name countryName,
     672     co.continent,
     673     co.population countryPop
     674 from 
     675     city2 as ci 
     676 inner join 
     677     country2 co 
     678 on 
     679         ci.countrycode = co.code 
     680     and 
     681         ci.population > 1000000;
     682     
     683 -- 最好的写法是下面的.    inner关键字可以省略
     684 select 
     685     ci.name as cityName,
     686     ci.population cityPop,
     687     co.name countryName,
     688     co.continent,
     689     co.population countryPop
     690 from 
     691     city2 as ci 
     692 join 
     693     country2 co 
     694 on -- on后面只跟 联接条件 
     695     ci.countrycode = co.code 
     696 where -- where 后面只跟  普通行过滤
     697     ci.population > 1000000;
     698     
     699 -- 查询所有亚洲和欧洲国家的首都, 使用SQL99
     700 select 
     701     co.name country,
     702     co.continent,
     703     ci.name capital
     704 from 
     705     country co 
     706 join 
     707     city ci 
     708 on 
     709     co.capital = ci.id 
     710 where 
     711     co.continent in('asia', 'europe');
     712     
     713 -- 查看所有国家名称和首都及官方语言
     714 select 
     715     co.name country,
     716     co.continent,
     717     ci.name capital,
     718     cl.language
     719 from 
     720     country co 
     721 join 
     722     city ci 
     723 on 
     724     co.capital = ci.id 
     725 join 
     726     countrylanguage cl 
     727 on 
     728     cl.countrycode = co.code 
     729 where 
     730     cl.isofficial = 't';
     731     
     732 -- 查询简单表的国家及首都
     733 -- 内联接的结果总是所有联接条件为真的记录. 为假的记录全部滤掉.
     734 select 
     735     co.name country,
     736     ci.name capital,
     737     ci.district
     738 from 
     739     country2 co 
     740 join 
     741     city2 ci 
     742 on 
     743     co.capital = ci.id;
     744     
     745     
     746 -- 外联接可以保证某张表的数据完整, 即使联接条件为假, 也要保留数据
     747 select 
     748     co.name country,
     749     ci.name capital,
     750     ci.district
     751 from 
     752     country2 co 
     753 left outer join 
     754     city2 ci 
     755 on 
     756     co.capital = ci.id;
     757     
     758 select 
     759     co.name country,
     760     ci.name capital,
     761     ci.district
     762 from 
     763     country2 co 
     764 right outer join 
     765     city2 ci 
     766 on 
     767     co.capital = ci.id;
     768     
     769 -- 查看所有国家名称和首都, 即使没有首都也要显示.
     770 select 
     771     co.name country,
     772     co.continent,
     773     ci.name capital
     774 from 
     775     country co 
     776 left join 
     777     city ci 
     778 on 
     779     co.capital = ci.id;
     780 
     781 -- 查询哪些国家没有首都
     782 select 
     783     co.name country,
     784     co.continent,
     785     ci.name capital
     786 from 
     787     country co 
     788 left join 
     789     city ci 
     790 on 
     791     co.capital = ci.id
     792 where 
     793     ci.name is null;
     794     
     795 // 伪代码
     796 // 内联接
     797 Set leftTable;
     798 Set rightTable;
     799 Set resultSet = new Set();
     800 for (int i = 0; i < leftTable.length; i++) {
     801     Row leftRow = leftTable[i];
     802     for (int j = 0; j < rightTable.length; j++) {
     803         Row rightRow = rightTable[j];
     804         if (联接条件(leftRow, rightRow)) {
     805             Row newRow = leftRow + rightRow;
     806             resultSet.add(newRow);
     807         }
     808     }
     809 }
     810 
     811 // 外联接 
     812 Set leftTable;
     813 Set rightTable;
     814 Set resultSet = new Set();
     815 for (int i = 0; i < leftTable.length; i++) {
     816     Row leftRow = leftTable[i];
     817     boolean flag = false;
     818     for (int j = 0; j < rightTable.length; j++) {
     819         Row rightRow = rightTable[j];
     820         if (联接条件(leftRow, rightRow)) {
     821             Row newRow = leftRow + rightRow;
     822             resultSet.add(newRow);
     823             flag = true; // 表明联接条件为真的记录保存起来
     824         }
     825     }
     826     
     827     if (!flag) {
     828         Row newRow = leftRow + 空行(右表);
     829         resultSet.add(newRow);
     830     }
     831 }
     832 
     833 -- 查询哪些国家没有官方语言
     834 select 
     835     co.name country,
     836     cl.language,
     837     cl.isofficial
     838 from 
     839     country co 
     840 left join 
     841     countrylanguage cl 
     842 on 
     843         co.code = cl.countrycode
     844     and 
     845         cl.isofficial = 'T'
     846 where 
     847     cl.isofficial is null
     848     
     849 -- 查询所有国家的首都和官方语言, 没有首都和官方语言的也要全部显示.
     850 
     851 -- 单行函数, 查询结果中对每一行都单独执行的函数
     852 select
     853     upper(name),
     854     lower(continent)
     855 from 
     856     county;
     857     
     858 select 
     859     concat(code, name),
     860     substr(name, 3, 2)
     861 from 
     862     country;
     863     
     864 -- 把国家的代码和名称及大洲用@符号连接. 如 : CHN@China@asia 
     865 select
     866     concat(concat(concat(concat(code, '@'), name), '@'), continent)
     867 from 
     868     country;
     869     
     870 select
     871     concat(code, '@', name, '@', continent)
     872 from 
     873     country;
     874 
     875 
     876 -- 分组函数 : 作用于一组数据. 默认情况下虚表中的所有记录被当作一个组.
     877 分组函数都是统计运算, 特点就是一组数据只能有一个结果. 结果也必须是所有数据处理完后才有的.
     878 
     879 max() 最大值 
     880 min() 最小值 
     881 avg() 平均值 
     882 sum() 求和
     883 count() 计数
     884 
     885 select 
     886     max(population),
     887     min(surfacearea)
     888 from 
     889     country ;
     890 
     891 
     892 select 
     893     -- name, 不可以再把普通的列放在这里
     894     max(name),
     895     max(population),
     896     min(surfacearea)
     897 from 
     898     country ;
     899 
     900 复习 :
     901 
     902 C / S 架构
     903 Server : mysqld 
     904 Client : mysql 
     905 
     906 客户端连接服务器必须要提供 : 主机地址, 端口号, 用户名, 密码, 默认数据库
     907 mysql --host=127.0.0.1 --port=3306 --user=root --password=123456 world
     908 
     909 -- 查看所有数据库
     910 show databases;
     911 
     912 -- 查看库中的表
     913 show tables;
     914 
     915 -- 查看其他库中的表
     916 show tables from 库名;
     917 
     918 -- 查看表结构 
     919 desc 表名;
     920 
     921 -- 查看表的建表语句
     922 show create table 表名;
     923 
     924 -- 通过建表语句可以看出表的存储引擎, 缺省字符集, 各种约束的名字....
     925 
     926 myisam引擎不支持高级特性 : 事务, 外键, 行级锁. 速度极快
     927 innodb引擎支持高级特性, 速度稍慢.
     928 
     929 ``的作用是专门用于包围数据库对象的名称. 
     930 数据库 
     931  932  933 索引 
     934 约束
     935 函数
     936 ......
     937 
     938 C : insert  
     939 R : select 
     940 U : update 
     941 D : delete 
     942 以上语句统称为DML -> 数据操纵语言 
     943 
     944 
     945 create 
     946 drop 
     947 alter
     948 以上语句统称DDL语句 -> 数据定义语言
     949 
     950 
     951 跨库操作表 : 只需要在表名上加上库.限定
     952 select * from company.employees;
     953 
     954 select 
     955     *
     956 from 
     957     country;
     958     
     959 使用用户变量
     960 set @var1 = 200;
     961 set @var1 = 'abc';
     962 
     963 -- 查询没有首都和官方语言的国家
     964 select 
     965     100, -- 常量 
     966     'abc',
     967     20 + 30 / (50 - 3), -- 常量
     968     @var1, -- 用户变量
     969     @@datadir, -- 系统变量
     970     database(), -- 函数
     971     now(),
     972     co.*, -- 普通列
     973     ci.*,
     974     cl.*
     975 from 
     976     country co 
     977 left join 
     978     city ci 
     979 on 
     980     co.capital = ci.id -- 联接条件
     981 left join 
     982     countrylanguage cl 
     983 on 
     984         co.code = cl.countrycode 
     985     and 
     986         cl.isofficial = 't'
     987 where 
     988         cl.language is null
     989     and 
     990         ci.name is null
     991 order by 
     992     co.name desc; 
     993 
     994     
     995 -- 查询亚洲国家的平均人口
     996 select 
     997     avg(population)
     998 from 
     999     country 
    1000 where 
    1001     continent = 'asia';
    1002 
    1003 -- 查询全球平均寿命最高和最低
    1004 select 
    1005     max(LifeExpectancy),
    1006     min(LifeExpectancy)
    1007 from 
    1008     country;
    1009     
    1010 max() 最大值 
    1011 min() 最小值 
    1012 avg() 平均值 
    1013 sum() 求和
    1014 count() 计数
    1015 
    1016 select 
    1017     sum(population),
    1018     count(capital)
    1019 from 
    1020     country;
    1021     
    1022 -- 查看表中的记录数
    1023 select 
    1024     count(*)
    1025 from 
    1026     country;
    1027     
    1028 -- 解决的问题类似于, 查看 各大洲 的情况.
    1029 select 
    1030     continent, -- 群体概念
    1031     max(name),
    1032     avg(surfacearea)
    1033 from 
    1034     country 
    1035 group by 
    1036     continent;
    1037     
    1038 -- 查看各地区的最大人口数
    1039 select
    1040     continent,
    1041     region,
    1042     max(population)
    1043 from 
    1044     country 
    1045 group by 
    1046     continent,
    1047     region;
    1048     
    1049 select
    1050     max(continent),
    1051     region,
    1052     max(population)
    1053 from 
    1054     country 
    1055 group by 
    1056     region
    1057 order by 
    1058     max(continent);
    1059 
    1060 
    1061 -- 查看各国的城市总人口数
    1062 select 
    1063     countrycode,
    1064     sum(population)
    1065 from 
    1066     city 
    1067 group by 
    1068     countrycode 
    1069 
    1070 select
    1071     name,
    1072     population,
    1073     sum(surfacearea)
    1074 from 
    1075     country 
    1076 group by 
    1077     name,
    1078     population;
    1079     
    1080 -- 对分组的结果进行过滤, 只能使用having    
    1081 select 
    1082     countrycode,
    1083     sum(population) sumPop
    1084 from 
    1085     city 
    1086 group by 
    1087     countrycode 
    1088 having
    1089     sumPop > 10000000
    1090 order by 
    1091     sumPop;
    1092 
    1093 -- 查看亚洲国家各省城市总人口和城市个数中城市总人口数大于100万的.
    1094 select 
    1095     co.name,
    1096     ci.district,
    1097     sum(ci.population) sumPop,
    1098     count(ci.id) cities
    1099 from 
    1100     country co 
    1101 join 
    1102     city ci 
    1103 on 
    1104     co.code = ci.countrycode 
    1105 where 
    1106     co.continent = 'asia'
    1107 group by 
    1108     co.name,
    1109     ci.district
    1110 having 
    1111     sumPop > 1000000
    1112 order by 
    1113     cities desc;
    1114     
    1115 解决SQL步骤 :     
    1116 1) 最基础的基表, from 
    1117 2) 考虑一张表的数据够不够, 如果不够进行连接 join 
    1118 3) 再考虑是外还是内, 如果是外还得考虑保证哪张表完整
    1119 4) 有join必须要有on 
    1120 5) 是否需要对当前的大基表进行基础的行过滤. where 
    1121 6) 是否需要分组, 分组依据的列是什么. group by 
    1122 7) 如果有分组,第一时间,把分组的列放在 select 后面, 并同时继续分析要选择哪些列或统计运算.
    1123 8) 是否要再对分组结果进行进一步过滤, 如果需要使用having
    1124 9) 是否需要排序, 如果需要使用order by .
    1125 
    1126 练习 : 
    1127 1 列出所有在超过10个国家中使用的语言。
    1128 select
    1129     language,
    1130     count(countrycode) ct
    1131 from 
    1132     countrylanguage
    1133 group by 
    1134     language 
    1135 having 
    1136     ct > 10;
    1137     
    1138 2 查询每个大洲各有多少种政府组织形式和每个大洲最富有的收入
    1139 select 
    1140     continent,
    1141     count(distinct GovernmentForm),
    1142     max(gnp)
    1143 from 
    1144     country 
    1145 group by 
    1146     continent;
    1147     
    1148     
    1149 3 列出不同的国家(country code)有居民超过7,000,000的城市, 它们有多少?
    1150 select 
    1151     countrycode,
    1152     count(*)
    1153 from 
    1154     city 
    1155 where 
    1156     population > 7000000 
    1157 group by 
    1158     countrycode;
    1159     
    1160 4 查询中国的每个省的总城市数量和总人口数
    1161 -- 能用where解决 不要用having解决.
    1162 select 
    1163     district,
    1164     count(*),
    1165     sum(population)
    1166 from 
    1167     city 
    1168 where 
    1169     countrycode = 'chn'
    1170 group by 
    1171     district
    1172 order by 
    1173     sum(population) desc;
    1174     
    1175 
    1176 select
    1177     countrycode,
    1178     district,
    1179     count(*),
    1180     sum(population)
    1181 from 
    1182     city 
    1183 group by 
    1184     countrycode,
    1185     district
    1186 having 
    1187     countrycode = 'chn'
    1188 order by 
    1189     sum(population) desc;
    1190     
    1191 5 Sweden国家说的是什么语言?
    1192 select 
    1193     co.name,
    1194     cl.language,
    1195     cl.isofficial
    1196 from 
    1197     countrylanguage cl 
    1198 join 
    1199     country co 
    1200 on 
    1201     cl.countrycode = co.code 
    1202 where 
    1203     co.name = 'sweden';
    1204     
    1205 6 哪些国家没有列出任何使用语言?
    1206 select 
    1207     co.name,
    1208     cl.language
    1209 from 
    1210     countrylanguage cl 
    1211 right join 
    1212     country co 
    1213 on 
    1214     cl.countrycode = co.code 
    1215 where 
    1216     cl.language is null;
    1217     
    1218 select 
    1219     co.name,
    1220     count(cl.language) ct 
    1221 from 
    1222     countrylanguage cl 
    1223 right join 
    1224     country co 
    1225 on 
    1226     cl.countrycode = co.code 
    1227 group by 
    1228     co.name 
    1229 having 
    1230     ct = 0;
    1231 
    1232 
    1233 7 列出在城市表中80%人口居住在城市的国家
    1234 select 
    1235     co.name,
    1236     sum(ci.population) / co.population rate
    1237 from 
    1238     country co 
    1239 join 
    1240     city ci 
    1241 on 
    1242     co.code = ci.countrycode 
    1243 group by
    1244     co.population,
    1245     co.name 
    1246 having 
    1247     rate > 0.8;
    1248     
    1249     
    1250     
    1251     
    1252 -- 子查询 : 解决一次查询不能解决的问题.
    1253 select 
    1254     name,
    1255     surfacearea,
    1256     continent
    1257 from 
    1258     country 
    1259 where surfacearea >
    1260                     (select 
    1261                         avg(surfacearea)
    1262                     from 
    1263                         country) 
    1264     
    1265 -- 子查询用在比较运算中时, 必须返回一行一列. 下面的SQL是错误的    
    1266 select 
    1267     name,
    1268     surfacearea,
    1269     continent
    1270 from 
    1271     country 
    1272 where surfacearea >
    1273                     (select 
    1274                         avg(surfacearea)
    1275                     from 
    1276                         country
    1277                     group by continent) 
    1278                     
    1279 -- 找出哪个城市的人口是最多的.
    1280 select 
    1281     countrycode,
    1282     name,
    1283     population
    1284 from 
    1285     city  
    1286 where     
    1287     population = (select max(population) from city);
    1288     
    1289 -- 找出平均寿命最高的和最低的国家.
    1290 select 
    1291     continent,
    1292     name,
    1293     lifeExpectancy
    1294 from 
    1295     country 
    1296 where 
    1297     lifeExpectancy in ( (select max(lifeExpectancy) from country),
    1298                         (select min(lifeExpectancy) from country))
    1299                         
    1300 -- 查看哪些国家的人口是大于本大洲平均人口.
    1301 select 
    1302     co1.name,
    1303     co1.continent,
    1304     co1.population,
    1305     co2.avgPop 
    1306 from 
    1307     country co1
    1308 join 
    1309     (select 
    1310         continent,
    1311         avg(population) avgPop
    1312     from 
    1313         country 
    1314     group by 
    1315         continent) co2
    1316 on 
    1317     co1.continent = co2.continent
    1318 where 
    1319     co1.population > co2.avgPop
    1320 order by  
    1321     continent;
    1322     
    1323 -- 创建数据库
    1324 create database if not exists school charset gbk;
    1325 
    1326 -- 修改数据库, 只能修改默认字符集
    1327 alter database school charset utf8;
    1328 
    1329 -- 丢弃数据库
    1330 drop database if exists school;
    1331 
    1332 -- 切换数据库
    1333 use school;
    1334 
    1335 
    1336 数据类型
    1337 int                4字节整数
    1338 bigint            8字节整数
    1339 char(长度)        定长字符串, 长度最大255, 在实际插入数据时, 如果长度不够, 会自动补齐.
    1340 varchar(长度)    变长字符串, 长度最大65535字节, 在实际插入数据时, 如果长度不够, 实际多少就占多少空间.
    1341 longtext        超长文本
    1342 double            8字节浮点数
    1343 decimal            多字节定点数
    1344 date            日期
    1345 time            时间
    1346 datetime        日期时间
    1347 timestamp        时间戳
    1348 
    1349 -- 创建表, 必须至少要有一个列
    1350 -- 主键 : 数据必须是非空且唯一.
    1351 create table if not exists teacher(
    1352     id int auto_increment, -- 将来这个列对应的数据可以自动生成. 必须作成主键
    1353     name varchar(20), -- varchar数据类型必须要有长度.
    1354     age int,
    1355     salary double,
    1356     gender enum('男', '女') default '男',
    1357     primary key(id) -- 表级主键
    1358 ) engine innodb charset utf8; -- 
    1359 
    1360 create table if not exists classes(
    1361     id int auto_increment,
    1362     name varchar(20) not null, -- not null 就是非空
    1363     room char(3),
    1364     begindate date,
    1365     master int, --班主任是一个整数, 将来是某个老师的id 
    1366     primary key(id)
    1367 );
    1368 
    1369 -- 创建学生表, id, name, age, gender, phone, class_id
    1370 create table if not exists student (
    1371     id int auto_increment,
    1372     name varchar(20),
    1373     age int,
    1374     gender enum('男', '女') default '男',
    1375     phone varchar(15),
    1376     class_id int,
    1377     primary key(id)
    1378 );
    1379 
    1380 insert into teacher(
    1381     name,
    1382     age,
    1383     salary,
    1384     gender
    1385 ) values (
    1386     '佟刚',
    1387     40,
    1388     2000,
    1389     '男'
    1390 );
    1391 
    1392 insert into teacher(
    1393     id,
    1394     name,
    1395     age,
    1396     salary,
    1397     gender
    1398 ) values (
    1399     null,
    1400     '芳芳',
    1401     20,
    1402     50000,
    1403     '女'
    1404 );
    1405 
    1406 
    1407 -- 基于子查询建表, 把虚表变成实表
    1408 create table country2
    1409 as select * from world.country; -- 复制表, 只是机械的把虚表变实, 不能复制约束(主键)
    1410 
    1411 -- 复制表结构建表, 没有数据
    1412 create table country3 
    1413 like world.country;
    1414 
    1415 
    1416 +----------+-----------------+------+-----+---------+----------------+
    1417 | Field    | Type            | Null | Key | Default | Extra          |
    1418 +----------+-----------------+------+-----+---------+----------------+
    1419 | id       | int(11)         | NO   | PRI | NULL    | auto_increment |
    1420 | name     | varchar(20)     | YES  |     | NULL    |                |
    1421 | age      | int(11)         | YES  |     | NULL    |                |
    1422 | gender   | enum('男','女') | YES  |     | 男      |                |
    1423 | phone    | varchar(15)     | YES  |     | NULL    |                |
    1424 | class_id | int(11)         | YES  |     | NULL    |                |
    1425 +----------+-----------------+------+-----+---------+----------------+
    1426 
    1427 insert into student(
    1428     name,
    1429     age,
    1430     phone,
    1431     class_id,
    1432     address 
    1433 ) values(
    1434     '小明',
    1435     20,
    1436     '2342342',
    1437     1,
    1438     '北京昌平'
    1439 );
    1440 
    1441 -- 修改表
    1442 alter table 表名 
    1443 -- 支持若干子名
    1444 
    1445 -- 添加新列
    1446 add column 新列名 数据类型(长度) 其他选项.
    1447 
    1448 alter table student 
    1449 add column address varchar(200) not null; -- 新列追加在所有列的最后.
    1450 
    1451 alter table student 
    1452 add column email varchar(50) after age; -- 在指定列后面添加新列
    1453 
    1454 alter table student 
    1455 add column cardNo char(18) first; -- 在最前面添加新列
    1456 
    1457 -- 修改列, 数据类型, 长度, 其他选项 
    1458 modify 列名 新数据类型(新长度) 新其他选项
    1459 
    1460 alter table student 
    1461 modify name varchar(10) not null;
    1462 
    1463 -- 重命名列
    1464 change 列名 新列名 新数据类型(新长度) 新其他选项;
    1465 
    1466 alter table student 
    1467 change phone mobile char(11) unique; -- unique就是唯一.
    1468 
    1469 -- 丢弃列
    1470 drop column 列名; -- 会导致删除的列所对应的所有数据全部丢失, 无法找回
    1471 
    1472 alter table student
    1473 drop column cardNo;
    1474 
    1475 -- 重新命名表
    1476 rename to 新表名
    1477 
    1478 alter table student 
    1479 rename to students;
    1480 
    1481 alter table teacher 
    1482 rename to teachers;
    1483 
    1484 -- 修改约束
    1485 以上都是alter table 的子句, 用于修改表
    1486 ---------------------------------------------------------------
    1487 
    1488 -- 丢弃表 操作很危险, 如果没有数据备份, 就永远找不回来.
    1489 drop table 表名;
    1490 
    1491 -- 丢弃表时可以批量丢弃
    1492 drop table country2, country3;
    1493 
    1494 -- 清空表 DDL, 表中数据不能恢复. 效率高
    1495 truncate table 表名;
    1496 
    1497 delete 是DML, 是可以后悔的. 效率低.
    1498 
    1499 
    1500 insert into teachers(
    1501     name,
    1502     age,
    1503     salary,
    1504     gender
    1505 ) values (
    1506     '红康',
    1507     30,
    1508     3000,
    1509     '男'
    1510 );
    1511 
    1512 insert into teachers(
    1513     name,
    1514     age,
    1515     salary,
    1516     gender
    1517 ) value (
    1518     '小柴',
    1519     20,
    1520     5000,
    1521     '女'
    1522 );
    1523 
    1524 insert into teachers(
    1525     name,
    1526     age,
    1527     salary,
    1528     gender
    1529 ) values (
    1530     '贺飞',
    1531     35,
    1532     4000,
    1533     '男'
    1534 ), (
    1535     '老韩',
    1536     40,
    1537     3000,
    1538     '男'
    1539 ), (
    1540     '安妮',
    1541     32,
    1542     6000,
    1543     '女'
    1544 );
    1545 
    1546 -- 不建议这样的写法. 因为它强烈依赖表的结构,如果表的结构发生变化, 下面的语句就容易失败!
    1547 insert into teachers values(
    1548     null,
    1549     '小邱',
    1550     40,
    1551     7000,
    1552     '男'
    1553 );
    1554 
    1555 +-----------+-------------+------+-----+---------+----------------+
    1556 | Field     | Type        | Null | Key | Default | Extra          |
    1557 +-----------+-------------+------+-----+---------+----------------+
    1558 | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
    1559 | name      | varchar(20) | NO   |     | NULL    |                |
    1560 | room      | char(3)     | YES  |     | NULL    |                |
    1561 | begindate | date        | YES  |     | NULL    |                |
    1562 | master    | int(11)     | YES  |     | NULL    |                |
    1563 +-----------+-------------+------+-----+---------+----------------+
    1564 
    1565 insert into classes (
    1566     name,
    1567     room,
    1568     begindate,
    1569     master 
    1570 ) values (
    1571     'Java0725',
    1572     '305',
    1573     now(), -- 值的部分可以使用函数调用
    1574     2
    1575 );
    1576 
    1577 -- 实现表的完全克隆!!!
    1578 create table if not exists country2 like world.country;
    1579 
    1580 -- 基于子查询插入数据, 好处就是一次性插入多条记录.
    1581 insert into country2 
    1582 select * from world.country;
    1583 
    1584 
    1585 -- 事务 : 一组DML, 在执行时, 要么全部失败, 要么全部成功, 使得数据从一种状态转换为另一种状态. 数据没有丢失!!
    1586 
    1587 A Atomic 原子性             所有操作不可分割.
    1588 C Consistence 一致性        数据在事务前和事务后数据是一致的.
    1589 I ISOLATION    独立性             不同事务之间具有隔离性
    1590 D Duration    持久性            事务一旦提交, 永久生效.
    1591 
    1592 DCL : 数据控制语言 : commit, rollback, grant, revoke...
    1593 
    1594 显式启动事务 : 
    1595     set autocommit = false;
    1596     set @@autocommit = off;
    1597     
    1598     多条DML语句;
    1599     
    1600     commit; 事务提交, 成功
    1601     rollback; 事务回滚, 失败
    1602     ddl语句执行 : 事务提交
    1603     会话正常结束 提交
    1604     异常结束 : 回滚
    1605     
    1606     
    1607     还原设置
    1608     set autocommit = true;
    1609     set @@autocommit = on;
    1610     
    1611 
    1612 考试
    1613 1 哪些国家没有列出任何使用语言?(2种做法)
    1614 select 
    1615     co.name,
    1616     co.continent,
    1617     cl.language
    1618 from 
    1619     countrylanguage cl 
    1620 right join 
    1621     country  co 
    1622 on 
    1623     cl.countrycode = co.code 
    1624 where 
    1625     cl.language is null;
    1626     
    1627 select 
    1628     co.name,
    1629     count(cl.language) ct 
    1630 from 
    1631     country co 
    1632 left join 
    1633     countrylanguage cl 
    1634 on 
    1635     co.code = cl.countrycode 
    1636 group by 
    1637     co.name
    1638 having 
    1639     ct = 0;
    1640 
    1641 2 列出在城市表中80%人口居住在城市的国家
    1642 select 
    1643     co.name,
    1644     sum(ci.population) / max(co.population) rate
    1645 from 
    1646     country  co 
    1647 join 
    1648     city ci 
    1649 on 
    1650     co.code = ci.countrycode 
    1651 group by 
    1652     co.name 
    1653 having 
    1654     rate > 0.8;
    1655 
    1656 3 查询所有国家的首都和官方语言
    1657 select 
    1658     co.name country,
    1659     ci.name capital,
    1660     cl.language
    1661 from 
    1662     country co 
    1663 left join 
    1664     city ci 
    1665 on 
    1666     co.capital = ci.id 
    1667 left join 
    1668     countrylanguage cl 
    1669 on 
    1670         co.code = cl.countrycode 
    1671     and
    1672         cl.isofficial = 't';
    1673 
    1674 
    1675 4 查询亚洲国家的各省的总城市数量和平均人口数, 哪些平均人口大于50万, 降序显示总城市数量.
    1676 select 
    1677     co.name,
    1678     ci.district,
    1679     count(*),
    1680     avg(ci.population) avgPop 
    1681 from 
    1682     city ci 
    1683 join 
    1684     country co 
    1685 on 
    1686     ci.countrycode = co.code
    1687 where 
    1688     co.continent = 'asia'
    1689 group by 
    1690     co.name,
    1691     ci.district 
    1692 having 
    1693     avgPop > 500000
    1694 order by 
    1695     count(*) desc;
    1696 
    1697 5 哪些欧洲城市的人口小于本省的平均城市人口.
    1698 select     
    1699     t2.countryName,
    1700     ci1.name,
    1701     ci1.district,
    1702     ci1.population,
    1703     t2.avgPop
    1704 from 
    1705     city ci1
    1706 join 
    1707     (select 
    1708         co.name countryName,
    1709         co.code,
    1710         ci.district,
    1711         avg(ci.population) avgPop
    1712     from 
    1713         city ci 
    1714     join 
    1715         country co 
    1716     on 
    1717         ci.countrycode = co.code 
    1718     where 
    1719         co.continent = 'europe'
    1720     group by 
    1721         co.name,
    1722         co.code,
    1723         ci.district) t2
    1724 on 
    1725         ci1.district = t2.district
    1726     and 
    1727         ci1.countrycode = t2.code 
    1728 where 
    1729     ci1.population < t2.avgPop;
    1730 
    1731 
    1732 select 
    1733     concat(ifnull(employee_id,"Q"), ",",
    1734             ifnull(first_name,"Q"), ",",
    1735             ifnull(last_name,"Q"), ",",
    1736             ifnull(email,"Q"), ",",
    1737             ifnull(phone_number,"Q"), ",",
    1738             ifnull(job_id,"Q"), ",",
    1739             ifnull(salary,"Q"), ",",
    1740             ifnull(commission_pct,"Q"), ",",
    1741             ifnull(manager_id,"Q"), ",",
    1742             ifnull(department_id,"Q")) OUT_PUT
    1743 from 
    1744     company.employees;
    1745     
    1746     
    1747 select 
    1748     e1.first_name empName,
    1749     e1.employee_id empId,
    1750     e2.first_name managerName,
    1751     e2.employee_id mangerId
    1752 from 
    1753     company.employees e1 
    1754 left join 
    1755     company.employees e2 
    1756 on 
    1757     e1.manager_id = e2.employee_id
    1758 where 
    1759     e1.employee_id = 101;
    1760 
    1761 
    1762 事务 : 保证数据的一致性.
    1763 开启事务 : 
    1764     set autocommit = false;
    1765     
    1766 事务组成 : 
    1767     DML....
    1768     
    1769 事务结束 :
    1770     1) 执行了commit或rollback这样的DCL语句. commit表示成功, rollback表示失败
    1771     2) 执行了DDL语句, 会导致事务commit
    1772     3) 会话(session)正常结束, 会导致事务commit 
    1773     4) 会话(session)异常结束, 会导致事务rollback; 
    1774     
    1775 DDL 数据定义语言 : 
    1776 create 
    1777 alter 
    1778 drop 
    1779 truncate 
    1780 
    1781 A 原子性 : 组成事务的多个DML不可分割.
    1782 C 一致性 : 数据在事务前和后保持一致
    1783 I 独立性 : 事务之间是互相隔离的.
    1784 D 持久性 : 事务一旦提交,数据更改就持久.
    1785 
    1786 
    1787 预编译有2个好处:除了提供执行的方便外,预处理语句还能提高性能
    1788 
    1789 prepare 预编译对象名 from 'SQL';
    1790 
    1791 prepare p1 from '
    1792     select * from teachers
    1793 ';
    1794 
    1795 执行预编译
    1796 execute p1;
    1797 
    1798 sql中的?相当于方法中的形参, ?在SQL中只能替换值的部分.
    1799 prepare p2 from '
    1800     insert into classes(
    1801         name,
    1802         room,
    1803         begindate,
    1804         master 
    1805     ) values (
    1806         ?,
    1807         ?,
    1808         ?,
    1809         ?
    1810     )
    1811 ';
    1812 
    1813 如果sql中有?, 必须使用用户变量来传值
    1814 set @name='BigData0621', @r='306', @b='2020-06-21', @master=2;
    1815 
    1816 执行预编译时使用变量, 用户变量就相当于方法调用时的实参.
    1817 execute p2 using @name,@r,@b,@master;
    1818 
    1819 丢弃预编译
    1820 drop prepare p1;
    1821 
    1822 -- 如果在sql中也有', 必须要使用''来进行转义.
    1823 prepare p2 from '
    1824     insert into classes(
    1825         name,
    1826         room,
    1827         begindate,
    1828         master 
    1829     ) values (
    1830         ?,
    1831         ''301'',
    1832         now(),
    1833         ?
    1834     )
    1835 ';
    1836 
    1837 
    1838 为了保证数据的一致性和完整性,SQL规范以约束的方式对表数据进行额外的条件限制。
    1839 
    1840 
    1841 有以下六种约束:
    1842 NOT NULL 非空约束,规定某个字段不能为空
    1843 UNIQUE  唯一约束,规定某个字段在整个表中是唯一的
    1844 PRIMARY KEY  主键(非空且唯一), 一张表只允许有一个主键
    1845 FOREIGN KEY  外键
    1846 DEFAULT  默认值, 只能写成列级的.
    1847 
    1848 create table if not exists test(
    1849     id int primary key, -- 可以写成表级, 最好写成表级
    1850     name varchar(20) unique, -- 可以写成表级, 最好写成表级
    1851     age int not null, -- 必须是写成列级
    1852     gender enum('男', '女') default '男', -- 必须写成列级
    1853     email varchar(20)
    1854 );
    1855 
    1856 insert into test(
    1857     id,
    1858     name,
    1859     age
    1860 ) values (
    1861     1,
    1862     null,
    1863     20
    1864 );
    1865 
    1866 insert into test(
    1867     id,
    1868     name,
    1869     age
    1870 ) values (
    1871     2,
    1872     null,
    1873     20
    1874 );
    1875 
    1876 create table if not exists test2(
    1877     id int,
    1878     name varchar(20), -- 可以写成表级, 最好写成表级
    1879     age int not null, -- 必须是写成列级
    1880     gender enum('男', '女') default '男', -- 必须写成列级
    1881     email varchar(20),
    1882     primary key(id, email), -- 联合主键, 两个列的组合值要 唯一且非空.
    1883     unique(name)
    1884 );
    1885 
    1886 insert into test2(
    1887     id,
    1888     name,
    1889     age,
    1890     email
    1891 ) values (
    1892     1,
    1893     null,
    1894     20,
    1895     'aa'
    1896 );
    1897 
    1898 insert into test2(
    1899     id,
    1900     name,
    1901     age,
    1902     email
    1903 ) values (
    1904     2,
    1905     null,
    1906     20,
    1907     'aa'
    1908 );
    1909 
    1910 丢弃主键
    1911 alter table test2
    1912 drop primary key;
    1913 
    1914 添加主键
    1915 alter table test2 
    1916 add primary key(id)
    1917 
    1918 -- 查询班级及班主任信息
    1919 select 
    1920     c.*,
    1921     t.*
    1922 from 
    1923     classes c 
    1924 left join 
    1925     teachers t 
    1926 on 
    1927     c.master = t.id;
    1928     
    1929 create table if not exists teacher(
    1930     id int auto_increment, -- 将来这个列对应的数据可以自动生成. 必须作成主键
    1931     name varchar(20), -- varchar数据类型必须要有长度.
    1932     age int,
    1933     salary double,
    1934     gender enum('男', '女') default '男',
    1935     primary key(id) -- 表级主键
    1936 ); 
    1937 
    1938 drop table if exists classes;
    1939 create table if not exists classes(
    1940     id int auto_increment,
    1941     name varchar(20) not null, -- not null 就是非空
    1942     room char(3),
    1943     begindate date,
    1944     master int, -- 班主任是一个整数, 将来是某个老师的id, 为了强制要求, 必须给它加上外键
    1945     primary key(id),
    1946     -- foreign key(本表的外键的列) references 父表(父表的主键)
    1947     foreign key(master) references teachers(id)
    1948 );
    1949 
    1950 set @name='h50727', @master=2;
    1951 
    1952 set @name='bigdata0727', @master=20;
    1953 
    1954 一旦使用了外键约束, 子表插入数据时必须要参考父表的记录, 会导致效率降低.
    1955 
    1956 在删除父表被引用的记录时, 也无法直接删除!!!
    1957 delete from teachers where id = 2;
    1958 
    1959 -- 丢弃外键, 必须要提供外键名称.
    1960 -- 查看外键名
    1961 show create table classes;
    1962 
    1963 alter table classes drop foreign key `classes_ibfk_1`;
    1964 
    1965 -- 添加外键
    1966 alter table classes 
    1967 -- add constraint fk foreign key(master) references teachers(id) on delete cascade; 
    1968 -- set null(子表中的引用值置空) 
    1969 -- do nothing(不允许删除父表记录) 
    1970 -- cascade(级联);
    1971 add constraint fk foreign key(master) references teachers(id) on delete set null;
    1972 
    1973 limit 作用就是在最终显示时再一次限制虚表的记录数
    1974 select * from world.city limit 0, 10; // 1页
    1975 select * from world.city limit 10, 10;
    1976 select * from world.city limit 20, 10; -- 20略过前20个, 最终显示10个
    1977 select * from world.city limit 80, 10; // 9页
    1978 
    1979 SELECT * FROM table LIMIT (PageNo - 1)*PageSize, PageSize;
  • 相关阅读:
    redhat7 安装 mysql5.7
    python django 网站局域网问
    SQLiteStudio
    升级gcc到gcc-8.1.0
    [SAP HANA ]fulltext index
    [ORACLE] SNC 学习
    [oracle]sqlplus 输出格式化print_table学习
    win-->linux 文本转换
    [ORACLE]ORA-03113: end-of-file on communication channel
    ORACLE 在线重定义分区表
  • 原文地址:https://www.cnblogs.com/shui68home/p/13387154.html
Copyright © 2011-2022 走看看