Explorar el Código

更新了Linux和数据库文档

jackfrued hace 7 años
padre
commit
0da68f50a0
Se han modificado 2 ficheros con 477 adiciones y 199 borrados
  1. 235 44
      Day31-35/玩转Linux操作系统.md
  2. 242 155
      Day36-40/关系型数据库MySQL.md

+ 235 - 44
Day31-35/玩转Linux操作系统.md

@@ -655,12 +655,45 @@ Linux系统的命令通常都是如下所示的格式:
 #### 磁盘管理
 
 1. 列出文件系统的磁盘使用状况 - **df**。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# df -h
+   Filesystem      Size  Used Avail Use% Mounted on
+   /dev/vda1        40G  5.0G   33G  14% /
+   devtmpfs        486M     0  486M   0% /dev
+   tmpfs           497M     0  497M   0% /dev/shm
+   tmpfs           497M  356K  496M   1% /run
+   tmpfs           497M     0  497M   0% /sys/fs/cgroup
+   tmpfs           100M     0  100M   0% /run/user/0
+   ```
+
 2. 磁盘分区表操作 - **fdisk**。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# fdisk -l
+   Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
+   Units = sectors of 1 * 512 = 512 bytes
+   Sector size (logical/physical): 512 bytes / 512 bytes
+   I/O size (minimum/optimal): 512 bytes / 512 bytes
+   Disk label type: dos
+   Disk identifier: 0x000a42f4
+      Device Boot      Start         End      Blocks   Id  System
+   /dev/vda1   *        2048    83884031    41940992   83  Linux
+   Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
+   Units = sectors of 1 * 512 = 512 bytes
+   Sector size (logical/physical): 512 bytes / 512 bytes
+   I/O size (minimum/optimal): 512 bytes / 512 bytes
+   ```
+
 3. 格式化文件系统 - **mkfs**。
+
 4. 文件系统检查 - **fsck**。
+
 5. 挂载/卸载 - **mount** / **umount**。
 
-### 编辑器vim
+### 编辑器 - vim
 
 1. 启动vim。可以通过`vi`或`vim`命令来启动vim,启动时可以指定文件名来打开一个文件,如果没有指定文件名,也可以在保存的时候指定文件名。
 
@@ -759,19 +792,11 @@ Linux系统的命令通常都是如下所示的格式:
 
        ![](./res/vim-macro.png)
 
-### 环境变量
-
-1. HOME
-2. SHELL
-3. HISTSIZE
-4. RANDOM
-5. PATH
-
 ### 软件安装和配置
 
 #### 使用包管理工具
 
-1. yum - Yellowdog Updater Modified。
+1. **yum** - Yellowdog Updater Modified。
    - `yum search`:搜索软件包,例如`yum search nginx`。
    - `yum list installed`:列出已经安装的软件包,例如`yum list installed | grep zlib`。
    - `yum install`:安装软件包,例如`yum install nginx`。
@@ -779,7 +804,7 @@ Linux系统的命令通常都是如下所示的格式:
    - `yum update`:更新软件包,例如`yum update`可以更新所有软件包,而`yum update tar只会更新tar。
    - `yum check-update`:检查有哪些可以更新的软件包。
    - `yum info`:显示软件包的相关信息,例如`yum info nginx`。
-2. rpm - Redhat Package Manager。
+2. **rpm** - Redhat Package Manager。
    - 安装软件包:`rpm -ivh <packagename>.rpm`。
    - 移除软件包:`rpm -e <packagename>`。
    - 查询软件包:`rpm -qa`,例如可以用`rpm -qa | grep mysql`来检查是否安装了MySQL相关的软件包。
@@ -823,6 +848,14 @@ Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, P
 nginx version: nginx/1.12.2
 ```
 
