Linux 3: Database development technology | Linux
Linux 系列
Linux 1: 云计算操作系统管理
- Cloud computing operating system management | Linux
Linux 2: 云计算网络应用管理
- Cloud computing network application management | Linux
Linux 3: 数据库开发技术
Database development technology | Linux
Linux 3: Database development technology | Linux
- Linux 系列
- Linux 1: 云计算操作系统管理
- Linux 2: 云计算网络应用管理
- Linux 3: 数据库开发技术
- Linux 操作系统 3: 数据库开发技术
- 常见软件
- 专业术语
- 相关参数
- 环境准备
- 连接数据库,使用初始密码登录并重置密码
- 连接 mySQL 服务
- 数据存储流程
- SQL命令使用规则
- 常用的SQL命令分类
- mysql基本操作
- 表管理命令
- 创建表
- 修改、删除表
- 数据类型:
- 常见信息种类
- 字符类型
- 数值类型
- 整数型:只能存整数
- 浮点型:存储有小数点的数
- 日期时间类型
- 类型格式
- 时间函数
- 日期时间字段 datetime 与 timestamp 的区别
- year 类型
- 枚举类型
- enum 单选
- set 多选
- 验证约束条件 Null,可以给字段赋空值
- 建表时指定字段值不为空和设置默认值
- 向t3表中插入数据,所有字段自己定义,可以不使用默认值
- 验证 null 值和"null"值
- 修改表结构:
- 语法结构:
- 用法:
- 执行动作:
- 添加新字段
- 用法
- 修改字段类型
- 基本用法
- 使用 modefy 实现字段值的位置调换
- 删除字段
- 基本用法
- 修改字段名
- 基本用法
- 修改表名
- 基本用法
- Mysql 键值概述
- 索引介绍
- Btree 算法(二叉树):
- 索引的优缺点
- 普通索引 index
- 创建索引
- 查看索引
- 删除索引
- MySQL 主键 primary key:
- 创建主键
- 主键的作用:限制字段赋值
- 主键的使用规则
- 创建主键
- 删除主键
- 测试同步删除和同步更新
- 设置成外键的表字段也必须将其设置为主键,否则会出现对于同一个编号可以插入多次数据的情况,也会出现编号为null,插入数据同样成功的情况
- 将表中的外键字段设置为主键
- 删除外键:
- 构建mysq图形管理界面
- 范围匹配
- 逻辑匹配
- 高级匹配条件
- 模糊查询
- 正则表达式格式
- 聚集函数
- 排序
- 分组
- 限制查询结果
- 用户授权
- grant 授权
- 权限列表
- 库名
- 客户端地址
- 应用示例1
- 应用示例2
- 示例3:
- 登录用户使用
- 测试权限
- 应用示例4:
- 授权库
- 撤销权限
- enum set字段用法
- 向t1表添加字段email,不指定字段位置,默认插入到表的最后
- 向t1表最前面添加字段stu_id
- 向t1表中name字段后插入新字段sex
- 使用modify修改t1表的sex字段,设置默认值为man
- 修改t1表中的name字段类型,修改为varchar
- 将email字段移动到sex字段的后面,其他不变
- 删除t1表中的stu_id字段
- 删除t1表中的多个字段(email和party)
- 修改t1表的name字段名称改为abc
- 将t1表重命名为stuinfo
- 查看索引
- 创建索引
- 删除索引
- 主键 & 外键
- 主键auto_increment连用
- 删除外键:
- 数据导入/导出
- 检索目录
- 修改检索目录
- 数据导出:
- 表管理记录
- 查询表记录
- 条件匹配更新
- 删除表记录
- 数值比较
- 字符比较
- 6.8 练习
- 案例1:构建mysql服务
- 案例2:数据库基本原理
- 6.11练习
- 案例1:构建mysql服务器
- 案例2:SQL命令练习
- 案例3:练习数据类型的使用
- 案例4:表结构练习
- 6.18练习
- 6.21 练习
- 6.22 练习
Linux 操作系统 3: 数据库开发技术
常见软件
主流操作系统:Unix, Linux, Windows
软件名 | 开源 | 跨平台 | 厂商 |
---|---|---|---|
Oracle | 否 | 是 | 甲骨文 |
MysQL | 是 | 是 | 甲骨文 |
SQL Server | 否 | 否 | 微软 |
DB2 | 否 | 是 | IBM |
Redis | 是 | 是 | 开源软件 |
Memcached | 是 | 是 | 开源软件 |
MongoDB | 是 | 是 | 开源软件 |
专业术语
- DB (DataBase)
- 数据库
- 依照某种数据模型进行组织并存放到存储器的数据集合
- DBMS (DataBase Management System)
- 数据库管理系统
- 用来操纵和管理数据库的服务软件
- DBS (DataBase System)
- 数据库系统:即DB+DBMS
- 指带有数据库并整合了数据库管理软件的计算机系统
相关参数
- 软件安装后自动创建相关目录与文件
文件 | 说明 |
---|---|
/etc/my.cnf | 主配置文件 |
/var/ib/mysql | 数据库目录 |
默认端口号 | 3306 |
进程名 | mysąld |
传输协议 | TCР |
进程所有者 | mysql |
进程所属组 | mysql |
错误日志文件 | /var/log/mysqld.log |
环境准备
- 创建新虚拟机1台
- 关闭firewalld
- 禁用SELinux
- 配置yum源
- 配置IP地址192.168.4.50
- 软件mysq-5.7.1
- tar官网地址 http://dev.mysql.com/downloads/mysql
systemctl stop firewalld.service
setenforce 0
tar -xf mysql-5.7.17.tar
yum -y install mysql-community-*.rpm
rpm -qa | grep mysql
systemctl start mysqld
systemctl enable mysqld
netstat -anptu | grep :3306
ls /var/lib/mysql
连接数据库,使用初始密码登录并重置密码
grep password /var/log/mysqld.log
mysql -uroot -p'qg1wpZ;G+deg'show databases; -- 报错,需要重置密码alter user root@localhost identified by "123Qqq..."; -- 重置密码show databases; -- 成功exit
mysql -uroot -p123Qqq...
修改密码策略
策略名称 | 验证方式 |
---|---|
LoW(0) | 长度 |
MEDIUM(1) | 长度;数字,小写/大写,和特殊字符 |
STRONG (2) | 长度;数字,小写/大写和特殊字符;字典文件 |
#永久配置
vim /etc/my.cnf[mysqld]validate_password_policy=0validate_password_length=6
mysql -uroot -p123Qqq...show variables like "%password%"; -- 查看变量set global validate_password_policy=0; -- 修改密码策略set global validate_password_length=6; -- 修改密码长度alter user root@localhost identified by "123456"; -- 重置密码exit
mysql -uroot -p123456
连接 mySQL 服务
客户端连接MySQL服务的方法
- 命令行
- 图形工具软件(软件自带图形界面、web页面)
- 编写脚本(php, Java, python …)
使用 mysql 命令
- mysql -h服务器IP -u用户名 -p密码 [数据库名]
- quit 或 exit #退出
登录时直接切换到mysql库
mysql -uroot -p123456 mysqlselect database(); -- 查看当前所处的数据库
数据存储流程
- 客户端把数据存储到数据库服务器上的步骤
- 连接数据库服务器
- 建库(类似于文件夹)
- 建表(类似于文件夹)
- 插入记录(类似于文件内容)
- 断开连接
SQL命令使用规则
- SQL命令不区分字母大小写(密码、变量值除外)
- 每条SQL命令以
;
结束 - 默认命令不支持
Tab键
自动补齐 \c
终止sql命令
常用的SQL命令分类
- 管理数据库使用SQL (结构化查询语言)
- DDL 数据定义语言如:create、alter、drop
- DML 数据操作语言如:insert、update、delete
- DCL 数据控制语言如:grant、revoke
- DTL 数据事务语言如:commit、rollback、savepoint
mysql基本操作
库管理命令:库类似于文件夹,用来存储表
- 可以创建多个库,通过库名区分
show databases; -- 显示已有的库
select user(); -- 显示连接用户
use 库名; -- 切换库
select database(); -- 显示当前所在的库
create database 库名; -- 创建新库
show tables; -- 显示已有的表
drop database 库名; -- 删除库
mysql -uroot -p123456 mysqlcreate database bbsdb;
create database BBSDB
show databases;
drop database BBSDB; -- 删除库
use bbsdb; -- 切换库
select databse(); -- 显示当前所在库
select user(); -- 显示连接用户
show tables; -- 显示已有的表
表管理命令
创建表
- 表存储数据的文件
create table 库名.表名(字段名1 类型(宽度),字段名2 类型(宽度).......
) DEFAULT CHARSET=utf8; -- 指定中文字符集,可以给字段慰值中文
mysql -uroot -p123456 mysqluse bbsdb;
select database();
create table user(name char(10), age int, homedir char(20));
show tables;
desc user;
select * from bbsdb.user;
select * from user;
insert into bbsdb.user values("tom", 18, "beijing");
select * from user;
insert into user values("abc", 20,"chifeng");
select * from user;
select name from user;
select name,age from user;
修改、删除表
update bbsdb.user set homedir="china";
select * from user; -- 更新表数据
delete from bbsdb.user; -- 删除表数据,但表还在
show tables;
select * from user;
drop table bbsdb.user; -- 删除表
show tables;
create table user(name char(10), age int, homedir char(20));
show tables;
show create table bbsdb.user\G
create table 学生表(姓名 char(15), 地址 varchar(20)) DEFAULT CHARSET=utf8; -- 设置字符集为utf8,支持中文
show tables;
show tables;
desc 学生表;
insert into 学生表 values("张三峰", "武当山");
select * from 学生表;
数据类型:
常见信息种类
数值型:体重、身高、成绩、工资
字符型:姓名、工作单位、通信地址
枚举型:兴趣爱好、性别、专业
日期时间型:出生日期、注册时间
字符类型
定长:char(字符个数)
- 最大字符个数255
- 不够指定字符个数时在右边用空格补全
- 字符个数超出时,无法写入数据。
变长:varchar(字符个数)
- 按数据实际大小分配存储空间
- 字符个数超出时,无法写入数据。
大文本类型:text/blob
- 字符数大于65535存储时使用
create table t1(name char(5), email varchar(15));
desc t1;
create table t2( name char, email varchar(3) ); -- char类型不指存储几个字符,默认存储一个
desc t2;
insert into t2 values("a", "bac"); -- 成功
insert into t2 values("aa", "bacd"); -- 失败2
insert into t2 values("b", "bacd"); -- 失败
select * from t2;
数值类型
整数型:只能存整数
类型 | 名称 | 有符号范围 | 无符号范围 |
---|---|---|---|
tinyint | 微小整数 | -128~127 | 0~255 |
smallint | 小整数 | -32768~32767 | 0~65535 |
mediumint | 中整型 | -223~223-1 | 0~224-1 |
int | 大整型 | -231~231-1 | 0~232-1 |
bigint | 极大整型 | -263~263-1 | 0~264-1 |
unsigned | 使用无符号存储范围 |
创建一张表 t3,用于存储学生信息(用户名,年龄,等级),tinyint 类型,unsigned 无符号存储(0255),默认有符号存储(-128127)
create table t3(name char(15), age tinyint unsigned, level tinyint);
insert into t3 values("bob", 21, 7); #成功
insert into t3 values("tom", -1, -129); #失败,条件不满足
insert into t3 values("tom", 0, -129); #失败,超出范围
insert into t3 values("tom", 0, -127); #成功
存储小数,会四舍五入
insert into t3 values("jim", 21.5, 3); #21.5四舍五入存为22
select * from t3;
insert into t3 values("jim", 21.5, 3.43); #3.43四舍五入存为3
select * from t3;3
浮点型:存储有小数点的数
类型 | 名称 | 有符号范围 | 无符号范围 |
---|---|---|---|
float | 单精度 | -3.402823466E+38到1.175494351E-38 | -1.175494351E-38到3.402823466E+38 |
double | 双精度 | -1.7976931348623157E+308到2.2250738585072014E-308 | -22250738585072014E-308 到1.7976931348623157E+308 |
float(7,2) -- 7 指整个浮点数的最大位数,2 指 7 位数字中有两位是小数位, 则取值范围 为:
-99999.99 ~ 99999.99
float(5,3) -- 5 指整个浮点数的最大位数,3 指 5 位数字中有三位是小数位, 则取值范围为:-
99.999 ~ 99.999
float(数字 1,数字 2) -- 数字 1:总的位数 数字 2:小数位的个数
create table t4(name char(10), pay float(5,2));
insert into t4 values("john", 1000.88); -- 失败,超出范围
insert into t4 values("john", 999.88); -- 成功
insert into t4 values("john", -999.99); -- 成功
select * from t4;
insert into t4 values("john3", 218); -- 存储整数,小数位默认补0
日期时间类型
类型格式
创建与日期时间相关的表,指定名称,年份,上课时间,生日,聚会时间
create table t5(name char(15), s_year year, uptime time, birthday date, party datetime);
insert into t5 values("bob", 1990,083000, 20231120, 20230214183000);
select * from t5;
时间函数
select curtime(); —- 获取当前的系统时间
select curdate(); —- 获取当前的系统日期5
select now(); —- 获取当前的系统日期和系统时间
select year(now()); —- 从当前系统时间中只取出年份
select month(now()); —- 从当前系统时间中只取出月份
select day(now()); —- 从当前系统时间中只取出天数
select date(now()); —- 从当前系统时间中只取出年月日
select time(now()); —- 从当前系统时间中只取出时分秒
—- 根据时间函数在 t5 表中插入一条数据
insert into t5 values("tom",2000,time(now()),curdate(),now());
select * from t5;
日期时间字段 datetime 与 timestamp 的区别
关于日期时间字段:当未给timestamp字段赋值时,自动以当前系统时间赋值,而datetime值为NULL(空)
—- 创建 t6 表,指定姓名,约会时间,聚会时间,验证 timestamp 和 datetime 的区别
create table t6(name char(10), meetting datetime, party timestamp);
insert into t6 values("bob", now(), now()); —- 两个字段都有值
select * from t6;
—- t6 表中重新插入一条数据,只插入 name 和 metting 字段的值,party 字段采用默认值
insert into t6(name,meetting) values("bob", 20231120224058);
select * from t6; —- party字段同样有值,字段类型为timestamp,用当前系统时间
—- t6 表中重新插入一条数据,只插入 name 和 party 字段的值,meetting 字段采用默认值
insert into t6(name,party) values("john", 19731001223000 );
select * from t6; —- meetting字段类型为datetime,没有指定时间,默认为空NULL)
year 类型
要求使用 4 位赋值6
当使用 2 位数赋值时:01-99
01 ~ 69 视为 2001 ~ 2069
70 ~ 99 视为 1970 ~ 1999
—- 插入数据,只给 t5 表中的 s_year 字段赋值
show tables;
desc t5;
select s_year from t5;
insert into t5(s_year) values(03),(81);
select s_year from t5; —- 查看t5表中s_year字段的数据,验证结果
枚举类型
字段的值不能自己输入,必须在设置的范围内选择(有单选和多选之分)
enum 单选
格式:字段名 enum(值 1,值 2,值 N)
仅能在列表里选择一个值
set 多选
格式:字段名 set(值 1,值 2,值 3)
在列表里选择一个或多个值
—- 创建 t7 表,指定字段:姓名(name),性别(sex),爱好(likes)
create table t7(name char(15), sex enum("boy", "girl", "no"), likes set("eat","money", "game", "music"));
desc t7;
insert into t7 values('bob','boy','eat,game,music'); —- 成功
Select * from t7;7
insert into t7 values('bob','man','girl,book'); —- 字段sex的类型中没有man,存储失败
insert into t7 values('bob','no','girl,book'); —- 字段likes的类型中没有girl和book,存储失败,使用类型enum(单选),set(多选),值必须在其范围之内## 约束条件:
### 作用限制字段赋值```sql
desc t1;Null Key Default Extra —- 这四列为约束条件
Null —- 指是否允许为字段赋空值;—- YES,允许给字段赋空值,默认也是允许赋空值;—- NO, 不允许给字段赋空值;
Key:键值
Default —- 当不给字段赋值时,则使用默认值,初始默认值为 NULL,可以修改
Extra —- 额外的设置, 例如:可以设置学号为自动增长的### 设置约束条件| null | 允许为空(默认设置) |
| —- | —- |
| not null | 不允许为 null(空)|
| key | 键值类型 |
| default | 设置默认值,缺省为 NULL |
| extra | 额外设置 |#### 环境准备:```sql
create database test;
use test;
create table t1(name char(15), s_year year, uptime time, birthday date, party datetime);2
insert into t1 values("bob", 1990,083000, 20231120, 20230214183000);
insert into t1 values("tom",2000,time(now()),curdate(),now());
insert into t1(s_year) values(03),(81);
select * from t1;
create table t2(name char(15), sex enum("boy", "girl", "no"), likes set("eat","money", "game", "music"));
desc t2;
验证约束条件 Null,可以给字段赋空值
insert into t2 values ('bob','boy','eat,game');
select * from t2;
insert into t2 values (null,null,null); —- t2表中可以插入null(没有数据)
select * from t2;
insert into t2(name) values ('tom'); —- 只给name字段赋值,其他字段会使用默认值赋值
select * from t2;
建表时指定字段值不为空和设置默认值
create table t3( name char(10) not null, age tinyint unsigned default 18, class char(8) not null default 'NSD2006');
desc t3;
insert into t3(name) values("john"); —- 只插入name字段,则其他字段采用默认值
select * from t3;
向t3表中插入数据,所有字段自己定义,可以不使用默认值
insert into t3 values("tom", 29, "nsd2003");
select * from t3;
验证 null 值和"null"值
null 指的是没有任何的数据3
“null” 指的是有数据,但数据的内容为"null"
desc t3;
insert into t3 values(null,null,null); —- name字段不能为空,存储失败
insert into t3 values("null",null,null); —- 给name字段加引号,不代表空值,而是代表字符串,存储失败,class 字段不能为空
insert into t3 values("null",null,""); —- class字段直接加引号,不为空,是0个字符
select * from t3;
修改表结构:
语法结构:
用法:
alter table 库名.表名 执行动作;
执行动作:
add:添加新字段
modify:修改字段类型
drop:删除字段
change:修改字段名
rename:修改表名
添加新字段
用法
—- 新字段默认添加在字段末尾
alter table 库名.表名
add 字段名 类型(宽度) 约束条件 [after 字段名 | first];
向 t1 表中插入一个字段 email, 不为空,默认值为"stu@tedu.cn",不指定表字段的位置,默认会插入到表的最后
desc t1;
alter table t1 add email varchar(30) not null default "stu@tedu.cn";
desc t1; —- email字段在最下方
select * from t1; —- t1表中的数据也会多出一行,值为默认值
向 t1 表的最前面插入一个字段 stu_id, 约束条件采用默认系统设置
alter table t1 add stu_id char(9) first;
desc t1; —- stu_id字段位于表的首位
select * from t1; —- stu_id没有指定默认值,默认为NULL
在 t1 表中的 name 字段后,插入一个新字段 sex,类型为枚举类型,默认值为:boy
alter table t1 add sex enum("boy", "girl") default "boy" after name;
desc t1; —- sex字段位于name字段的后面
select * from t1; —- 多出一列sex,默认值为boy
修改字段类型
基本用法
- 修改的字段类型不能与已存储的数据冲突
alter table 库名.表名
modify 字段名 类型(宽度) 约束条件 after 字段名 | first];
修改 t1 表的 sex 字段,设置默认值为 man
alter table t1 modify sex enum("man", "woman") default "man";#修改失败,字段里需要包含原表中的数据类型boy,否则冲突
alter table t1 modify sex enum("man", "woman", "boy") default "man"; #修改成功,sex字段中存在和表中数据相同的类型'boy'5
desc t1;
修改 t1 表中的 name 字段类型,修改为 varchar(15)
desc t1;
alter table t1 modify name varchar(15);
desc t1;
使用 modefy 实现字段值的位置调换
将 email 字段移到 sex 字段的后面
alter table t1 modify email varchar(30) not null default “stu@tedu.cn” after sex;
desc t1;
select * from t1; #数据不发生变化
删除字段
基本用法
- 表中有多条记录时,所有列的此字段的值都会被删除
after table 库名.表名 drop 字段名;
删除 t1 表中的字段 stu_id
select * from t1;
alter table t1 drop stu_id;
select * from t1;
desc t1;
删除 t1 表中的多个字段(email 和 party)
alter table t5 drop email,drop party;6
修改字段名
基本用法
after table 库名.表名 change 原字段名 新字段名 类型 约束条件;
修改 t1 表中 s_year 的字段名,使用 change 命令将字段 s_year 的名字改为 abc
alter table t1 change s_year abc year;
修改表名
基本用法
- 表对应的文件名,也被改变
- 表记录不受影响
after table 表名 rename 新表名;
使用rename命令来修改t5表的表名为stuinfo
alter table t1 rename stuinfo;
show tables;
Mysql 键值概述
根据数据存储要求,选择键值
index | 普通索引 |
---|---|
unique | 唯一索引 |
fulltext | 全文索引 |
primary key | 主键 |
foreign key | 外键 |
index、primary key、foreign key #生产环境一定会用到的键值类型
索引介绍
类似于书的目录
对表中字段值进行排序
索引算法:Btree、B+tree、hash
Btree 算法(二叉树):
- 查找数字 5 时,先用数字 5 和数字 4 对比;
- 当数字 5 大于数字 4,则直接从数字 4 的右分支进行查找;
- 接下来用要查找的数字 5 和数字 6 对比;2
- 当数字 5 小于数字 6,则直接从数字 6 的左分支进行查找;
- 按照以上的方式继续比对查找,直到查找到数据为止;
索引的优缺点
生产环境下,对数据查的请求远远高于对数据写的请求;
普通索引 index
使用规则
创建索引
建表的时候创建索引:index(字段名), index(字段名)…
创建 t1 表时,将 name 字段和 class 字段设置为索引
create table t1(name char(10), class char(9), sex enum("m", "w"), index(name),index(class));
desc t1; —- 约束条件Key变为MUL(索引的标志)
在已有的表里创建索引:```sql
create index 索引名 on 表名(字段名);
create table t2 ( name char(16), pay float(5,2) );
desc t2;
在已有表 t2 表中为字段创建索引 xxx(索引名称可以随便定义)
create index xxx on t2(name);
desc t2;
查看索引
语法格式:
show index from 表名 \G;
show index from t1\G;*************************** 1. row ***************************Table: t9 —- 表名Non_unique: 1Key_name: name —- 索引名Seq_in_index: 1Column_name: name —- 字段名...
删除索引
语法格式:
drop index 索引名 on 表名;
删除 t1 表中的索引 name
drop index name on t1;
desc t1;
show index from t1\G;4
MySQL 主键 primary key:
创建主键
主键的作用:限制字段赋值
主键的使用规则
创建表时,表中存在类似身份证号,编号等时,将表中的该字段设置为主键,让其不能重复,可以自动增长。
创建主键
建表时创建主键,命令:
primary key
(字段名)创建 t3 表,字段有:姓名(name),年龄(age) ,将 name 字段设置为主键 primary key
create table t3(name char(10) primary key, age int);
desc t10; —- 查看t3表的表结构,key的值为PRI,则代表该字段为主键,在表t3中插入数据,主键所在的字段,数据不能重复,不允许有空值
insert into t3 values("bob",29); —- 成功
insert into t3 values("bob",39); —- 失败,主键字段的数据重复
insert into t3 values("jim",19); —- 成功
insert into t3 values(null,29); —- 失败,主键所在的字段值不能为NULL值
insert into t3 values("null",39); —- 成功,加引号代表的是字符串5
insert into t3 values("",59); —- ””指没有内容,不代表null
select * from t3;
在已有表里创建主键
语法格式:
alter table 表名 add primary key(字段名列表);
将表中的字段设置为主键时,则表中该字段的值不能为空,也不能重复,否则添加失败; 表中没有数据时,添加成功
select * from t1;
desc t1; #查看t1表的表结构,原先没有主键,允许数据重复
alter table t1 add primary key(name); #将t1表中的字段name设置为主键
desc t1;
删除主键
语法格式:
alter table 表名 drop primary key;
删除 t1 表的主键
alter table t1 drop primary key;
desc t1; #主键消失,但是name字段的约束条件不许为空,可以重复插入数据
insert into t1 values('bob','NSD2001','m'); #成功
insert into t1 values('bob','NSD2002','m'); #成功
insert into t1 values(null,'NSD2002','m'); #失
create table yg(yg_ id int primary key auto increment,name char(15))engine=innodb;
desc yg;
insert into yg(name) values('bob);
insert into yg(name) values('tom");
select * from yg;
create table gz(
gz_id int,
pay float(5,2),
foreign key(gz id) references yg(yg id) on update cascade on delete cascade)engine=innodb;
show create table gz\G -- 通过查看建表过程,来查看表是否创建
外键外键设置成功之后,gz (工资表)插入数据时,编号必须在yg (员工表)的yg_id范围之内
select * from ygi
insert into gz values(1,300.00);
insert into gz values(2,500.00);
insert into gz values(3,300.00); -- 插入失败,编号必须在yg (员工表)编号范围之内
在yg表里插入一条记录,用户名为john,编号采用自增长
insert into yg(name) values(john);
select * from yg
在gz表里插入记录,是否可以插入
insert into gz values(3,300.00);
select * from gz;
测试同步删除和同步更新
delete from yg where yg_id=3;
select * from yg;
select from gz;
update yq set yg id=6 where name="tom"
select * from yg;
select * from gz;
设置成外键的表字段也必须将其设置为主键,否则会出现对于同一个编号可以插入多次数据的情况,也会出现编号为null,插入数据同样成功的情况
desc gz;
insert into gz values(1,200.00);
insert into gz values(6,200.00);
select * from gz;
insert into gz values(null,200.00);
select * from gz;
将表中的外键字段设置为主键
delete from gz;
select * from gz;
alter table gz add primary key(gz id);
desc gz;
insert into gz values(null,200.00);
insert into gz values(1,200.00);
insert into gz values(1,200.00);
insert into gz values(6,200.00);
insert into gz values(6,200.00);
insert into gz values(7,200.00);
###删除表当一个表被其他表所依赖时,该表则不可以被删除删除方法有2种:
- 删除表中的外键
- 先删除gz (工资表)
drop table yg;#直接删除失败
删除外键:
语法格式:
alter table 表名 drop foreign key 名称;
show create table gz\G
alter table gz drop foreign key gz_ibfk_1;
show create table gz\G
drop table yg;
构建mysq图形管理界面
yum -y install httpd
systemctl start httpd
yum -y install php php-mysql
tar -xf phpMyAdmin-2.11.11-all-languages.tar.gz
ls phpMyAdmin-2.11.11-all-languages
mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpmyadmin
ls /var/www/html/
ls /var/www/html/phpmyadmin/
cd /var/www/html/phpmyadmin/
cp config.sample.inc.php config.inc.phpvim config.inc.php17 $cfg['blowfish_secret'] = 'wj123'; #指定COOKIE的值,做认证,自定义31 $cfg['Servers'][$i]['host'] = 'localhost'; #指定数据库服务器的地址systemctl restart httpd
firefox http://192.168.4.10/phpmyadmin
范围匹配
in (值列表 )
|
在…里 |
---|---|
not in (值列表 )
|
不在…里… |
between 数字 and 数字
|
在…之间… |
举例:
select name,uid from user where name in("mysql","bin","null");
select name,uid from user where uid in(3,6,9,15);
select name,shell from user where shell not in("/bin/bash","/sbin/nologin")
select name,uid from user where uid between 15 and 30;
select name,uid from user where uid between 15 and 100;
select id,name,uid from user where id between 10 and 13;
逻辑匹配
多个条件判断时使用
or | 逻辑或 | 有一个条件成立即可 |
---|---|---|
and | 逻辑与(且) | 所有条件都要成立才可以 |
!或not | 逻辑非 |
举例
select name,uid from user where name="root" and shell ="/sbin/nologin";
select name,uid from user where name="root" and shell="/bin/bash";
select name,uid from user where name="root" or shell="/sbin/nologin";
select name,uid,shell from user where name="root" or shell="/sbin/nologin";
select name,uid,shell from user where shell !="/bin/bash";select name,uid,shell from user where shell="/bin/bash";
select name,uid,shell from user where shell in ("/bin/bash","/sbin/nologin");
select name,uid,shell from user where shell not in ("/bin/bash","/sbin/nologin");
高级匹配条件
模糊查询
格式: where 字段名 like “通配符”
_ | 表示1个字符 |
---|---|
% | 表示0-n个字符 |
select name from user where name like "_";
select name from user where name like "____";
select name from user where name like "%a%";
select name from user where name like "a%";
select name from user where name like "__%__";
正则表达式格式
格式:
where 字段 regexp "正则表达式"
正则元字符:
^
$
.
[]
*
|
^ | 匹配输入字符串的开始位置 |
---|---|
$ | 匹配输入字符串的结束位置 |
. | 匹配除 “\n” 之外的任何单个字符 |
[…] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’ |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,} |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food” |
select name from user where name regexp "^r";
select name from user where name regexp "^a";
select name from user where name regexp "^a|t$";;
select name from user where name regexp "^r.*t$";
select name from user where name regexp "[0-9]";
insert into user(name) values("haha99"),("66haha"),("6xixi"),("ya7ya");
select name from user;
select name from user where name regexp "[0-9]"; -- 查询user表用户名包含数字的name字段
select id,name,uid from user where id<=5;
update user set uid=uid+1 where id<=5;
select id,name,uid from user where id <=5;
update user set uid=uid-1 where id<=5;
select id,name,uid from user where id<=5;
select name,uid from user where id<=5;
select name,uid from user where uid % 2=0;
select name,uid from user where uid % 2 !=0;
select name,uid,gid from user where name="halt";
select name,uid,gid,(uid+gid)/2 from user where name="halt"; -- 显示uid和gid的平均值,默认以算法作为临时字段名
alter table user add age tinyint unsigned default 20 after name;
desc user;
select * from user;
select name,age,2023-age start_y from user where name="root"; -- start_y临时字段名
聚集函数
MySQL内置数据统计函数(字段必须是数值类型)
avg(字段名) | 统计字段平均值 |
---|---|
sum(字段名) | 统计字段之和 |
min(字段名) | 统计字段最小值 |
max(字段名) | 统计字段最大值 |
count(字段名) | 统计字段值个数 |
举例
select avg(uid) from user;
select sum(uid) from user;
select min(uid) from user;
select max(uid) from user;
select count(*) from user;
select count(*) from user where name like "___";
select count(name) from user where name like "___";
排序
格式: SQL查询 order by 字段名 [asc|desc] 升序|降序
select name,uid from user where uid>=10 and uid<=200;
select name,uid from user where uid>=10 and uid<-200 order by uid;
select name,uid from user where uid>=10 and uid<=200 order by uid desc;
分组
格式: SQL查询 group by 字段名
select shell from user where uid<500;
select shell from user where uid<500 group by shell;
去重显示格式: select distinct 字段名 from 表名
select distinct shell from user where uid<500;
限制查询结果
显示行数用法
SQL查询limit数字; //显示查询结果前多少条记录
SQL查询limit数字1,数字2; //显示指定范围内的查询记录
数字1 起始行(0表示第1行)
数字2 总行数
select name,uid,gid from user limit 3;
select name,uid,gid from user limit 3,3;
查询user表中gid最大的前5个用户使用的shell
select name,gid,shell from user order by gid desc limit 5;
把gid最小的前5个用户信息保存到/myload/min5.txt文件里
select name,gid,shell from user order by gid limit 5 into outfile "/var/lib/mysql-files/min5.txt";
system cat /var/lib/mysql-files/min5.txt 1
用户授权
grant 授权
授权:添加用户并设置权限
命令格式
-- 客户端
grant 权限列表 on 库名 to 用户名@"客户端地址"identified by "密码" -- 授权用户密码with grant option; -- 有授权权限,可选项grant all on db4.* to yaya@"%" identified by"123qqq...A";
权限列表
all – 所有权限
usage – 无权限
select,update,insert – 个别权限
select, update (字段1, .字段N) – 指定字段库名
库名
. – 所有库所有表
库名.* – —个库
库名.表名 – 一张表
- 用户名
- 授权时自定义 要有标识性
- 存储在mysql库的user表里
客户端地址
% – 所有主机
192.168.4.% – 网段内的所有主机
192.168.4.1 – 1台主机
localhost – 数据库服务器本机
应用示例1
- 添加用户mydba,对所有库、表有完全权限
- 允许从任何客户端连接,密码123qqq…A
- 且有授权权限
grant all on *.* to mydba@"%" dentified by "123qqq...A" with grant option;
应用示例2
- 添加admin用户,允许从192.168.4.0/24网段连接,对db3库的user表有查询权限,密码123qqq…A
- 添加admin2用户,允许从本机连接,允许对db3库的所有表有查询/更新/插入/删除记录权限,密码123qqq…A
grant select on db3.user to admin@"192.168.4.%" identified by "123qqq...A";
grant select,insert,update,delete on db3.* to admin2@"localhost" identified by "123qq...A";
示例3:
添加用户mydba,对所有库所有表有完全权限,允许从任何客户端连接,密码为123qqq…A,且有授权权限
-- 虚拟机svr7操作
mysql -uroot -p'123qqq...A'
grant all on *.* to mydba@"%" identified by '123qq...A' with grant option;``虚拟机pc207测试:
yum -y install mariadb
mysql -h192.168.4.7 -umydba -p'123qq...A'
登录用户使用
select user(); -- 显示登录用户名及客户端地址
show grants; -- 用户显示自身访问权限
show grants for用户名@"客户端地址"; -- 管理员查看已有授权用户权限
set password=password("密码"); -- 授权用户连接后修改连接密码
set password for用户名@"客户端地址"= password("密码"); -- 管理员重置授权用户连接密码
drop user 用户名@"客户端地址"; -- 删除授权用户(必须有管理员权限)
示例:
虚拟机pc207
yum-y install mariadb
mysql -h192.168.4.7-umydba -p'123qqq...A'
select user(); -- 查看当前的登录用户及客户端地址
show grants; -- 查看当前登录用户mydba所拥有的权限
虚拟机svr7
show grants for mydba@"%"; -- 管理员查看已有授权用户权限
虚拟机pc207
set password=password("456aaa...A"); -- 授权用户修改自己的连接密码
exitmysql -h192.168.4.7 -umydba -p'456aaa...A'
exit -- 使用新密码登录数据库
虚拟机svr7
set password for mydba@"%"=password("123qqq ..A"); -- 管理员重置授权用户连接密码
虚拟机pc207
mysql-h192.168.4.7 -umydba -p'123qqq...A'
测试权限
pc207
mysql -h192.168.4.7 -umydba -p'123qqq...A'
show grants;
show databases
drop database test;
create database test;
create database bbsdb;
grant all on bbsdb.* to abc@"localhost" identified by '123qqq..A; -- 用户mydba可以给其他用户授权虚拟机
svr7
mysql -uabc -p'123qq..A'
# 删除授权用户mydba (必须有管理员权限)
mysql -uroot -p '123qqq...A';
drop user mydba@"%";
pc207
mysql -h192.168.4.7 -umydba -p'123qqq...A' -- 连接失败
应用示例4:
- 添加admin用户,允许从192.168.4.0/24网段连接,对db3库的user表有查询权限,密码123qqq…A
- 添加admin2用户,允许从本机连接,允许对db3库的所有表有查询/更新/插入/删除记录权限,密码123qqq…A
grant select on db3.user to admin@"192.168.4.%" identified by "123qqq...A";
grant select,insert,update,delete on db3.* to admin2@"localhost" identified by "123qqq...A";
svr7
mysql -uroot -p'123qqq...A'
添加admin用户,允许从192.168.4.0/24网段连接,对db3库的user表有查询权限,密码为123qqq…A
grant create,select on db3.user to admin@"192.168.4.%" identified by '123qqq...A'; -- 给用户授权时如果不是all权限,当对应的库和表不存在时必须有create权限
添加admin2用户,允许从本机连接,对db3库的所有表有查询/更新/插入/删除权限,密码为123qqq…A
grant create,select,update,insert,delete on db3.* to admin2@"localhost" identified by '123qqq...A';
create database db3;
exit
pc207:测试admin用户的权限
mysql -h192.168.4.7 -uadmin -p'123qqq...A'
show grants;
create table db3.user(name char(50),sex enum("m","w");
select * from db3.user;
insert into db3.user values("bob","m"); -- 插入失败
svr7:测试admin2用户的权限,只能从本机登录
mysql -uadmin2 -p'123qqq...A'
show grants;
use db3;
show tables;
insert into db3.user values("bob","m");
select * from user;
delete from user;
create table t1(id int);
授权库
mysql库记录授权信息,主要表如下:
user表 |
记录已有的授权用户 及权限
|
---|---|
db表 |
记录已有授权用户对数据库 的访问权限
|
tables_priv表 |
记录已有授权用户对表 的访问权限
|
columns_priv表 |
记录已有授权用户对字段 的访问权限
|
查看表记录可以获取用户权限;也可以通过更新记录,修改用户权限
- mysql库记录授权信息,主要表如下:
user表 | 记录已有的授权用户及权限 |
---|---|
db表 | 记录已有授权用户对数据库的访问权限 |
tables_priv表 | 记录已有授权用户对表的访问权限 |
columns_priv表 | 记录已有授权用户对字段的访问权限 |
mysql -uroot-p'123qq...A'
select user,host from mysql.user;
show grants for admin@"192.168.4.%"; -- 查看admin用户的权限
select * from mysql.user where host="192.168.4.%" and user="admin"\G
select * from mysgl.tables priv where host="192.168.4.%" and user="admin"\G
desc mysql.tables priv\G
update mysql.tables_priv set Table_priv="select,create,insert,update" where user="admin" and host="192.168.4.%"; -- 通过改表字段的值修改授权用户权限
flush privileges; -- 刷新,让配置生效
select * from mysql.tables_priv where host="192.168.4.%" and user="admin"\G
show grants for admin@"192.168.4.%";
desc mysql.db;
select host,db,user from mysgl.db;
select * from mysql.db where db="db3"\G
show grants for admin2@"localhost";
update mysql.db set Delete_priv="N" where user="admin2";
flush privileges;
show grants for admin2@"localhost";
select * from mysql.db where db="db3"\G
desc mysql.columns_priv;
select * from mysql.columns_priv;
grant select,update(name) on db3.user to admin2@"localhost" identified by "123qqq...A";
select * from mysql.columns_priv;
show grants for admin2@"localhost";
撤销权限
- 命令格式
revoke 权限列表 on 库名.表 from 用户名@“客户端地址”;
REVOKE insert,drop ON test.* FROM sqler02@'localhost';
select host,user from mysql.user;
show grants for admin@"192.168.4.%";
revoke update,create on db3.user from admin@" 192.168.4.%";
show grants for admin@"192.168.4.%";
select * from mysgl.tables priv where user='admin"\G
select host,user from mysql.user;
show grants for admin2@"localhost";
revoke insert,update on db3.* from admin2@"localhost";
show grants for admin2@"localhost";
revoke all on db3.* from admin2@"localhost";
show grants for admin2@"localhost";
revoke all on db3.user from admin2@"localhost";
show grants for admin2@"localhost";
drop user admin2@"localhost";
exit
enum set字段用法
create table t7(name char(10),sex enum('boy','girl'),likes set('eat','money','play','game','music'));
desc t7;
insert into t7 values ('bob','boy','eat,money');
select * from t7;
insert into t2 values (null,null,null); -- 插入全为空
insert into t2(name) values('tom') -- name字段不为空,其余为空create table t3(name char(10) not null,age tinyint unsigned default 18,class char(8) not null default 'NSD2006');
desc t3;
insert into t3(name) values('zs');
select * from t3; -- 显示name字段,其余自动赋值
insert into t3 values ('tom',29,'NSD2007');
select * from t3; -- 正常赋值
insert into t3 values (null,null,null); -- 失败,name字段不允许为空
insert into t3 values ("null",null,null); -- 失败,class字段不允许为空
insert into t3 values ("null",null,""); -- null用引号引起来代表是普通字符,直接加引号,不为空,是0个字符
select * from t3;
向t1表添加字段email,不指定字段位置,默认插入到表的最后
alter table t1 add email varchar(30) not null default "stu@tedu.cn";
desc t1;
向t1表最前面添加字段stu_id
alter table t1 add stu_id char(9) first;
desc t1;
向t1表中name字段后插入新字段sex
alter table t1 add sex enum('boy','girl') default 'boy' after name;
desc t1;
使用modify修改t1表的sex字段,设置默认值为man
alter table t1 modify sex enum('man','woman','boy')default 'man'; --字段里需要包含原表中的数据类型boy,否则冲突
desc t1;
select * from t1;
desc t1;
修改t1表中的name字段类型,修改为varchar
alter table t1 modify name varchar(15);
desc t1;
将email字段移动到sex字段的后面,其他不变
alter table t1 modify email varchar(30) not null default 'stu@tedu.cn' after sex;
desc t1;
select * from t1; -- 数据不发生变化
删除t1表中的stu_id字段
alter table t1 drop stu_id;
desc t1;
select * from t1;
删除t1表中的多个字段(email和party)
alter table t1 drop email,drop party;
desc t1;
select * from t1;
修改t1表的name字段名称改为abc
desc t1;
alter table t1 change name abc varchar;
desc t1;
将t1表重命名为stuinfo
alter table t1 rename stuinfo;
show tables;
desc stuinfo;
index | 普通索引 |
---|---|
unique | 唯一索引 |
fulltext | 全文索引 |
primary key | 主键 |
foreign key | 外键 |
查看索引
show index from t1\G;
创建索引
create table t1( name char(15),class char(9), sex enum('boy','girl'), index(name),index(class) );create table t2(name char(16),pay float(5,2));
desc t2;
create index xxx on t2(name);
desc t2;
删除索引
drop index name on t1;
desc t1;
show index from t1\G;
主键 & 外键
create table t3(name char(16) primary key,age int);
desc t3;
insert into t3 values ('bob',29);
mysql> insert into t3 values ('bob',39);
ERROR 1062 (23000): Duplicate entry 'bob' for key 'PRIMARY'
insert into t3 values ('tom',39);
select * from t3;
mysql> insert into t3 values (null,39);
ERROR 1048 (23000): Column 'name' cannot be null
select * from t3;
show tables;
desc t1;
alter table t1 add primary key(name);
desc t1;
alter table t1 drop primary key;
desc t1;
主键auto_increment连用
语法格式:字段名 类型 primary key auto_increment
功能:字段通过自加一方式赋值
auto_increment:自增长(如果不给自增长字段赋值,该字段每次自加1给自己赋值),自增长通常和主键一起连用
create table t1( id int primary key auto_increment,name char(10),age tinyint,class char(10));
desc t1;
insert into t1(name,age,class) values('bob',19,'nsd2002');
select * from t1;
insert into t1(name,age,class) values('tom',29,'nsd2002');
select * from t1;
insert into t1(name,age,class) values('tom',29,'nsd2003');
select * from t1;
自增长字段也可以给字段赋值,下次该字段自增长时,从新的数字自加1赋值
insert into t1 values (7,'lucy',18,'nsd2011');
select * from t1;
insert into t1 (name,age,class) values('toma',29,'nsd2003');
select * from t1;
主键的值不能为null,也不能重复,当给一个字段添加了主键,并设置自增长,在赋值时如果该字段的值为null,也可以成功插入数据。因为自增长属性会自动加1插入数据
insert into t1 values (null,'john',19,'nsd2011');
select * from t1;
设置了自增长字段id的表,当删除所有数据后,重新插入数据如果不指定id字段的值,默认还是以前的id值继续增长
delete from t1;
insert into t1 (name,age,class) values ('tomb',29,'nsd2003');
select * from t1;
create table t2 (cip char(15),port int, status enum("yes","no"),primary key(cip,port));
desc t2;
insert into t2 values('1.1.1.1',21,'no'); --成功
select * from t2;
insert into t2 values('1.1.1.1',21,'yes'); --失败,cip字段和port字段同时重复
insert into t2 values('1.1.1.1',22,'yes'); --cip字段值相同,port字段值不同,成功
insert into t2 values('2.1.1.1',22,'yes'); --cip字段值不同,port字段值相同,成功
select * from t2;
删除表的复合主键
alter table t2 drop primary key;
desc t2;
没有复合主键后,插入记录允许重复,不允许赋空值,约束条件NULL限制
insert into t2 values('2.1.1.1',22,'yes');
insert into t2 values(null,null,'yes');
在已有表里创建复合主键
语法格式:alter table 表名 add primary key (字段名1,字段名2…)
alter table t2 add primary key(cip,port); --创建失败,表中的记录有重复
delete from t2;
alter table t2 add primary key(cip,port);
desc t2;
insert into t2 values('2.2.2.2',22,'no');
select * from t2;
create table yg(yg_id int primary key auto_increment,name char(15))engine=innodb;
desc yg;
insert into yg(name) values('bob');
insert into yg(name) values('tom');
select * from yg;
create table gz( gz_id int,pay float(5,2),foregin key(gz_id) references yg(yg_id) on update cascade on delete cascade)engine=innodb;
show create table gz\G --通过查看建表过程,来查看表是否创建外键
外键设置成功之后,gz(工资表)插入数据时,编号必须在yg(员工表)的yg_id范围之内
select * from yg;
insert into gz values(1,300.00);
insert into gz values(2,500.00);
insert into gz values(3,300.00); --插入失败,编号必须在yg(员工表)编号范围之内
在yg表里插入一条记录,用户名为john,编号采用自增长
insert into yg(name) values('john');
select * from yg;
在gz表里插入记录,是否可以插入
insert into gz values(3,300.00);
select * from gz;
测试同步删除和同步更新
delete from yg where yg_id=3;
select * from yg;
select * from gz;
update yg set yg_id=6 where name="tom";
select * from yg;
select * from gz;
设置成外键的表字段也必须将其设置为主键,否则会出现对于同一个编号可以插入多次数据的情况,也会出现编号为null,插入数据同样成功的情况
desc gz;
insert into gz values(1,200.00);
insert into gz values(6,200.00);
select * from gz;
insert into gz values(null,200.00);
select * from gz;
将表中的外键字段设置为主键
delete from gz;
select * from gz;
alter table gz add primary key(gz_id);
desc gz;
insert into gz values(null,200.00);
insert into gz values(1,200.00);
insert into gz values(1,200.00);
insert into gz values(6,200.00);
insert into gz values(6,200.00);
insert into gz values(7,200.00);
删除表当一个表被其他表所依赖时,该表则不可以被删除
删除方法有2种:
1)删除表中的外键
2)先删除gz (工资表)
drop table yg; #直接删除失败
删除外键:
语法格式:
alter table 表名 drop foreign key 名称;
show create table gz\G
alter table gz drop foreign key gz_ibfk_1;
show create table gz\G
drop table yg;
数据导入/导出
检索目录
show variables like '%file%'; --查看文件默认的检索目录
system ls /var/lib/mysql-files; --在mysql下执行Linux系统命令
exit
修改检索目录
vim /etc/my.cnf
secure_file_priv="/myload"mkdir /myload
chown mysql /myload/
ls -ld /myload
systemctl restart mysqld
mysql -uroot -p'123qqq...A'
show variables like '%file%';
数据导入:把系统文件的内容存储到数据库的表里,默认只有数据库管理员root用户有数据导入权限
数据导入步骤:
1、建表
2、拷贝文件到检索目录下
3、导入数据
语法格式:load data infile “/目录名/文件名” into table 库名.表名 fields terminated by “分隔符” lines terminated by “\n”;
use test;
create table test.user( name char(50),password char(1),uid int,gid int,comment varchar(150),homedir char(100),shell char(50));
desc user;
select * from user;
system cp /etc/passwd /myload;
system ls /myload;passwdload data infile "/myload/passwd" into table user fields terminated by ":" lines terminated by "\n";
select * from user;
为了方便管理,在user表的最前面设置行号字段id(主键和自增长)
alter table user add id int primary key auto_increment first;
select * from user;
数据导入注意事项
1、字段分隔符要与文件一致
2、表字段类型和字段个数要与文件内容匹配
3、导入数据时指定文件的绝对路径
数据导出:
语法格式:
格式1:select 命令 into outfile “/目录名/文件名”;
格式2:select 命令 into outfile “/目录名/文件名” fields terminated by “分隔符”;
格式3:select 命令 into outfile “/目录名/文件名” fields terminated by “分隔符” lines terminated by “\n”;
从user表中,查询出name,homedir,shell字段的前3行记录
select name,homedir,shell from user limit 3;
导出查询出的数据到user.txt文件中,不指定分隔符时,默认以一个tab为分隔符
select name,homedir,shell from user limit 3 into outfile "/myload/user.txt";
system cat /myload/user.txt;
导出查询出的数据到user2.txt文件中,各字段之间以#分隔
select name,homedir,shell from user limit 3 into outfile "/myload/user2.txt" fields terminated by "###";
system cat /myload/user2.txt
导出查询出的数据到user3.txt文件中,指定行的间隔符为!默认以"\n"换行符分隔
select name,homedir,shell from user limit 3 into outfile "/myload/user3.txt" fields terminated by "###" lines terminated by "!!!";
system cat /myload/user3.txt;
数据导出注意事项:
1、导出数据行数由SQL查询决定
2、导出的是表记录,不包含字段名
3、自动创建存储数据的文件
4、存储数据文件,具有唯一性
表管理记录
insert into user values(30,'bob','x',3001,3001,'test user','/home/bob','/sbin/nologin');
select * from user;
insert into user values(31,'bob','x',3001,3001,'test user','/home/bob','/sbin/nologin'),(41,'tom','x',3002,3002,'student','/home/tom','/sbin/nologin');
select * from user;
insert into user(name,homedir) values('alice','/home/alice');
select * from user;
insert into user(name) values('alice'),('jack'),('toma');
select * from user;
注意事项:
1、字段值要与字段类型相匹配
2、字符类型的字段,要用""括起来
3、依次给所有字段赋值时,字段名可以省略
4、只给部分字段赋值时,必须明确写出对应的字段名称
5、没有赋值的字段使用默认值或自增长赋值
6、新纪录追加在末尾
查询表记录
语法格式:
格式1:查看所有记录
select 字段1,字段1…字段N from 库名.表名
格式2:条件查询
select 字段1,字段1…字段N from 库名.表名 where 条件表达式
select * from user;
select id,name from test.user;
select id,name from test.user where id<=2;
select id,name from test.user where id<4;
注意事项:
1、*代表所有字段
2、查看当前库表记录时库名可以省略
3、字段列表决定显示列个数
4、条件决定显示行个数
条件匹配更新
语法格式:
格式1:批量更新
update 库名.表名 set 字段名=值,字段名=值,字段名=值…
格式2:条件匹配更新
update 库名.表名 set 字段名=值,字段名=值,字段名=值… where表达式
update user set password='A',comment='student';
update user set password='x',comment='root' where name='root';
注意事项:
1、字段值要与字段类型相匹配
2、对于字符类型的字段,值要用双引号括起来
3、若不使用where限定条件,会更新所有记录
4、限定条件时,只更新匹配条件的记录
删除表记录
基本匹配条件
数值比较
字段类型必须是数值类型
select * from user where uid!=0;
select * from user where id=1;
select name,uid,gid from user where uid=gid;
select name,uid from user where uid<10;
字符比较
字段类型必须是字符类型
select name from user where shell='/sbin/nologin';
select name,shell from user where shell!='/sbin/nologin';
select name,shell from user where name='root';
select name,id from user where name='root';
insert into user(name) values(null),("null"),(""),(NULL);
select name from user;
select name,id from user where name is null;
select name,id from user where name is not null;
select name,id from user where name="";
6.8 练习
案例1:构建mysql服务
- 虚拟机svr7上构建mysql数据库服务
systemctl stop firewalld.service
setenforce 0
tar -xf mysql-5.7.17.tar
yum -y install mysql-community-*.rpm
systemctl start mysqld
systemctl enable mysqld
- 数据库管理员密码设置为tarena
vim /etc/my.cnfvalidate_password_policy=0validate_password_length=6grep password /var/log/mysqld.log
mysql -uroot -p'mysqld.log中的密码'set global validate_password_policy=0;set global validate_password_length=6;alter user root@localhost identified by "tarena";exit
mysql -uroot -ptarena
案例2:数据库基本原理
- 使用mysql命令连接数据库,并查看连接用户
mysql -uroot -ptarenaselect user();
- 创建数据库名为test
create database test;
use test;
- 在数据库test下创建一个名为stu的表,表记录包含如下内容:
学号,姓名,性别,手机号,通信地址 (注:性别用enum类型)
create table stu(学号 char(10), 姓名 char(15), 性别 enum('男','女'), 手机号 char(11), 通信地址 varchar(20)) DEFAULT CHARSET=utf8;
- 往stu表里添加如下记录:
学号 | 姓名 | 性别 | 手机号 | 通信地址 |
---|---|---|---|---|
NSD131201 | 张三 | 男 | 13012345678 | 朝阳区劲松南路 |
SD131202 | 李四 | 男 | 18722223333 | 海淀区北三环西路 |
NSD131203 | 韩梅梅 | 女 | 18023445678 | 东城区珠市口 |
insert into stu values("NSD131201","张三","男",13012345678,"朝阳区劲松南路");
insert into stu values("NSD131202","李四","男",18722223333,"海淀区北三环西路");
insert into stu values("NSD131203","韩梅梅","女",18023445678,"东城区珠市口");
select * from stu;
- 删除stu表记录
delete from test.stu;
select * from stu;
- 删除stu表
drop table test.stu;
show tables;
- 删除test库
drop database test;
show databases;
6.11练习
案例1:构建mysql服务器
要求如下:
- 在虚拟机svr7上构建mysql服务
systemctl stop firewalld.service
setenforce 0
tar -xf mysql-5.7.17.tar
yum -y install mysql-community-*.rpm
rpm -qa | grep mysql
systemctl start mysqld
systemctl enable mysqld
netstat -anptu | grep :3306
ls /var/lib/mysql
- 设置数据库管理员root本机登录密码为redhat
vim /etc/my.cnfvalidate_password_policy=0validate_password_length=6grep password /var/log/mysqld.log
mysql -uroot -p'mysqld.log中的密码'show variables like "%password%"; set global validate_password_policy=0;set global validate_password_length=6;alter user root@localhost identified by "redhat";exit
mysql -uroot -predhat
案例2:SQL命令练习
- 连接到数据库
mysql -uroot -predhat
- 查看所有的数据库
show databases;
- 创建数据库名为tedu,test
create database tedu;
create database test;
- 切换到数据库tedu
use tedu;
- 显示当前在哪个数据库
select database();
- 显示连接的用户
select user();
- 删除数据库tedu
drop database tedu;
show databases;
- 创建stu表,表字段包含name,homedir
create table stu(name char(10), homedir varchar(20));
- 往stu表里添加记录为jim,usa;lilei,china
insert into stu values("jim", "usa");
insert into stu values("lilei", "china");
- 查看表记录
select * from stu;
- 只查看name字段
select name from stu;
- 将homedir表记录值改为beijing
date stu set homedir="beijing";
select * from stu;
- 删除表记录
delete from stu;
- 删除stu表
drop table stu;
案例3:练习数据类型的使用
- 根据如下的表结构创建对应的表并插入记录
表-1
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
name | char(5) | YES | NULL | ||
varchar(10) | YES | NULL | |||
homeaddr | varchar(50) | YES | NULL |
表-2
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
stu_num | int(11) | YES | NULL | ||
name | char(5) | YES | NULL | ||
age | tinyint(4) | YES | NULL | ||
pay | float | YES | NULL | ||
money | float(5,2) | YES | NULL |
表-3
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
name | char(10) | YES | NULL | ||
you_start | year(4) | YES | NULL | ||
up_time | time | YES | NULL | ||
birthday | date | YES | NULL | ||
party | datetime | YES | NULL |
表-4
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
name | char(5) | YES | NULL | ||
likes | set(‘cat’,‘game’,‘film’,‘music’) | YES | NULL | ||
sex | enum(‘boy’,‘girl’,‘no’) | YES | NULL |
注:表3插入记录要求如下:
所有字段值自定义
create table b1(name char(5), mail varchar(10), homeaddr varchar(50)); create table b2(stu_num int(11), name char(5), age tinyint(4), pay float, money float(5,2)); create table b3(name char(10), you_start year(4), up_time time, birthday date, party datetime); create table b4(name char(5), likes set(`cat`,`game`,`film`,`music`), sex enum(`boy`,`girl`,`no`));
用时间函数进行赋值
insert into b3 values('tom', year(now()), time(now()), curdate(), now());
案例4:表结构练习
按照表结构创建如下表,并插入记录
create table b5(class char(9) DEFAULT NULL, name char(10) NOT NULL DEFAULT '', age tinyint(4) NOT NULL DEFAULT 19, likes set('a','b','c','d') DEFAULT 'a,b');
只给class字段和name字段赋值
insert into b5(class,name) values('class1','name1');
在age字段后面添加字段值为性别(sex),默认值为boy
alter table b5 add sex enum('boy', 'girl') default 'boy' after age;
在表最前面添加学号(stu_id)字段
alter table b5 add stu_id int(11) first;
添加邮箱(email)字段,该字段不允许为空,默认值tarena@tedu.cn
alte b5 add email varchar(30) not null default 'tarena@tedu.cn';
修改sex字段类型,默认值为man
alter table b5 modify sex enum('man','boy','girl') default 'man' after age; desc b5;
将email字段移到age字段后面,其他属性不变
alter table b5 modify email varchar(30) not null default 'tarena@tedu.cn' after age;
删除表字段email和stu_id
alter table b5 drop email,drop stu_id;
将该表名改为abc
rename table b5 to abc;
6.18练习
环境准备
将虚拟机A开机
关闭防火墙和SELinux
systemctl stop firewalld.service setenforce 0
配置IP地址为192.168.4.10
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.4.10/24 connection.autoconnect yes nmcli connection up ens33
配置本地yum源
mount /dev/cdrom /mnt echo "[mnt]name=Centos7.5baseurl=file:///mntenabled=1gpgcheck=0" > /etc/yum.repos.d/mnt.repols /etc/yum.repos.d/ mkdir /etc/yum.repos.d/bind mv /etc/yum.repos.d/bind mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/bind ls /etc/yum.repos.d/ yum repolist
构建mysql数据库
systemctl stop firewalld.service setenforce 0 tar -xf mysql-5.7.17.tar yum -y install mysql-community-*.rpm systemctl start mysqld systemctl enable mysqld
数据库管理员密码设置为123qqq…A
vim /etc/my.cnfvalidate_password_policy=0validate_password_length=6grep password /var/log/mysqld.log
mysql -uroot -p'mysqld.log中的密码'show variables like "%password%"; 1set global validate_password_policy=0;set global validate_password_length=6;alter user root@localhost identified by "123qqq...A";exit
mysql -uroot -p123qqq...A
练习:
- 用命令行的形式连接到数据库
mysql -uroot -p123qqq...A
- 在test库下创建一个user表
show variables like '%file%'; --查看文件默认的检索目录 system ls /var/lib/mysql-files; --在mysql下执行Linux系统命令 exit
修改检索目录 vim /etc/my.cnf secure_file_priv="/myload"
mkdir /myload chown mysql /myload/ ls -ld /myload systemctl restart mysqld mysql -uroot -p'123qqq...A' show variables like '%file%';
数据导入:把系统文件的内容存储到数据库的表里,默认只有数据库管理员root用户有数据导入权限 数据导入步骤: 1、建表 2、拷贝文件到检索目录下 3、导入数据
语法格式:load data infile "/目录名/文件名" into table 库名.表名 fields terminated by "分隔符" lines terminated by "\n";
use test; create table test.user( name char(50),password char(1),uid int,gid int,comment varchar(150),homedir char(100),shell char(50)); desc user; select * from user; system cp /etc/passwd /myload; system ls /myload;
passwd
load data infile "/myload/passwd" into table user fields terminated by ":" lines terminated by "\n"; select * from user;
为了方便管理,在user表的最前面设置行号字段id(主键和自增长)
alter table user add id int primary key auto_increment first; select * from user;
- 把存放用户信息的文件导入到test库下的user表
load data infile "/目录名/文件名" into table 库名.表名 fields terminated by "分隔符" lines terminated by "\n";
use test; create table test.user( name char(50),password char(1),uid int,gid int,comment varchar(150),homedir char(100),shell char(50)); desc user; select * from user; system cp /etc/passwd /myload; system ls /myload;
6.21 练习
环境准备
将虚拟机svr7开机
关闭SELiunx和防火墙
systemctl stop firewalld.service setenforce 0
构建MySQL数据库
tar -xf mysql-5.7.17.tar yum -y install mysql-community-*.rpm rpm -qa | grep mysql systemctl start mysqld systemctl enable mysqld netstat -anptu | grep :3306 ls /var/lib/mysql
数据库管理员密码设置为123qq…A
vim /etc/my.cnfvalidate_password_policy=0validate_password_length=6grep password /var/log/mysqld.log
mysql -uroot -p'mysqld.log中的密码'show variables like "%password%"; set global validate_password_policy=0;set global validate_password_length=6;alter user root@localhost identified by "123qq..A";exit
mysql -uroot -p123qq..A
- 将/etc/passwd文件导入到test.user
show variables like '%file%'; -- 查看文件默认的检索目录
system ls /var/lib/mysql-files; -- 在mysql下执行Linux系统命令
exit
# 修改检索目录
vim /etc/my.cnfsecure_file_priv="/myload"mkdir /myload
chown mysql /myload/
ls -ld /myload
systemctl restart mysqld
mysql -uroot -p123qq..Ashow variables like '%file%';create database test;
use test;
create table test.user( name char(50),password char(1),uid int,gid int,comment varchar(150),homedir char(100),shell char(50));
desc user;
select * from user;
system cp /etc/passwd /myload;
system ls /myload;load data infile "/myload/passwd" into table user fields terminated by ":" lines terminated by "\n";
select * from user;
往user表里添加新字段id,设置类型为自增长
alter table user add id int primary key auto_increment first; desc user;
给name字段添加4条记录分别为(null,“null,”,NULL)
insert into user(name) values(null),("null"),(""),(NULL); select * from user;
6.22 练习
- 构建mysql数据库,管理员密码为123qqq…A创建一个名为test库,将/etc/passwd文件导入到test.user
systemctl stop firewalld.service
setenforce 0tar -xf mysql-5.7.17.tar
yum -y install mysql-community-*.rpm
rpm -qa | grep mysql
systemctl start mysqld
systemctl enable mysqld
netstat -anptu | grep :3306
ls /var/lib/mysqlgrep password /var/log/mysqld.log
mysql -uroot -p'mysqld.log中的密码'show variables like "%password%"; set global validate_password_policy=0;set global validate_password_length=6;alter user root@localhost identified by "123qqq...A";exit
mysql -uroot -p123qqq...A
exit
vim /etc/my.cnfsecure_file_priv="/myload"
cat /etc/my.cnfmkdir /myload
chown mysql /myload/
ls -ld /myload
systemctl restart mysqld
mysql -uroot -p123qqq...Ashow variables like '%file%';create database test;show databases;use test;create table test.user( name char(50),password char(1),uid int,gid int,comment varchar(150),homedir char(100),shell char(50));desc user;select * from user;system cp /etc/passwd /myload;system ls /myload;system chown mysql /myload;load data infile "/myload/passwd" into table user fields terminated by ":" lines terminated by "\n";select * from user;
- 在用户名字段下方添加s_year字段 存放出生年份 默认值是1990
alter table user add s_year year default 1990 after name;
- 在用户名字段下方添加字段名sex 字段值只能是gril 或boy 默认值是 boy
alter table user add sex enum('girl','boy') default 'boy' after name;
- 在sex字段下方添加 age字段 存放年龄 不允许输入负数。默认值 是 21
alter table user add age tinyint unsigned default 21 after sex;
- 把uid字段值是10到50之间的用户的性别修改为 girl
update user set sex='girl' where uid between 10 and 50;
- 统计性别是girl的用户有多少个。(count(*)统计个数)
select count(*) from user where sex="girl";
- 查看性别是girl用户里 uid号 最大的用户名 叫什么。(看最大值用max)
select name from user where uid=(select max(uid) from user where sex='girl');
- 添加一条新记录只给name、uid 字段赋值 值为rtestd 1000
insert into user(name,uid) values("rtestd", 1000);
- 加一条新记录只给name、uid 字段赋值 值为rtest2d 2000
insert into user(name,uid) values("rtest2d", 2000);
- 显示uid 是四位数的用户的用户名和uid值。
select name, uid from user where uid>=1000;
- 显示名字是以字母r 开头 且是以字母d结尾的用户名和uid。
select name, uid from user where name regexp "^r.*d$";
- 查看是否有名字以字母a开头 并且是以字母c结尾的用户。
select name, uid from user where name regexp "^a&c$";
- 把 gid 在100到500间用户的家目录修改为/root
update user set comment='/root' where gid between 100 and 500;
- 把用户是 root 、 bin 、 sync 用户的shell 修改为 /sbin/nologin
update user set shell='/sbin/nologin' where name in('root','bin','sync');
- 查看 gid 小于10的用户 都使用那些shell
select shell from user where gid<10;
- 删除 名字以字母d开头的用户。
delete from user where name regexp '^d';
- 查看那些用户没有家目录
select name from user where lujing='/';
- 使用系统命令useradd 命令添加登录系统的用户名为lucy
system useradd lucy;
system ls /home;
- 把lucy用户的信息添加到user表里
system cat /etc/passwd
insert into user values('lucy',null,null,null,'x',1001,1001,null,'/home/lucy','/bin/bash');
- 删除表中的 comment 字段
alter table user drop comment;
desc user;
- 设置表中所有name字段值不允许为空
alter table user modify name char(50) not null;
- 删除root用户家目录字段的值
update user set homedir=null where name='root';
- 显示 gid 大于500的用户的用户名家目录和使用的shell
select name,homedir,shell from user where gid>500;
- 删除uid大于100的用户记录
delete from user where uid>100;
- 显示uid号在10到30区间的用户有多少个。
select count(*) from user where uid between 10 and 30;
- 显示uid号是100以内的用户使用的shell。
select shell from user where uid<=100;
- 显示uid号小于50且名字里有字母a 用户的详细信息
select * from user where uid<50 and name like "%a%";
- 只显示用户 root bin daemon 3个用户的详细信息。
select * from user where name in('root','bin','daemon');
- 显示除root用户之外所有用户的详细信息。
select * from user where name!='root';
- 显示名字里含字母c用户的详细信息
select * from user where name like '%c%';
- 在sex字段下方添加名为pay的字段,用来存储工资,默认值15000.00
alter table user add pay float(7,2) default 15000.00 after sex;
- 把所有女孩的工资修改为10000
update user set pay=10000.00 where sex='girl';
- 把root用户的工资修改为30000
update user set pay=30000 where name='root';
- 给adm用户涨500元工资
update user set pay=pay+500 where name='adm';
- 查看所有用户的名字和工资
select name,pay from user;
- 查看工资字段的平均值(平均值用avg)
select avg(pay) from user;
- 显示工资字段值小于平均工资的用户名
select name from user where pay<(select avg(pay) from user);
- 查看女生里uid号最大用户名
select name from user where uid=(select max(uid) from user where sex='girl');
- 查看bin用户的uid gid 字段的值 及 这2个字段相加的和
select uid,gid,uid+gid from user where name='bin';
- 显示uid号最小的前10个用户的信息
select * from user order by uid limit 10;
- 显示表中第10条记录到第15条记录
select * from user limit 9,5;
- 统计name字段不为空有多少条记录
select count(*) from user where name is not null;
如有侵权,请联系作者删除
Linux 3: Database development technology | Linux相关推荐
- linux笔记本没有insert,无法在Linux中将UTF8插入数据库MySQL(Can not insert UTF8 to Database MySQL in Linux)...
无法在Linux中将UTF8插入数据库MySQL(Can not insert UTF8 to Database MySQL in Linux) 当创建表时,我已经设置了charset = utf8. ...
- linux之database(数据库)一
linux之database(数据库) 01: 数据库服务概述 . 构建MySQL服务 . 数据库基本管理 . MySQL数据类型 02: 表结构 . MySQL键值 03: 数据导入导出 . 管理表 ...
- bt5 mysql root_MySQL_Linux利用UDF库实现Mysql提权,环境:
os:linux(bt5)database - phpStudy...
Linux利用UDF库实现Mysql提权 环境: os:linux(bt5) database:mysql 简述: 通过自定义库函数来实现执行任意的程序,这里只在linux下测试通过,具体到windo ...
- OGG 有for Oracle database 10g and Linux Itanium CPU 版本的介质
OGG 有for Oracle database 10g and Linux Itanium CPU 版本的介质.该ogg的版本号是11.2.1.0.2,该文件的文件名是V34011-01.zip
- linux 网卡驱动分析,基于linux下网卡驱动分析及实现技术研究
摘 要 Linux技术是当前计算机技术中最大的一个热点,在我国以及全世界得到了迅猛的发展,被广泛的应用于嵌入式系统.服务器.网络系统.安全等领域.从而使得掌握在 Linux环境下的开发技术,成为 ...
- linux 2.4内核编译,linux 2.4内核编译详解
2.4内核编译详解 内核简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性. Linux的一个重要的特点就是其源代码的公开性,所有的内 ...
- Linux下mysql支持中文,linux下mysql环境支持中文配置步骤
sql脚本执行前加上: CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARSET utf8 COLLATE UTF8_GENERAL_CI; u ...
- linux dhcp 论文,毕业论文—基于linux的dhcp服务器配置.doc
毕业论文-基于linux的dhcp服务器配置 基于Linux的DHCP服务器配置 摘 要 随着互联网的普及,人们的工作.学习和生活与网络联系越来越紧密,搭建了许多不同的网络,如企业网.校园网和城区网等 ...
- linux 保存编译log,(转)Linux下编译安装log4cxx
一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...
最新文章
- python json模块有什么用_Python的json模块及使用
- 《spring 2.0技术手册》入门不错!
- 【转载】jQuery最佳实践
- 计算机多媒体教室维修登记册,多媒体教学管理制度
- 神圣的NLP!一文理解词性标注、依存分析和命名实体识别任务
- python兼职平台信号处理_如何在Windows机器上处理python中的信号
- [渝粤教育] 广东-国家-开放大学 10763k2_客户服务管理_21秋考试
- popoverController(iPad)
- Win8下右键“发送到”没有蓝牙选项的解决办法
- python怎么读-Python怎么读?为什么叫Python?
- IOCCC.1987.korn.c.解析
- 图森冲刺全球无人驾驶第一股!创办5年融资40亿,新浪是大股东
- 又到年底冲刺时,华为小米竞相降价促销
- 国产网络分析仪的介绍
- Python Scrapy 爬虫 - 爬取多级别的页面
- 计算机使用水平怎么填,计算机水平怎么填写?
- 查看pg 用户组_PostgreSQL 角色用户管理
- ld链接时提示接口未实现_苹果耳机一分二转接口,可以边听歌边充电!
- 解决:删除文件夹提示指定的文件名无效或太长,无法删除
- October——Just believe youself,you really did good job