diff --git "a/Day31-35/\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md" "b/Day31-35/\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md" index 53e392e21417fe6ac6068d4ddcf5770aeaa0385a..d9f8f54b36eab972f6a3eceb8b0de1778bfcbfad 100644 --- "a/Day31-35/\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md" +++ "b/Day31-35/\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.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 .rpm`。 - 移除软件包:`rpm -e `。 - 查询软件包:`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 \ No newline at end of file diff --git "a/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" "b/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" index 5771e41bbc65b61e5299c53dba2859d0738fcc61..f0081d35f84521e9839655c3d5d8c3f4b021178c 100644 --- "a/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" +++ "b/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.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