+移除Nginx。
+
+```Shell
+
+[root@iZwz97tbgo9lkabnat2lo8Z ~]# nginx -s stop
+[root@iZwz97tbgo9lkabnat2lo8Z ~]# yum -y remove nginx
+```
+
 下面以MySQL为例,演示如何使用rpm安装软件。要安装MySQL需要先到[MySQL官方网站](https://www.mysql.com/)下载对应的[RPM文件](https://dev.mysql.com/downloads/mysql/),当然要选择和你使用的Linux系统对应的版本。MySQL现在是Oracle公司旗下的产品,在MySQL被收购后,MySQL的作者重新制作了一个MySQL的分支MariaDB,可以通过yum进行安装。如果要安装MySQL需要先通过yum删除`mariadb-libs`这个可能会跟MySQL底层库冲突的库,然后还需要安装一个名为`libaio`的依赖库。
 
 ```Shell
@@ -834,26 +867,19 @@ mysql-community-libs-5.7.22-1.el7.x86_64.rpm
 mysql-community-server-5.7.22-1.el7.x86_64.rpm
 [root@iZwz97tbgo9lkabnat2lo8Z mysql]# yum -y remove mariadb-libs
 [root@iZwz97tbgo9lkabnat2lo8Z mysql]# yum -y install libaio
-[root@iZwz97tbgo9lkabnat2lo8Z mysql]# rpm -ivh mysql-community-common-5.7.22-1.el7.x86_64.rpm
-warning: mysql-community-common-5.7.22-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
-Preparing...                          ################################# [100%]
-        package mysql-community-common-5.7.22-1.el7.x86_64 is already installed
-[root@iZwz97tbgo9lkabnat2lo8Z mysql]# rpm -ivh mysql-community-libs-5.7.22-1.el7.x86_64.rpm
-warning: mysql-community-libs-5.7.22-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
-Preparing...                          ################################# [100%]
-        package mysql-community-libs-5.7.22-1.el7.x86_64 is already installed
-[root@iZwz97tbgo9lkabnat2lo8Z mysql]# rpm -ivh mysql-community-client-5.7.22-1.el7.x86_64.rpm
+[root@iZwz97tbgo9lkabnat2lo8Z mysql]# ls | xargs rpm -ivh
 warning: mysql-community-client-5.7.22-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
 Preparing...                          ################################# [100%]
-        package mysql-community-client-5.7.22-1.el7.x86_64 is already installed
-[root@iZwz97tbgo9lkabnat2lo8Z mysql]# rpm -ivh mysql-community-server-5.7.22-1.el7.x86_64.rpm
-warning: mysql-community-server-5.7.22-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
-Preparing...                          ################################# [100%]
-        package mysql-community-server-5.7.22-1.el7.x86_64 is already installed
-[root@iZwz97tbgo9lkabnat2lo8Z mysql]# mysqld --version
-mysqld  Ver 5.7.22 for Linux on x86_64 (MySQL Community Server (GPL))
-[root@iZwz97tbgo9lkabnat2lo8Z mysql]# mysql --version
-mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper
+...
+```
+
+> 说明:由于MySQL和[MariaDB](https://mariadb.org/)的底层依赖库是有冲突的,所以上面我们首先用`yum`移除了名为mariadb-libs的依赖库并安装了名为libaio的依赖库。由于我们将安装MySQL所需的rpm文件放在一个独立的目录中,所以可以通过`ls`命令查看到安装文件并用`xargs`将`ls`的输出作为参数交给`rpm -ivh`来进行安装。关于MySQL和MariaDB之间的关系,可以阅读[维基百科](https://zh.wikipedia.org/wiki/MariaDB)上关于MariaDB的介绍。
+
+移除安装的MySQL。
+
+```Shell
+
+[root@iZwz97tbgo9lkabnat2lo8Z ~]# rpm -qa | grep mysql | xargs rpm -e
 ```
 
 #### 下载解压配置环境变量
@@ -957,15 +983,6 @@ build environment:
    redis-cli 3.2.12
    ```
 
-### 进程和性能
-
-1. top
-2. pmap
-3. sar
-4. free
-5. iostat
-6. gprof
-
 ### 配置服务
 
 1. 启动服务。
@@ -1014,16 +1031,45 @@ build environment:
 
    ```Shell
    
-   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# crontab -e
+   * * * * * echo "hello, world!" >> /root/hello.txt
+   59 23 * * * rm -f /root/*.log
    ```
+   > 说明:输入`crontab -e`命令会打开vim来编辑Cron表达式并指定触发的任务,上面我们定制了两个计划任务,一个是每分钟向/root目录下的hello.txt中追加输出`hello, world!`;另一个是每天23时59分执行删除/root目录下以log为后缀名的文件。如果不知道Cron表达式如何书写,可以参照/etc/crontab文件中的提示(下面会讲到)或者用谷歌或百度搜索一下,也可以使用Cron表达式在线生成器来生成Cron表达式。
 
 2. crontab相关文件。
 
    ```Shell
    
-   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# cd /etc
+   [root@iZwz97tbgo9lkabnat2lo8Z etc]# ls -l | grep cron
+   -rw-------.  1 root root      541 Aug  3  2017 anacrontab
+   drwxr-xr-x.  2 root root     4096 Mar 27 11:56 cron.d
+   drwxr-xr-x.  2 root root     4096 Mar 27 11:51 cron.daily
+   -rw-------.  1 root root        0 Aug  3  2017 cron.deny
+   drwxr-xr-x.  2 root root     4096 Mar 27 11:50 cron.hourly
+   drwxr-xr-x.  2 root root     4096 Jun 10  2014 cron.monthly
+   -rw-r--r--   1 root root      493 Jun 23 15:09 crontab
+   drwxr-xr-x.  2 root root     4096 Jun 10  2014 cron.weekly
+   [root@iZwz97tbgo9lkabnat2lo8Z etc]# vim crontab
+     1 SHELL=/bin/bash
+     2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
+     3 MAILTO=root
+     4
+     5 # For details see man 4 crontabs
+     6
+     7 # Example of job definition:
+     8 # .---------------- minute (0 - 59)
+     9 # |  .------------- hour (0 - 23)
+    10 # |  |  .---------- day of month (1 - 31)
+    11 # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
+    12 # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
+    13 # |  |  |  |  |
+    14 # *  *  *  *  * user-name  command to be executed
    ```
 
+   通过修改`/etc`目录下的crontab文件也能够定制计划任务。
+
 ### 网络访问和管理
 
 1. 通过网络获取资源 - **wget**。
@@ -1116,13 +1162,158 @@ build environment:
 
    - `bye`/`exit`/`quit`:退出sftp。
 
+### 进程管理
+
+1. **ps** - 查询进程。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# ps -ef
+   UID        PID  PPID  C STIME TTY          TIME CMD
+   root         1     0  0 Jun23 ?        00:00:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
+   root         2     0  0 Jun23 ?        00:00:00 [kthreadd]
+   ...
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# ps -ef | grep mysqld
+   root      4943  4581  0 22:45 pts/0    00:00:00 grep --color=auto mysqld
+   mysql    25257     1  0 Jun25 ?        00:00:39 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
+   ```
+
+2. **kill** - 终止进程。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# kill 1234
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# kill -9 1234
+   ```
+
+   例子:用一条命令强制终止正在运行的Redis进程。
+
+    ```Shell
+   
+   ps -ef | grep redis | grep -v grep | awk '{print $2}' | xargs kill
+    ```
+
+3. 将进程置于后台运行。
+
+   - `Ctrl+Z`
+   - `&`
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# mongod &
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# redis-server
+   ...
+   ^Z
+   [4]+  Stopped                 redis-server
+   ```
+
+4. **jobs** - 查询后台进程。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# jobs
+   [2]   Running                 mongod &
+   [3]-  Stopped                 cat
+   [4]+  Stopped                 redis-server
+   ```
+
+5. **bg** - 让进程在后台继续运行。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# bg %4
+   [4]+ redis-server &
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# jobs
+   [2]   Running                 mongod &
+   [3]+  Stopped                 cat
+   [4]-  Running                 redis-server &
+   ```
+
+6. **fg** - 将后台进程置于前台。
+
+    ```Shell
+      
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# fg %4
+   redis-server
+   ^C5554:signal-handler (1530025281) Received SIGINT scheduling shutdown...
+   5554:M 26 Jun 23:01:21.413 # User requested shutdown...
+   5554:M 26 Jun 23:01:21.413 * Saving the final RDB snapshot before exiting.
+   5554:M 26 Jun 23:01:21.415 * DB saved on disk
+   5554:M 26 Jun 23:01:21.415 # Redis is now ready to exit, bye bye...
+    ```
+
+      > 说明:置于前台的进程可以使用`Ctrl+C`来终止它。
+
+7. **top** - 进程监控。
+
+    ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# top
+   top - 23:04:23 up 3 days, 14:10,  1 user,  load average: 0.00, 0.01, 0.05
+   Tasks:  65 total,   1 running,  64 sleeping,   0 stopped,   0 zombie
+   %Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
+   KiB Mem :  1016168 total,   191060 free,   324700 used,   500408 buff/cache
+   KiB Swap:        0 total,        0 free,        0 used.   530944 avail Mem
+   ...
+    ```
+
+### 系统性能
+
+1. 查看系统活动信息 - **sar**。
+
+2. 查看内存使用情况 - **free**。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# free
+                 total        used        free      shared  buff/cache   available
+   Mem:        1016168      323924      190452         356      501792      531800
+   Swap:             0           0           0
+   ```
+
+3. 查看进程使用内存状况 - **pmap**。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# ps
+     PID TTY          TIME CMD
+    4581 pts/0    00:00:00 bash
+    5664 pts/0    00:00:00 ps
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# pmap 4581
+   4581:   -bash
+   0000000000400000    884K r-x-- bash
+   00000000006dc000      4K r---- bash
+   00000000006dd000     36K rw--- bash
+   00000000006e6000     24K rw---   [ anon ]
+   0000000001de0000    400K rw---   [ anon ]
+   00007f82fe805000     48K r-x-- libnss_files-2.17.so
+   00007f82fe811000   2044K ----- libnss_files-2.17.so
+   ...
+   ```
+
+4. 报告设备CPU和I/O统计信息 - **iostat**。
+
+   ```Shell
+   
+   [root@iZwz97tbgo9lkabnat2lo8Z ~]# iostat
+   Linux 3.10.0-693.11.1.el7.x86_64 (iZwz97tbgo9lkabnat2lo8Z)      06/26/2018      _x86_64_       (1 CPU)
+   avg-cpu:  %user   %nice %system %iowait  %steal   %idle
+              0.79    0.00    0.20    0.04    0.00   98.97
+   Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
+   vda               0.85         6.78        21.32    2106565    6623024
+   vdb               0.00         0.01         0.00       2088          0
+   ```
 
 ### Shell和Shell编程
 
+#### 环境变量
+
+1. HOME
+2. SHELL
+3. HISTSIZE
+4. RANDOM
+5. PATH
+
 
 
-### 其他内容
 
-1. awk
-2. sed
-3. xargs

+ 242 - 155
Day36-40/关系型数据库MySQL.md

@@ -9,12 +9,16 @@
    - 具体表象:用二维表(有行和列)组织数据。
    - 编程语言:结构化查询语言(SQL)。
 4. E-R图。
+   - 实体 - 矩形框
+   - 属性 - 椭圆框
+   - 关系 - 菱形框
+   - 重数 - 1:1 / 1:N / M:N
 5. 关系型数据库产品。
-   - Oracle
-   - DB2
-   - SQL Server
-   - MySQL
-   - SQLite
+   - [Oracle](https://www.oracle.com/index.html)
+   - [DB2](https://www.ibm.com/analytics/us/en/db2/)
+   - [SQL Server](https://www.microsoft.com/en-us/sql-server/)
+   - [MySQL](https://www.mysql.com/)
+   - [SQLite](https://www.sqlite.org/index.html)
 
 ### MySQL简介
 
@@ -27,120 +31,164 @@
 
    ```SQL
    
-   -- 如果存在SRS数据库就删除
+   -- 创建数据库SRS
    drop database if exists SRS;
-   
-   -- 创建学生选课系统数据库SRS并指定默认字符集为UTF8
    create database SRS default charset utf8;
    
-   -- 切换至SRS数据库
+   -- 切换到SRS
    use SRS;
    
-   -- 查看当前数据库中所有表
-   show tables;
+   -- 创建学院表
+   create table tb_college
+   (
+   collid int not null auto_increment comment '学院编号',
+   collname varchar(50) not null comment '学院名称',
+   collmaster varchar(20) not null comment '院长姓名',
+   collweb varchar(511) default '' comment '学院网站',
+   primary key (collid)
+   );
+   
+   -- 添加唯一性约束
+   alter table tb_college add constraint uni_college_collname unique (collname);
+   -- alter table tb_college drop index uni_college_collname;
    
-   -- 创建学生表TbStudent
-   create table TbStudent
+   -- 创建学生表
+   create table tb_student
    (
-   stuid integer not null,
-   stuname varchar(20) not null,
-   stusex bit default 1,
-   stubirth datetime not null,
-   stutel char(11),
-   stuaddr varchar(255),
-   stuphoto longblob,
+   stuid int not null comment '学号',
+   stuname varchar(20) not null comment '学生姓名',
+   stusex bit default 1 comment '性别',
+   stubirth date not null comment '出生日期',
+   stuaddr varchar(255) default '' comment '籍贯',
+   collid int not null comment '所属学院编号',
    primary key (stuid)
    );
    
-   -- 修改学生表删除stutel列
-   alter table TbStudent drop column stutel;
+   -- 添加外键约束
+   alter table tb_student add constraint fk_student_collid foreign key (collid) references tb_college (collid);
+   
+   -- 创建教师表
+   create table tb_teacher
+   (
+   teacherid int not null comment '教师工号',
+   tname varchar(20) not null comment '教师姓名',
+   ttitle varchar(10) default '' comment '职称',
+   collid int not null comment '所属学院编号'
+   );
    
-   -- 查看学生表结构
-   desc TbStudent;
+   -- 添加主键约束
+   alter table tb_teacher add constraint pk_teacher primary key (teacherid);
    
-   -- 如果表TbCourse已经存在就删除它
-   drop table if exists TbCourse;
+   -- 添加外键约束
+   alter table tb_teacher add constraint fk_teacher_collid foreign key (collid) references tb_college (collid);
    
-   -- 创建课程表TbCourse
-   create table TbCourse
+   -- 创建课程表
+   create table tb_course
    (
-   cosid integer not null,
-   cosname varchar(50) not null,
-   coscredit tinyint not null,
-   cosintro varchar(255)
+   courseid int not null comment '课程编号',
+   cname varchar(50) not null comment '课程名称',
+   ccredit tinyint not null comment '学分',
+   tid int not null comment '教师工号',
+   primary key (courseid)
    );
    
-   -- 给课程表设置主键约束
-   alter table TbCourse add constraint pk_course primary key (cosid);
+   -- 添加外键约束
+   alter table tb_course add constraint fk_course_tid foreign key (tid) references tb_teacher (teacherid);
    
-   -- 创建学生选课记录TbSC
-   create table TbSC
+   -- 创建学生选课表
+   create table tb_score
    (
-   scid integer primary key auto_increment,
-   sid integer not null,
-   cid integer,
-   scdate datetime not null,
-   score float
+   scid int not null auto_increment comment '选课编号',
+   sid int not null comment '学号',
+   cid int not null comment '课程编号',
+   selectdate datetime comment '选课时间日期',
+   score decimal(4,1) comment '考试成绩',
+   primary key (scid)
    );
    
-   -- 给表TbSC添加外键约束
-   alter table TbSC add constraint fk_sid foreign key (sid) references TbStudent (stuid) on delete cascade on update cascade;
-   alter table TbSC add constraint fk_cid foreign key (cid) references TBCourse (cosid);
+   -- 添加检查约束(MySQL中检查约束不生效)
+   alter table tb_score add constraint ck_score_score check (score between 0 and 100);
+   
+   -- 添加外键约束
+   alter table tb_score add constraint fk_score_sid foreign key (sid) references tb_student (stuid);
+   alter table tb_score add constraint fk_score_cid foreign key (cid) references tb_course (courseid);
    ```
 
 2. DML
 
    ```SQL
    
-   -- 添加学生记录
-   insert into TbStudent values (1001, '张三丰', default, '1978-1-1', '成都市一环路西二段17号', null);
-   insert into TbStudent (stuid, stuname, stubirth) values (1002, '郭靖', '1980-2-2');
-   insert into TbStudent (stuid, stuname, stusex, stubirth, stuaddr) values (1003, '黄蓉', 0, '1982-3-3', '成都市二环路南四段123号');
-   insert into TbStudent values (1004, '张无忌', 1, '1990-4-4', null, null);
-   insert into TbStudent values 
-   (1005, '丘处机', 1, '1983-5-5', '北京市海淀区宝盛北里西区28号', null),
-   (1006, '王处一', 1, '1985-6-6', '深圳市宝安区宝安大道5010号', null),
-   (1007, '刘处玄', 1, '1987-7-7', '郑州市金水区纬五路21号', null),
-   (1008, '孙不二', 0, '1989-8-8', '武汉市光谷大道61号', null),
-   (1009, '平一指', 1, '1992-9-9', '西安市雁塔区高新六路52号', null),
-   (1010, '老不死', 1, '1993-10-10', '广州市天河区元岗路310号', null),
-   (1011, '王大锤', 0, '1994-11-11', null, null),
-   (1012, '隔壁老王', 1, '1995-12-12', null, null),
-   (1013, '郭啸天', 1, '1977-10-25', null, null);
-   
-   -- 删除学生记录
-   delete from TbStudent where stuid=1004;
-   
-   -- 更新学生记录
-   update TbStudent set stubirth='1980-12-12', stuaddr='上海市宝山区同济支路199号' where stuid=1002;
-   
-   -- 添加课程记录
-   insert into TbCourse values 
-   (1111, 'C语言程序设计', 3, '大神级讲师授课需要抢座'),
-   (2222, 'Java程序设计', 3, null),
-   (3333, '数据库概论', 2, null),
-   (4444, '操作系统原理', 4, null);
-   
-   -- 添加学生选课记录
-   insert into TbSC values 
-   (default, 1001, 1111, '2016-9-1', 95),
-   (default, 1002, 1111, '2016-9-1', 94),
-   (default, 1001, 2222, now(), null),
-   (default, 1001, 3333, '2017-3-1', 85),
-   (default, 1001, 4444, now(), null),
-   (default, 1002, 4444, now(), null),
-   (default, 1003, 2222, now(), null),
-   (default, 1003, 3333, now(), null),
-   (default, 1005, 2222, now(), null),
-   (default, 1006, 1111, now(), null),
-   (default, 1006, 2222, '2017-3-1', 80),
-   (default, 1006, 3333, now(), null),
-   (default, 1006, 4444, now(), null),
-   (default, 1007, 1111, '2016-9-1', null),
-   (default, 1007, 3333, now(), null),
-   (default, 1007, 4444, now(), null),
-   (default, 1008, 2222, now(), null),
-   (default, 1010, 1111, now(), null);
+   -- 插入学院数据
+   insert into tb_college 
+   (collname, collmaster, collweb) values 
+   ('计算机学院', '左冷禅', 'http://www.abc.com'),
+   ('外国语学院', '岳不群', 'http://www.xyz.com'),
+   ('经济管理学院', '风清扬', 'http://www.foo.com');
+   
+   -- 插入学生数据
+   insert into tb_student 
+   (stuid, stuname, stusex, stubirth, stuaddr, collid) values
+   (1001, '向问天', 1, '1990-3-4', '四川成都', 1),
+   (1002, '任我行', 1, '1992-2-2', '湖南长沙', 1),
+   (1033, '任盈盈', 0, '1989-12-3', '湖南长沙', 1),
+   (1572, '余沧海', 1, '1993-7-19', '四川成都', 1),
+   (1378, '岳灵珊', 0, '1995-8-12', '四川绵阳', 1),
+   (1954, '林平之', 1, '1994-9-20', '福建莆田', 1),
+   (2035, '令狐冲', 1, '1988-6-30', '陕西咸阳', 2),
+   (3011, '林震南', 1, '1985-12-12', '福建莆田', 3),
+   (3755, '龙傲天', 1, '1993-1-25', '广东东莞', 3),
+   (3923, '向天问', 0, '1985-4-17', '四川成都', 3),
+   (2177, '隔壁老王', 1, '1989-11-27', '四川成都', 2);
+   
+   -- 插入老师数据
+   insert into tb_teacher 
+   (teacherid, tname, ttitle, collid) values 
+   (1122, '张三丰', '教授', 1),
+   (1133, '宋远桥', '副教授', 1),
+   (1144, '杨逍', '副教授', 1),
+   (2255, '范遥', '副教授', 2),
+   (3366, '韦一笑', '讲师', 3);
+   
+   -- 插入课程数据
+   insert into tb_course
+   (courseid, cname, ccredit, tid) values 
+   (1111, 'Python程序设计', 3, 1122),
+   (2222, 'Web前端开发', 2, 1122),
+   (3333, '操作系统', 4, 1122),
+   (4444, '计算机网络', 2, 1133),
+   (5555, '编译原理', 4, 1144),
+   (6666, '算法和数据结构', 3, 1144),
+   (7777, '经贸法语', 3, 2255),
+   (8888, '成本会计', 2, 3366),
+   (9999, '审计', 3, 3366);
+   
+   -- 插入选课数据
+   insert into tb_score 
+   (sid, cid, selectdate, score) values 
+   (1001, 1111, now(), 95),
+   (1001, 2222, now(), 87.5),
+   (1001, 3333, now(), 100),
+   (1001, 4444, now(), null),
+   (1001, 6666, now(), 100),
+   (1002, 1111, now(), 65),
+   (1002, 5555, now(), 42),
+   (1033, 1111, now(), 92.5),
+   (1033, 4444, now(), 78),
+   (1033, 5555, now(), 82.5),
+   (1572, 1111, now(), 78),
+   (1378, 1111, now(), 82),
+   (1378, 7777, now(), 65.5),
+   (2035, 7777, now(), 88),
+   (2035, 9999, now(), 70),
+   (3755, 1111, now(), 72.5),
+   (3755, 8888, now(), 93),
+   (3755, 9999, now(), null);
+   
+   -- 删除数据
+   delete from tb_student where stuid=2177;
+   
+   -- 更新数据
+   update tb_score set score=null where sid=1002 and cid=1111;
    ```
 
 3. DQL
@@ -148,90 +196,113 @@
    ```SQL
    
    -- 查询所有学生信息
-   select * from TbStudent;
+   select * from tb_student;
+   select stuid, stuname, stusex, stubirth, stuaddr, collid 
+   from tb_student;
    
    -- 查询所有课程名称及学分(投影和别名)
-   select cosname as `课程名称`, coscredit as `学分` from TbCourse;
+   select cname as 课程名称, ccredit as 学分 from tb_course;
    
    -- 查询所有女学生的姓名和出生日期(筛选)
-   select stuname, stubirth from TbStudent where stusex=0;
-   
-   -- 查询所有80后学生的姓名、性别和出生日期(筛选)
-   select stuname as `姓名`, if(stusex, '男', '女') as `性别`, stubirth as `出生日期` from TbStudent where stubirth between '1980-1-1' and '1989-12-31';
-   
-   -- 查询姓王的学生姓名和性别(模糊)
-   select stuname, stusex from TbStudent where stuname like '王%';
-   
-   -- 查询姓郭名字总共两个字的学生的姓名(模糊)
-   select stuname from TbStudent where stuname like '郭_';
-   
-   -- 查询姓郭名字总共三个字的学生的姓名(模糊)
-   select stuname from TbStudent where stuname like '郭__';
-   
-   -- 查询名字中有王字的学生的姓名(模糊)
-   select stuname from TbStudent where stuname like '%王%';
-   
-   -- 查询没有录入家庭住址和照片的学生姓名(多条件筛选和空值处理)
-   select stuname from TbStudent where stuaddr is null and stuphoto is null;
+   select stuname, stubirth from tb_student where stusex=0;
+   
+   -- 查询所有80后女学生的姓名、性别(显示成'女')和出生日期(筛选)
+   select stuname, '女' as stusex, stubirth from tb_student 
+   where stubirth between '1980-1-1' and '1989-12-31' and stusex=0;
+   
+   -- 查询姓“林”的学生姓名和性别(模糊)
+   select stuname, if(stusex, '男', '女') as stusex 
+   from tb_student where stuname like '林%';
+   
+   -- 查询姓“张”名字总共两个字的老师的姓名和职称(模糊)
+   select tname from tb_teacher where tname like '张_';
+   
+   -- 查询姓“张”名字总共三个字的老师的姓名和职称(模糊)
+   select tname, ttitle from tb_teacher where tname like '张__';
+   
+   -- 查询名字中有“天”字的学生的姓名(模糊)
+   select stuname from tb_student where stuname like '%天%';
+   
+   -- 查询学生的籍贯
+   select distinct stuaddr from tb_student 
+   where stuaddr<>'' and stuaddr is not null;
+   
+   -- 查询男学生的姓名和生日按年龄从大到小排列(排序)
+   select stuname, stubirth from tb_student 
+   where stusex=1 order by stubirth asc;
+   
+   -- 查询年龄最大/最小的学生的出生日期(聚合函数)
+   select min(stubirth) from tb_student;
+   select max(stubirth) from tb_student;
+   -- 查询学生/男学生/女学生的总人数
+   select count(stuid) from tb_student;
+   select count(stuid) from tb_student where stusex=1;
+   select count(stuid) from tb_student where stusex=0;
+   -- 查询1111课程的平均分/最低分/最高分/选课人数/考试人数
+   select avg(score) from tb_score where cid=1111;
+   select min(score) from tb_score where cid=1111;
+   select max(score) from tb_score where cid=1111;
+   select count(sid) from tb_score where cid=1111;
+   select count(score) from tb_score where cid=1111;
    
-   -- 查询学生选课的所有日期(去重)
-   select distinct scdate from TbSC;
+   -- 查询男女学生的人数(分组和聚合函数)
+   select if(stusex, '男', '女') as 性别, count(stusex) as 人数 
+   from tb_student group by stusex order by 人数 desc;
    
-   -- 查询学生的姓名和生日按年龄从大到小排列(排序)
-   select stuname, stubirth from TbStudent order by stubirth;
+   -- 查询学号为1001的学生所有课程的总成绩(筛选和聚合函数)
+   select sum(score) as 总成绩 from tb_score where sid=1001;
    
-   -- 查询所有录入了家庭住址的男学生的姓名、出生日期和家庭住址按年龄从小到大排列(多条件筛选和排序)
-   select stuname, stubirth, stuaddr from TbStudent where stusex=1 and stuaddr is not null order by stubirth desc;
+   -- 查询每个学生的学号和平均成绩(分组和聚合函数)
+   select sid as 学号, avg(score) as 平均分 
+   from tb_score 
+   where score is not null 
+   group by sid 
+   order by 平均分 desc;
    
-   -- 查询年龄最大的学生的出生日期(聚合函数)
-   select min(stubirth) from TbStudent;
+   -- 查询平均成绩大于等于80分的学生的学号和平均成绩(分组后的筛选)
+   select sid as 学号, avg(score) as 平均分 
+   from tb_score 
+   group by sid having 平均分>=80 
+   order by 平均分 desc;
    
-   -- 查询年龄最小的学生的出生日期(聚合函数)
-   select max(stubirth) from TbStudent;
+   -- 查询年龄最大的学生的姓名(子查询)
+   select stuname from tb_student 
+   where stubirth=(select min(stubirth) from tb_student);
+   select stuname from tb_student 
+   where stubirth=(select max(stubirth) from tb_student);
    
-   -- 查询男女学生的人数(分组和聚合函数)
-   select if(stusex, '男', '女') as `性别`, count(stusex) as `人数` from TbStudent group by stusex;
+   -- 查询选了三门及以上的课程的学生姓名(子查询/分组条件/集合运算)
+   select stuname from tb_student where stuid in 
+   (select sid from tb_score group by sid having count(sid)>=3);
    
-   -- 查询课程编号为1111的课程的平均成绩(筛选和聚合函数)
-   select avg(score) as `平均成绩` from TbSC where cid=1111;
+   -- 查询课程名称、学分、授课老师的名字和职称
+   select cname, ccredit, tname, ttitle 
+   from tb_course, tb_teacher 
+   where tid=teacherid;
    
-   -- 查询学号为1001的学生所有课程的总成绩(筛选和聚合函数)
-   select sum(score) as `总成绩` from TbSC where sid=1001;
+   select cname, ccredit, tname, ttitle 
+   from tb_course inner join tb_teacher 
+   on tid=teacherid;
    
-   -- 查询每个学生的学号和平均成绩, null值处理成0(分组和聚合函数)
-   select sid as `学号`, ifnull(avg(score), 0) as `平均成绩` from TbSC group by sid;
+   -- 查询学生姓名和所在学院名称
+   select stuname, collname 
+   from tb_student t1, tb_college t2 
+   where t1.collid=t2.collid;
    
-   -- 查询平均成绩大于等于90分的学生的学号和平均成绩
-   select sid as `学号`, avg(score) as `平均成绩` from TbSC group by sid having avg(score)>=90;
+   select stuname, collname from tb_student t1 
+   inner join tb_college t2 on t1.collid=t2.collid;
    
-   -- 查询年龄最大的学生的姓名(子查询)
-   select stuname from TbStudent where stubirth=(select min(stubirth) from TbStudent);
+   -- 查询学生姓名、课程名称以及考试成绩
    
-   -- 查询选了两门以上的课程的学生姓名(子查询/分组条件/集合运算)
-   select stuname from TbStudent where stuid in 
-   (select sid from TbSC group by sid having count(sid)>2);
    
    -- 查询选课学生的姓名和平均成绩(子查询和连接查询)
-   -- 写法1:
-   select stuname, avgscore from TbStudent t1 inner join
-   (select sid, avg(score) as avgscore from TbSC where score is not null group by sid) t2 on t1.stuid=t2.sid;
-   -- 写法2: 
-   select stuname, avgscore from TbStudent t1,
-   (select sid, avg(score) as avgscore from TbSC where score is not null group by sid) t2 where t1.stuid=t2.sid;
+   
    
    -- 查询学生姓名、所选课程名称和成绩(连接查询)
-   -- 写法1:
-   select stuname, cosname, score from 
-   TbStudent t1, TbCourse t2, TbSC t3
-   where t1.stuid=t3.sid and t2.cosid=t3.cid and t3.score is not null;
-   -- 写法2:
-   select stuname, cosname, score from TbStudent t1 inner join TbCourse t2
-   inner join (select sid, cid, score from TbSC where score is not null) t3 
-   on t1.stuid=t3.sid and t2.cosid=t3.cid;
+   
    
    -- 查询每个学生的姓名和选课数量(左外连接和子查询)
-   select stuname as `姓名`, ifnull(coscount, 0) as `选课数` from TbStudent t1
-   left outer join (select sid, count(sid) as coscount from TbSC group by sid) t2 on t1.stuid=t2.sid;
+   
    ```
 
 4. DCL
@@ -248,6 +319,22 @@
    revoke insert, delete, update on SRS.* from 'hellokitty'@'localhost';
    ```
 
+###  相关知识
+
+#### 范式理论
+
+#### 数据完整性
+
+1. 实体完整性 - 每个实体都是独一无二的
+   - 主键 / 唯一约束 / 唯一索引
+2. 引用完整性(参照完整性)
+   - 外键
+3. 域完整性 - 数据是有效的
+   - 数据类型
+   - 非空约束
+   - 默认值约束
+   - 检查约束
+
 ### Python数据库编程
 
 1. MySQLdb