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. 创建新虚拟机1台
  2. 关闭firewalld
  3. 禁用SELinux
  4. 配置yum源
  5. 配置IP地址192.168.4.50
  6. 软件mysq-5.7.1
  7. 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 算法(二叉树):

  1. 查找数字 5 时,先用数字 5 和数字 4 对比;
  2. 当数字 5 大于数字 4,则直接从数字 4 的右分支进行查找;
  3. 接下来用要查找的数字 5 和数字 6 对比;2
  4. 当数字 5 小于数字 6,则直接从数字 6 的左分支进行查找;
  5. 按照以上的方式继续比对查找,直到查找到数据为止;

索引的优缺点

生产环境下,对数据查的请求远远高于对数据写的请求;

普通索引 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种:

  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;

构建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服务

  1. 虚拟机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
  1. 数据库管理员密码设置为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:数据库基本原理

  1. 使用mysql命令连接数据库,并查看连接用户
mysql -uroot -ptarenaselect user();
  1. 创建数据库名为test
create database test;
use test;
  1. 在数据库test下创建一个名为stu的表,表记录包含如下内容:
    学号,姓名,性别,手机号,通信地址 (注:性别用enum类型)
create table stu(学号 char(10), 姓名 char(15), 性别 enum('男','女'), 手机号 char(11), 通信地址 varchar(20)) DEFAULT CHARSET=utf8;
  1. 往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;
  1. 删除stu表记录
delete from test.stu;
select * from stu;
  1. 删除stu表
drop table test.stu;
show tables;
  1. 删除test库
drop database test;
show databases;

6.11练习

案例1:构建mysql服务器

要求如下:

  1. 在虚拟机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
  1. 设置数据库管理员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命令练习

  1. 连接到数据库
mysql -uroot -predhat
  1. 查看所有的数据库
show databases;
  1. 创建数据库名为tedu,test
create database tedu;
create database test;
  1. 切换到数据库tedu
use tedu;
  1. 显示当前在哪个数据库
select database();
  1. 显示连接的用户
select user();
  1. 删除数据库tedu
drop database tedu;
show databases;
  1. 创建stu表,表字段包含name,homedir
create table stu(name char(10), homedir varchar(20));
  1. 往stu表里添加记录为jim,usa;lilei,china
insert into stu values("jim", "usa");
insert into stu values("lilei", "china");
  1. 查看表记录
select * from stu;
  1. 只查看name字段
select name from stu;
  1. 将homedir表记录值改为beijing
date stu set homedir="beijing";
select * from stu;
  1. 删除表记录
delete from stu;
  1. 删除stu表
drop table stu;

案例3:练习数据类型的使用

  1. 根据如下的表结构创建对应的表并插入记录

表-1

