1、数据库
1、什么是数据库
数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库。
专业的数据库是专门对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方式对象数据进行管理更加的方便,快速,安全。
2、作用
对数据进行持久化的保存
方便数据的存储和查询,速度快,安全,方便
可以处理并发访问
更加安全的权限管理访问机制
3、常见的数据库
数据库分两大类,一类是 关系型数据库。另一类叫做 非关系型数据库。
关系型数据库: MySQL,Oracle,PostgreSQL,SQLserver等等
非关系型数据库:Redis内存数据库,MongoDB文档数据库等等
4、关于数据库的一些名词
数据库 Database
数据表 Tables
数据字段 field
行 row
列 column
2、MYSQL安装
1、第一次安装
安装步骤:
1、在MySQL官网 http://dev.mysql.com/downloads/mysql/ 上面下载符合你电脑操作系统的ZIP安装包
2. 下载完成后解压到想要安装的目录下。
例如:E:\MySQL5.7\mysql-5.7.17-winx64
3. 在安装路径下新建一个空的data文件夹。
4.新建一个my.ini配置文件(注意后缀名为.ini,然后打开方式选择记事本打开即可编辑),原始的my-default.ini配置文件只是个模版,不要在里面改动。
内容如下:
[mysqld]
# 设置端口
port=3306
# 设置mysql的安装目录(你自己的目录)
basedir=E:\MySQL5.7\mysql-5.7.31-winx64\
# 设置mysql数据库的数据的存放目录(data文件夹目录)
datadir=E:\MySQL5.7\mysql-5.7.31-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
- 以管理员身份运行cmd,进入bin目录,执行 mysqld —initialize-insecure —user=mysql 命令。不进行这一步,安装完成之后无法启动服务。
6. 依然在管理员cmd窗口的bin目录下,执行 mysqld install 命令安装。完成后会提示安装成功。
7. 依然在管理员cmd窗口的bin目录下,执行 net start mysql 命令启动MySQL服务。
8. 修改环境变量,添加”E:\MySQL5.7\mysql-5.7.31-winx64\bin”。
9. 在管理员cmd窗口中,进入bin目录,执行 mysql -u root -p 命令,默认没有密码,回车进入。
10.关闭mysql:net stop mysql
2、电脑是已有其他版本
我的电脑是有其他版本,我本来打算卸载,但是没找到卸载入口,也不打算卸载了,准备直接装,也就是电脑是有两个版本的MYSQL。
步骤如下:
前边三步操作和上边相同,第四步的配置文件有些许修改,因为原本的版本占用了3306端口,所以这边使用3307端口,并且不要忘记把默认启动的端口改为3307,不然执行第9步一直会去3306端口找。
my.ini配置文件:
[mysqld]
# 设置3307端口(原先的mysql已经占用3306)
port=3307
# 设置mysql的安装目录(你自己的目录)
basedir=E:\MySQL5.7\mysql-5.7.31-winx64\
# 设置mysql数据库的数据的存放目录
datadir=E:\MySQL5.7\mysql-5.7.31-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3307
default-character-set=utf8
- 以管理员身份运行cmd,进入安装目录下的bin目录,执行 mysqld —initialize-insecure —user=mysql 命令。不进行这一步,安装完成之后无法启动服务。
windows的cmd命令切换目录,cd 路径
需要注意的是第6,7步,因为之前安装的默认使用mysql这个服务名,所以这里为了区分不同版本,起个别名,那么到时候启动的时候也是使用这个别名。
6. 依然在管理员cmd窗口的bin目录下,执行 mysqld install mysql5 命令安装。完成后会提示安装成功。
7. 依然在管理员cmd窗口的bin目录下,执行 net start mysql5 命令启动MySQL服务。
8. 修改环境变量,添加”E:\MySQL5.7\mysql-5.7.31-winx64\bin”。
9. 在管理员cmd窗口中,执行 mysql -u root -p 命令,默认没有密码,回车进入。
10.关闭mysql:net stop mysql5
3、SQL语句
SQL ( Structure query language ) 结构化查询语言
SQL语言分为4个部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)
1、SQL语句中的快捷键
- \G 格式化输出(文本式,竖立显示)
- \s 查看服务器端信息
- \c 结束命令输入操作
- \q 退出当前sql命令行模式
- \h 查看帮助
2、语法:
- SQL 语句可以换行, 要以分号结尾
- 命令不区分大小写. 关键字和函数建议用大写
- 如果提示符为
'>
那么需要输入一个'回车
- 命令打错了换行后不能修改, 可以用 \c 取消
4、MYSQL基本命令
1、库操作
1、登录
mysql -uroot -p
2、查看所有数据库库==>数据库==>就像文件夹一样,库里面可以存储很多个表)
show databases;
3、创建自己的库
create database 库名 default charset=utf8;
4、打开库
use 库名;
5、删除数据库
drop database 库名;
11、退出MySQL**
exit; 或者 quit; 或者 \q;
2、数据表的操作
1、查看库中所有数据表
show tables;
2、创建表
create table 表名( 字段名 类型 字段约束, 字段名 类型 字段约束, 字段名 类型 字段约束 )engine=innodb default
charset=utf8;
create table if not exists 表名(字段名 类型 字段约束, 字段名 类型 字段约束, 字段名 类型 字段束)engine=innodb defaultcharset=utf8;
创建表的基本原则:
- 表明和字段名 尽可能的符合命名规范,并且最好能够‘见名知意’
- 表中数据必须有唯一标示,即主键定义。无特殊情况,主键都为数字并自增即可
- 表中字段所对应的类型设置合理,并限制合理长度
- 表引擎推荐使用innodb,并无特殊情况都要求为utf8或者utf8mb4的字符编码
3、删除表
drop table 表名;
4、查看表结构
desc 表名;
5、查看建表语句
show create table users;
6、修改表结构
alter table 表名 action (更改的选项)
添加字段
# 语法:alter table 表名 add 添加的字段信息 -- 在 users 表中 追加 一个 num 字段 alter table users add num int not null; -- 在指定字段后面追加字段 在 users 表中 age字段后面 添加一个 email 字段 alter table users add email varchar(50) after age; -- 在指定字段后面追加字段,在 users 表中 age字段后面 添加一个 phone alter table users add phone char(11) not null after age; -- 在表的最前面添加一个字段 alter table users add aa int first;
删除字段
# 删除字段 alter table 表名 drop 被删除的字段名 alter table users drop aa;
修改字段
语法格式: alter table 表名 change|modify 被修改的字段信息 change: 可以修改字段名, modify: 不能修改字段名。 # 修改表中的 num 字段 类型,使用 modify 不修改表名 alter table users modify num tinyint not null default 12; # 修改表中的 num 字段 为 int并且字段名为 nn alter table users change num mm int; # 注意:一般情况下,无特殊要求,不要轻易修改表结构
7、修改表名
alter table 原表名 rename as 新表名
8、更改表中的自增的值
在常规情况下,auto_increment 默认从1开始继续递增
alter table users auto_increment = 1000;
9、修改表引擎 ```sql推荐在定义表时,表引擎为 innodb。
通过查看建表语句获取当前的表引擎
mysql> show create table users\G; * 1. row * Table: users Create Table: CREATE TABLE
users
( PRIMARY KEY (id
) ) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
直接查看当前表状态信息
mysql> show table status from tlxy where name = ‘users’\G; * 1. row * Name: users Engine: InnoDB
修改表引擎语句
alter table users engine = ‘myisam’;
<a name="E37mf"></a>
## 3、数据操作(增删改查(CRUD))
> CRUD(Create, Read, Update and Delete)
**插入**<br />insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);<br />insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3),(b值1,b值2,b值3);<br />**查询**<br />查询所有数据**:**<br />select * from 表名;<br />查询某些字段数据:<br />select 字段1,字段2,字段3 from 表名;<br />带条件筛选的查询:<br />select * from 表名 where 字段=某个值;**<br />**修改**<br />带条件筛选的修改单个字段值:<br />update 表名 set 字段=某个值 where 条件;<br />带条件筛选的修改多个字段值:<br />update 表名 set 字段1=值1,字段2=值2 where 条件;<br />带条件的修改一个字段的值加上另外的值<br />update 表名 set 字段=字段+值 where 条件;<br />**删除**<br />delete from 表名 where 字段=某个值;
<a name="tAg01"></a>
## 3、库和表的概念与关系
- 库就像是文件夹,库中可以有很多个表
- 表就像是我们的excel表格文件一样
- 每一个表中都可以存储很多数据
- mysql中可以有很多不同的库,库中可以有很多不同的表
- 表中可以定义不同的列(字段
- 表中可以根据结构去存储很多的数据
<a name="MEU1M"></a>
# 5、MYSQL数据类型
数据类型是定义列中可以存储什么类型的数据以及该数据实际怎样存储的基本规则<br />数据类型限制存储在数据列列中的数据。例如,数值数据类型列只能接受数值类型的的数据<br />在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重地影响应用程序的功能和性能。<br />**更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)**<br />数据类型:整型、浮点型、字符串、日期等
<a name="pnStC"></a>
## 1、字符串数据类型
<br />**定长串:char**<br />1. 接受长度固定的字符串,其长度是在创建表时指定的。<br />定长列不允许存储多于指定长度字符的数据。<br />2. 指定长度后,就会分配固定的存储空间用于存放数据
**变长串 varchar**<br />存储可变长度的字符串 varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置,当然插入的数据长度不能超过7个字符。
问题:
Q:既然变长数据类型这样灵活,为什么还要使用定长数据类型? A:因为性能,MySQL处理定长列远比处理变长列快得多。
<a name="mXV5r"></a>
## 2、数值类型
数值数据类型存储数值。MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。支持的取值范围越大,所需存储空间越多<br /><br />**有符号或无符号(unsigned)**<br />所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号<br />有符号数值列可以存储正或负的数值<br />**无符号数值列只能存储正数**。<br />**默认情况为有符号**,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字
需要注意的是:
decimal(5, 2) 表示数值总共5位, 小数占2位 tinyint 1字节(8位) 0-255或-128,127 int 4字节 -21亿~21亿或0-42亿
MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
如果将邮政编码类似于01234存储为数值类型,则保存的将是数值1234,此时需要使用字符串类型。 手机号应该用什么进行存储呢?也是字符串,因为手机号有11位!
<a name="AVwqs"></a>
## 3、日期和时间类型
MySQL使用专门的数据类型来存储日期和时间值<br />datetime 8字节`1000-01-01 00:00:00 ~ 9999-12-31 23:59:59`
<a name="2uhEU"></a>
## 4、二进制数据类型
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等(一般不用)
<a name="o87BZ"></a>
# 6、MYSQL字段约束
- unsigned 无符号(给数值类型使用,表示为正数,不写可以表示正负数都可以)
- 字段类型后面加括号限制宽度
- char(5) varchar(7) 在字符类型后面加限制 表示 字符串的长度
- int(4) 没有意义,默认无符号的int为int(11),有符号的int(10)
- int(4) unsigned zerofill只有当给int类型设置有前导零时,设置int的宽度才有意义。
- not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
- default 设置默认值
- primary key 主键不能为空,且唯一.一般和自动递增一起配合使用。
- auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
- unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度
<a name="XyIyW"></a>
# 7、MySQL的运算符
- 算术运算符: +、 -、 *、 /、 %
- 比较运算符: =、 >、 <、 >=、 <=、!=
- 数据库特有的比较: in、not in、is null、is not null、like、between、and
- 逻辑运算符: and、or、not
- like: 支持特殊符号%和_ ;
其中%表示任意数量的任意字符,_表示任意一位字符,类似正则表达式的*和+
<a name="L5ogC"></a>
# 8、主键
1、**表中每一行都应该有可以唯一标识自己的一列**,用于记录两条记录不能重复,任意两行都不具有相同的主键值<br />2、应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主<br />键,以便于以后的数据操纵和管理。
**要求:**
- 记录一旦插入到表中,主键最好不要再修改
- 不允许NULL
- 不在主键列中使用可能会更改的值。
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键
- 可以使用多个列作为联合主键,但联合主键并不常用。使用多列作为主键时,所有列值的组合必须是唯一的
<a name="BPSbs"></a>
# 9、Mysql数据库表引擎与字符集
<a name="VDUL6"></a>
## 1、服务器处理客户端请求
其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们这里以比较复杂的查询请求为例来画个图展示一下大致的过程:<br />虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。
<a name="QLwjo"></a>
## 2、存储引擎
MySQL 服务器把数据的存储和提取操作都封装到了一个叫 存储引擎 的模块里。我们知道 表 是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是 存储引擎 负责的事情。为了实现不同的功能, MySQL 提供了各式各样的 存储引擎 ,不同 存储引擎 管理的表具体的存储结构可能不同,采用的存取算法也可能不同。
> 存储引擎以前叫做 表处理器 ,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
为了管理方便,人们把 连接管理 、 查询缓存 、 语法解析 、 查询优化 这些并不涉及真实数据存储的功能划分为MySQL server 的功能,把真实存取数据的功能划分为 存储引擎 的功能。各种不同的存储引擎向上边的 MySQL<br />server 层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、"读取索引下一条内容"、"插入记录"等等。
所以在 MySQL server 完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。
MySQL 支持非常多种存储引擎:<br />
<a name="jyhYr"></a>
## 3、MyISAM和InnoDB表引擎的区别
1) 事务支持<br />MyISAM不支持事务,而InnoDB支持。<br />事务:访问并更新数据库中数据的执行单元。事务操作中,要么都执行要么都不执行。典型案例:银行转账<br />2) 存储结构
- MyISAM:每个MyISAM在磁盘上存储成三个文件。
- .frm文件存储表结构。
- .MYD文件存储数据。
- .MYI文件存储索引。
- InnoDB:主要分为两种文件进行存储
- .frm 存储表结构
- .ibd 存储数据和索引 (也可能是多个.ibd文件,或者是独立的表空间文件)
3) 表锁差异<br />MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。 InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。<br />4) 表主键<br />MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。 InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。<br />5) 表的具体行数<br />MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。 InnoDB:没有保存表的总行数(只能遍历),如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。<br />6) CURD操作<br />MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。 InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。<br />7) 外键<br />MyISAM:不支持 InnoDB:支持<br />8) 查询效率<br />MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。<br />推荐考虑使用InnoDB来替代MyISAM引擎,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。<br />另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。<br />9)MyISAM和InnoDB两者的应用场景:<br />MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。 InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用InnoDB。
<a name="f59d4ea9"></a>
## 4、MySQL中的utf8和utf8mb4
utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而在 MySQL 中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计 MySQL的大叔偷偷的定义了两个概念:
- utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
- utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。
有一点需要大家十分的注意,**在 MySQL 中 utf8 是 utf8mb3 的别名**,所以之后在 MySQL 中提到 utf8 就意味着用1~3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用 utf8mb4 。
字符集的查看:<br />MySQL 支持好多好多种字符集,查看当前 MySQL 中支持的字符集可以用下边这个语句:<br />show charset;
<a name="BNhsp"></a>
# 10、高级查询
<a name="TVlof"></a>
## 1、语法格式:
select 字段列表|* from 表名<br />[where 搜索条件]<br />[group by 分组字段 [having 分组条件]]<br />[order by 排序字段 排序规则]<br />[limit 分页参数]
<a name="6b62256f"></a>
## 2、Where 条件查询
可以在where子句中指定任何条件<br />可以使用 and 或者 or 指定一个或多个条件<br />where条件也可以运用在update和delete语句的后面<br />where子句类似程序语言中if条件,根据mysql表中的字段值来进行数据的过滤<br />在使用and和or 使用时,最好带上括号,这样逻辑更加清晰,也不容易出错
<a name="b9c0eb9f"></a>
## 3、Like 子句
类似正则的查询<br />主要使用 % 和 _<br />其中%表示任意数量的任意字符,_表示任意一位字符<br />**注意:where子句中的like在使用%或者_进行模糊搜索时,效率不高,使用时注意:**
- **尽可能的不去使用%或者_**
- 如果需要使用,也尽可能不要把通配符放在开头处
<a name="hVmiq"></a>
## 4、Mysql中的统计函数(聚合函数)
max(),min(),count(),sum(),avg()<br />分别是 最大值,最小值,统计数量,求和,求平均数
**count(*) 和 count(字段)有什么区别?**<br />count(*) 是按照表中所有的列进行数据的统计,只要其中一列上有数据,就可以计算<br />count(id) 是按照指定的 id 字段进行统计,也可以使用别的字段进行统计,但是注意,如果指定的列上出现了NULL值,那么为NULL的这个数据不会被统计。
聚合函数除了以上简单的使用意外,通常情况下都是配合着分组进行数据的统计和计算
<a name="GnvWS"></a>
## 5、Group BY 分组
group by 语句根据一个或多个列对结果集进行分组<br />一般情况下,是用与数据的统计或计算,配合聚合函数使用<br />注意,在使用。group by分组时,一般除了聚合函数,其它在select后面出现的字段列都需要出现在grouop by 后面<br />如下:<br />select classid,sex,count(*) as num from users group by classid,sex;
<a name="nPUY1"></a>
## 6、Having 子句
having时在分组聚合计算后,对结果再一次进行过滤,类似于where,<br />where过滤的是行数据,having过滤的是分组数据
<a name="vLqtl"></a>
## 7、Order by 排序
我们在mysql中使用select的语句查询的数据结果是根据数据在底层文件的结构来排序的<br />首先不要依赖默认的排序,另外在需要排序时要使用orderby对返回的结果进行排序<br />Asc 升序,默认<br />desc降序
<a name="TcmYs"></a>
## 8、Limit 数据分页
limit n 提取n条数据,<br />limit m,n 跳过m条数据,提取n条数据
```sql
-- 查询users表中的数据,只要3条
select * from users limit 3;
-- 跳过前4条数据,再取3条数据
select * from users limit 4,3;
-- limit一般应用在数据分页上面
-- 例如每页显示10条数据,第三页的 limit应该怎么写? 思考
第一页 limit 0,10
第二页 limit 10,10
第三页 limit 20,10
第四页 limit 30,10
-- 提取 user表中 年龄最大的三个用户数据 怎么查询?
select * from users order by age desc limit 3;
9、distinct去重
会把相同的数据去除掉。
select distinct 字段 from 表名 where 条件;
10、总结
11、Mysql数据库导入导出和授权
1、导出
1、数据库数据导出
# 不要进入mysql,然后输入以下命令 导出某个库中的数据
mysqldump -u root -p tlxy > ~/Desktop/code/tlxy.sql
导出一个库中所有数据,会形成一个建表和添加语句组成的sql文件
之后可以用这个sql文件到别的库,或着本机中创建或回复这些数据
2.将数据库中的表导出
# 不要进入mysql,然后输入以下命令 导出某个库中指定的表的数据
mysqldump -u root -p tlxy tts > ~/Desktop/code/tlxy-tts.sql
2、数据导入
把导出的sql文件数据导入到mysql数据库中
# 在新的数据库中 导入备份的数据,导入导出的sql文件
mysql -u root -p ops < ./tlxy.sql
# 把导出的表sql 导入数据库
mysql -u root -p ops < ./tlxy-tts.sql
3、权限管理
mysql中的root用户是数据库中权限最高的用户,千万不要用在项目中。
可以给不同的用户,或者项目,创建不同的mysql用户,并适当的授权,完成数据库的相关操作
这样就一定程度上保证了数据库的安全。
创建用户的语法格式:grant 授权的操作 on 授权的库.授权的表 to 账户@登录地址 identified by "密码";
# 在mysql中 创建一个 zhangsan 用户,授权可以对tlxy这个库中的所有表 进行 添加和查询 的权限
grant select,insert on tlxy.* to zhangsan@'%' identified by '123456';
# 用户 lisi。密码 123456 可以对tlxy库中的所有表有 所有操作权限
grant all on tlxy.* to lisi@'%' identified by '123456';
# 删除用户
drop user 'lisi'@'%';
12、小试牛刀
创建数据表:
- 年级表:年级 id(主键),年级名称
- 成绩表:id(主键),学员编号,科目 id,分数,考试时间
- 学生表:学生编号(主键),学生姓名,登录密码,性别,年级 id,,电话,地址,出生日期,email
- 科目表:科目 id(主键),科目名称,学时,年级 id
然后进行简单操作。
案例代码:
-- 创建数据库
create database SQLExercise;
-- 创建表
-- 年级表:年级id(主键),年级名称
create table if not exists grade(
grade_id int not null primary key auto_increment,
grade_name varchar(4) not null
)engine=innodb default charset=utf8;
-- 成绩表:id(主键),学员编号,科目id,分数,考试时间
create table if not exists score(
score_id int unsigned not null primary key auto_increment,
student_id varchar(8) not null,
subject_id tinyint unsigned not null,
score tinyint unsigned not null default 0,
exam_time date not null
)engine=innodb default charset=utf8;
-- 学生表:学生编号(主键),学生姓名,登录密码,性别,年级id,电话,地址,出生日期,email
create table if not exists student(
student_id varchar(8) not null primary key,
studnet_name varchar(5) not null,
login_password varchar(8) not null,
sex enum('男','女') default "男",
grade_id int not null,
tel varchar(11),
address varchar(15),
birth date,
email varchar(50)
)engine=innodb default charset=utf8;
-- 科目表:科目id(主键),科目名称,学时,年级id
create table if not exists subject(
subject_id tinyint unsigned not null primary key auto_increment,
subject_name varchar(30) not null,
hours tinyint unsigned not null,
grade_id int not null
)engine=innodb default charset=utf8;
-- 插入数据
-- 年级表
-- 第一阶段,第二阶段,第三阶段
insert into grade values
(null, "第一阶段"),
(null, "第二阶段"),
(null, "第三阶段");
-- score
-- 学员编号: S1101001
-- 科目id;1-10
-- 分数;100 及格 60
-- 考试时间:date 1999-12-12
insert into score values
(null, "S1101001", 1,88,"2020-2-2"),
(null, "S1101002", 1,100,"2020-2-2"),
(null, "S1101003", 1,87,"2020-2-2"),
(null, "S1101004", 1,86,"2020-2-2"),
(null, "S1101005", 1,100,"2020-2-2"),
(null, "S1101001", 2,88,"2020-2-3"),
(null, "S1101002", 2,100,"2020-2-3"),
(null, "S1101003", 2,87,"2020-2-3"),
(null, "S1101004", 2,86,"2020-2-3"),
(null, "S1101005", 2,100,"2020-2-3"),
(null, "S1101001", 3,88,"2020-2-4"),
(null, "S1101002", 3,100,"2020-2-4"),
(null, "S1101003", 3,87,"2020-2-4"),
(null, "S1101004", 3,86,"2020-2-4"),
(null, "S1101005", 3,100,"2020-2-4"),
(null, "S1101001", 8,50,"2020-2-8"),
(null, "S1101002", 8,70,"2020-2-8"),
(null, "S1101003", 8,59,"2020-2-8"),
(null, "S1101004", 8,10,"2020-2-8"),
(null, "S1101005", 8,55,"2020-2-8"),
(null, "S1101001", 4,88,"2020-2-5"),
(null, "S1101002", 4,100,"2020-2-5"),
(null, "S1101003", 4,87,"2020-2-5"),
(null, "S1101004", 4,86,"2020-2-5"),
(null, "S1101005", 4,100,"2020-2-5"),
(null, "S1101001", 5,60,"2020-2-6"),
(null, "S1101002", 5,70,"2020-2-6"),
(null, "S1101003", 5,87,"2020-2-6"),
(null, "S1101004", 5,86,"2020-2-6"),
(null, "S1101005", 5,90,"2020-2-6");
-- 学生表:
-- 学生编号(主键),S1101001
-- 学生姓名,金蝶,姓凌的单名同学
-- 登录密码,12345
-- 性别,
-- 年级id,
-- 电话,
-- 地址,山东,北京
-- 出生日期,1989-1-1~1990-1-1
-- email
insert into students values
("S1101001","金蝶","12345678","女",1,"13894383838","北京","1989-3-8","12345@sb.com"),
("S1101002","凌晨","87866686","男",2,"13994383838","浙江","1999-8-8","22345@qq.com"),
("S1101003","凌凌漆","77777777","男",3,"13894293838","山东","1991-7-8","33345@123.com"),
("S1101004","胖虎","000000","男",1,"13988883838","海南","1989-7-7","166745@wy.com"),
("S1101005","芙蓉","198853","女",2,"13854389438","北京","1988-5-3","89089845@lj.com");
-- 科目表:科目id(主键),科目名称,学时,年级id
-- 设计 MySchool 数据库
-- 面向对象程序设计
-- 科目学时小于 50
-- 每个阶段课程的平均课时
insert into subject values
(1,"基础课程",30,1),
(2,"面向对象程序设计",60,1),
(3,"核心类库",60,1),
(4,"设计 MySchool 数据库",40,2),
(5,"前端",30,2),
(6,"web编程",40,2),
(7,"Linux",60,2),
(8,"基于.NET 平台的软件系统分层开发",20,3),
(9,"框架学习",50,3),
(10,"项目实战",60,3);
-- 练习
-- 1. grade 表增加一个阶段,“就业期”
insert into grade values(null,"就业期");
-- 2.将第三阶段的学生的 gradeid 改为就业期的 id
update students set grade_id = (select grade_id from grade where grade_name = "就业期") where grade_id = (select grade_id from grade where grade_name = "第三阶段");
-- 3.查询所有得了 100 分的学号
select student_id from score where score = 100 group by student_id;
-- 4.查询所有 1989 年出生的学生(1989-1-1~1990-1-1)
select * from students where birth between "1989-1-1" and "1990-1-1";
-- 5.查询学生姓名为“金蝶”的全部信息
select * from students where studnet_name = "金蝶";
-- 6.查询 subjectid 为 8 的科目考试未及格(60 分)的学号和成绩
select student_id,score from score where subject_id = 8 and score < 60;
-- 7.查询第 3 阶段课时大于 50 的课程全部信息
select * from subject where grade_id = (select grade_id from grade where grade_name = "第三阶段") and hours > 50;
-- 8.查询 S1101001 学生的考试信息
select subject_id,score,exam_time from score where student_id = "S1101001";
select subject_id,score,exam_time from score where student_id = "S1101001" order by subject_id;
-- 9.查询所有第二阶段的女生信息
select * from students where grade_id = (select grade_id from grade where grade_name = "第二阶段") and sex = "女";
-- 10.“基于.NET 平台的软件系统分层开发”需要多少课时
select subject_name,hours from subject where subject_name = "基于.NET 平台的软件系统分层开发";
-- 11.查询“设计 MySchool 数据库”和“面向对象程序设计”的课时(使用in)
select subject_name,hours from subject where subject_name in ("基于.NET 平台的软件系统分层开发","面向对象程序设计");
-- 12 查询所有地址在山东的学生信息
select * from students where address = "山东";
-- 13 查询所有姓凌的单名同学
select * from students where studnet_name like "凌_";
-- 14.查询 gradeid 为 1 的学生信息,按出生日期升序排序
select * from students where grade_id = 1 order by birth;
-- 15.查询 subjectid 为 3 的考试的成绩信息,用降序排序
select score from score where subject_id = 3 order by score desc;
-- 16.查询 gradeid 为 2 的课程中课时最多的课程信息
select * from subject where grade_id = 2 and hours = (select max(hours) from subject where grade_id = 2);
-- 17.查询北京的学生有多少个
select count(*) from students where address = "北京";
-- 18.查询有多少个科目学时小于 50
select count(*) from subject where hours < 50;
-- 19.查询 gradeid 为 2 的阶段总课时是多少
select sum(hours) "第二阶段总课时" from subject where grade_id = 2;
-- 20.查询 subjectid 为 8 的课程学生平均分
select avg(score) "基于.NET 平台的软件系统分层开发的平均分" from score where subject_id = 8;
-- 21.查询 gradeid 为 3 的课程中最多的学时和最少的学时
select max(hours) "第三阶段最多课时", min(hours) "第三阶段最少课时" from subject where grade_id = 3;
-- 22.查询每个科目有多少人次考试
select subject_id,count(subject_id) "考生人数" from score group by subject_id;
-- 23.每个阶段课程的平均课时
select grade_id,avg(hours) "平均课时" from subject group by grade_id;
-- 24.查询每个阶段的男生和女生个数(group by 两列)
select grade_id,sex "性别",count(sex) "人数" from students group by grade_id,sex;