Field Type Null Key Default Extra
name char(5) YES NULL
mail 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插入记录要求如下:

  1. 所有字段值自定义

    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`));
    
  2. 用时间函数进行赋值

    insert into b3 values('tom', year(now()), time(now()), curdate(), now());
    

案例4:表结构练习

  1. 按照表结构创建如下表,并插入记录

    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');
    
  2. 只给class字段和name字段赋值

    insert into b5(class,name) values('class1','name1');
    
  3. 在age字段后面添加字段值为性别(sex),默认值为boy

    alter table b5 add sex enum('boy', 'girl') default 'boy' after age;
    
  4. 在表最前面添加学号(stu_id)字段

    alter table b5 add stu_id int(11) first;
    
  5. 添加邮箱(email)字段,该字段不允许为空,默认值tarena@tedu.cn

    alte b5 add email varchar(30) not null default 'tarena@tedu.cn';
    
  6. 修改sex字段类型,默认值为man

    alter table b5 modify sex enum('man','boy','girl') default 'man' after age;
    desc b5;
    
  7. 将email字段移到age字段后面,其他属性不变

    alter table b5 modify email varchar(30) not null default 'tarena@tedu.cn' after age;
    
  8. 删除表字段email和stu_id

    alter table b5 drop email,drop stu_id;
    
  9. 将该表名改为abc

    rename table b5 to abc;
    

6.18练习

环境准备

  1. 将虚拟机A开机

  2. 关闭防火墙和SELinux

    systemctl stop firewalld.service
    setenforce 0
    
  3. 配置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
    
  4. 配置本地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
    
  5. 构建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
    
  6. 数据库管理员密码设置为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



​ 练习:

  1. 用命令行的形式连接到数据库
mysql -uroot -p123qqq...A
  1. 在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;
  1. 把存放用户信息的文件导入到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 练习

环境准备

  1. 将虚拟机svr7开机

  2. 关闭SELiunx和防火墙

    systemctl stop firewalld.service
    setenforce 0
    
  3. 构建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
    
  4. 数据库管理员密码设置为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
  1. 将/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;
  1. 往user表里添加新字段id,设置类型为自增长

    alter table user add id int primary key auto_increment first;
    desc user;
    
  2. 给name字段添加4条记录分别为(null,“null,”,NULL)

    insert into user(name) values(null),("null"),(""),(NULL);
    select * from user;
    

6.22 练习

  1. 构建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;
  1. 在用户名字段下方添加s_year字段 存放出生年份 默认值是1990
alter table user add s_year year default 1990 after name;
  1. 在用户名字段下方添加字段名sex 字段值只能是gril 或boy 默认值是 boy
alter table user add sex enum('girl','boy') default 'boy' after name;
  1. 在sex字段下方添加 age字段 存放年龄 不允许输入负数。默认值 是 21
alter table user add age tinyint unsigned default 21 after sex;
  1. 把uid字段值是10到50之间的用户的性别修改为 girl
update user set sex='girl' where uid between 10 and 50;
  1. 统计性别是girl的用户有多少个。(count(*)统计个数)
select count(*) from user where sex="girl";
  1. 查看性别是girl用户里 uid号 最大的用户名 叫什么。(看最大值用max)
select name from user where uid=(select max(uid) from user where sex='girl');
  1. 添加一条新记录只给name、uid 字段赋值 值为rtestd 1000
insert into  user(name,uid) values("rtestd", 1000);
  1. 加一条新记录只给name、uid 字段赋值 值为rtest2d 2000
insert into  user(name,uid) values("rtest2d", 2000);
  1. 显示uid 是四位数的用户的用户名和uid值。
select name, uid from user where uid>=1000;
  1. 显示名字是以字母r 开头 且是以字母d结尾的用户名和uid。
select name, uid from user where name regexp "^r.*d$";
  1. 查看是否有名字以字母a开头 并且是以字母c结尾的用户。
select name, uid from user where name regexp "^a&c$";
  1. 把 gid 在100到500间用户的家目录修改为/root
update user set comment='/root' where gid between 100 and 500;
  1. 把用户是 root 、 bin 、 sync 用户的shell 修改为 /sbin/nologin
update user set shell='/sbin/nologin' where name in('root','bin','sync');
  1. 查看 gid 小于10的用户 都使用那些shell
select shell from user where gid<10;
  1. 删除 名字以字母d开头的用户。
delete from user where name regexp '^d';
  1. 查看那些用户没有家目录
select name from user where lujing='/';
  1. 使用系统命令useradd 命令添加登录系统的用户名为lucy
system useradd lucy;
system ls /home;
  1. 把lucy用户的信息添加到user表里
system cat /etc/passwd
insert into user values('lucy',null,null,null,'x',1001,1001,null,'/home/lucy','/bin/bash');
  1. 删除表中的 comment 字段
alter table user drop comment;
desc user;
  1. 设置表中所有name字段值不允许为空
alter table user modify name char(50) not null;
  1. 删除root用户家目录字段的值
update user set homedir=null where name='root';
  1. 显示 gid 大于500的用户的用户名家目录和使用的shell
select name,homedir,shell from user where gid>500;
  1. 删除uid大于100的用户记录
delete from user where uid>100;
  1. 显示uid号在10到30区间的用户有多少个。
select count(*) from user where uid between 10 and 30;
  1. 显示uid号是100以内的用户使用的shell。
select shell from user where uid<=100;
  1. 显示uid号小于50且名字里有字母a 用户的详细信息
select * from user where  uid<50 and name like "%a%";
  1. 只显示用户 root bin daemon 3个用户的详细信息。
select * from user where name in('root','bin','daemon');
  1. 显示除root用户之外所有用户的详细信息。
select * from user where name!='root';
  1. 显示名字里含字母c用户的详细信息
select * from user where name like '%c%';
  1. 在sex字段下方添加名为pay的字段,用来存储工资,默认值15000.00
alter table user add pay float(7,2) default 15000.00 after sex;
  1. 把所有女孩的工资修改为10000
update user set pay=10000.00 where sex='girl';
  1. 把root用户的工资修改为30000
update user set pay=30000 where name='root';
  1. 给adm用户涨500元工资
update user set pay=pay+500 where name='adm';
  1. 查看所有用户的名字和工资
select name,pay from user;
  1. 查看工资字段的平均值(平均值用avg)
select avg(pay) from user;
  1. 显示工资字段值小于平均工资的用户名
select name from user where pay<(select avg(pay) from user);
  1. 查看女生里uid号最大用户名
select name from user where  uid=(select max(uid) from user where sex='girl');
  1. 查看bin用户的uid gid 字段的值 及 这2个字段相加的和
select uid,gid,uid+gid from user where name='bin';
  1. 显示uid号最小的前10个用户的信息
select * from user order by uid limit 10;
  1. 显示表中第10条记录到第15条记录
select * from user limit 9,5;
  1. 统计name字段不为空有多少条记录
select count(*) from user where name is not null;

如有侵权,请联系作者删除

Linux 3: Database development technology | Linux相关推荐

  1. 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. ...

  2. linux之database(数据库)一

    linux之database(数据库) 01: 数据库服务概述 . 构建MySQL服务 . 数据库基本管理 . MySQL数据类型 02: 表结构 . MySQL键值 03: 数据导入导出 . 管理表 ...

  3. bt5 mysql root_MySQL_Linux利用UDF库实现Mysql提权,环境: os:linux(bt5)database - phpStudy...

    Linux利用UDF库实现Mysql提权 环境: os:linux(bt5) database:mysql 简述: 通过自定义库函数来实现执行任意的程序,这里只在linux下测试通过,具体到windo ...

  4. 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

  5. linux 网卡驱动分析,基于linux下网卡驱动分析及实现技术研究

    摘    要 Linux技术是当前计算机技术中最大的一个热点,在我国以及全世界得到了迅猛的发展,被广泛的应用于嵌入式系统.服务器.网络系统.安全等领域.从而使得掌握在 Linux环境下的开发技术,成为 ...

  6. linux 2.4内核编译,linux 2.4内核编译详解

    2.4内核编译详解 内核简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性. Linux的一个重要的特点就是其源代码的公开性,所有的内 ...

  7. Linux下mysql支持中文,linux下mysql环境支持中文配置步骤

    sql脚本执行前加上: CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARSET utf8 COLLATE UTF8_GENERAL_CI; u ...

  8. linux dhcp 论文,毕业论文—基于linux的dhcp服务器配置.doc

    毕业论文-基于linux的dhcp服务器配置 基于Linux的DHCP服务器配置 摘 要 随着互联网的普及,人们的工作.学习和生活与网络联系越来越紧密,搭建了许多不同的网络,如企业网.校园网和城区网等 ...

  9. linux 保存编译log,(转)Linux下编译安装log4cxx

    一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...

最新文章

  1. python json模块有什么用_Python的json模块及使用
  2. 《spring 2.0技术手册》入门不错!
  3. 【转载】jQuery最佳实践
  4. 计算机多媒体教室维修登记册,多媒体教学管理制度
  5. 神圣的NLP!一文理解词性标注、依存分析和命名实体识别任务
  6. python兼职平台信号处理_如何在Windows机器上处理python中的信号
  7. [渝粤教育] 广东-国家-开放大学 10763k2_客户服务管理_21秋考试
  8. popoverController(iPad)
  9. Win8下右键“发送到”没有蓝牙选项的解决办法
  10. python怎么读-Python怎么读?为什么叫Python?
  11. IOCCC.1987.korn.c.解析
  12. 图森冲刺全球无人驾驶第一股!创办5年融资40亿,新浪是大股东
  13. 又到年底冲刺时,华为小米竞相降价促销
  14. 国产网络分析仪的介绍
  15. Python Scrapy 爬虫 - 爬取多级别的页面
  16. 计算机使用水平怎么填,计算机水平怎么填写?
  17. 查看pg 用户组_PostgreSQL 角色用户管理
  18. ld链接时提示接口未实现_苹果耳机一分二转接口,可以边听歌边充电!
  19. 解决:删除文件夹提示指定的文件名无效或太长,无法删除
  20. October——Just believe youself,you really did good job

热门文章

  1. 两个list合并为列表对象
  2. Editplus 注册码!
  3. 【计算方法】#01 高斯消去法和列主元高斯消去法的原理简介及C++实现
  4. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
  5. 手把手实现unipush推送功能
  6. mysql 统计每人每年1-12月个个月的分数和总分、平均分
  7. Docker镜像是什么?
  8. 30-什么是 PCA
  9. STM32 CAN TX无波形,原理图 TJA1042
  10. 信用卡Java_信用卡号验证Java程序