MySQL数据库的操作(安装+语法基础+进阶)详解

**

安装部分

"""
bin 			执行文件
mysqld			服务器主程序
mysql			无界面的客户端
data			数据文件
my-default.ini	配置文件模板
  • 启动服务器
    启动服务器
    1.运行CMD,通过cd 进入bin目录
    2.执行mysqld就可以启动服务器,如果报错的话使用管理员权限来运行CMD
    这是一个socket服务器程序 这时候相当于做了一下事情:
    启动服务器socket 并监听端口 默认绑定当前ip 端口默认3306

启动客户端
运行mysql 注意他是一个socket程序 要连接服务器需要ip 和 端口

mysql  -h ip -P port -uroot -p  密码默认为空

看到欢迎界面则说明socket链接成功了

执行过程分析:
这个命令提示符本质是什么?
就是一个input
接受一条指令然后发送给服务器
服务器接收到之后呢解析指令
取出你要的数据在send给客户端
那问题来了 指令肯定不能随便写,不然服务器不认识,大家必须得有套规范
就是sql 语句
sql全称为 结构化查询语言,是所有非关系型数据库都支持的语言,学习数据库很大一部分时间是在学习sql语句。

登录成功后可以执行一下命令来查看所有存在的数据库

show databases;

对比data文件夹来看

  • 添加环境变量
    找到安装目录,将bin路径复制填入系统设置的path中即可
    命令总结:

mysqld #启动服务器
启动客户端 mysql -h -P -u -p 本机简写 mysql -u -p

#关闭服务器

tasklist | findstr mysqld
taskkill  /F /PID  8372

也可以直接退出CMD

  • 注册系统服务

将mysql注册到系统服务中 mysqld --install
需要注意的是 默认注册的服务名称叫做mysql 这与bin下的mysql是两码子事,一个系统服务一个是客户端执行文件

删除服务 sc delete mysql(服务名)

查看系统服务 运行->services.msc
通常设置为自动启动。

修改管理员密码

现在密码默认为空 这样是不安全的
万一谁过来把你数据删了 怎么办?

#修改密码
在知道原始密码的情况下可以使用mysqladmin
mysqladmin是一个用于管理数据库的程序,包括修改密码,数据备份等
修改密码:
mysqladmin -uroot -p旧密码 password 123
警告忽略即可

#破解密码:
万一你不小心把密码忘记了怎么办? 到公司不可能卸载重装
这个密码它肯定要找地方存储起来 ,那存客户端还是服务器呢?
服务器 ,那存在内存还是硬盘呢? 必然是硬盘,既然如此,一定有一文件用于存放密码信息

#方式1:删除用于记录用户密码数据文件
没问题 简单粗暴 但是,这个文件里不只有你的账号信息 还有别人账号数据 还有授权相关的数据
所以你最好不要这么干!
那你在思考一下,服务器验证用户的本质是什么,是不是读取一个文件的数据来和你输入的数据进行对比,
那你可不可以这样子 我告诉我服务器说你不要去读那个授权文件,可以!

#方式2: 跳过授权表 进入系统修改授权表推荐
跳过这个操作是服务器相关的操作所以 咱的先关掉服务器重新开 在重新开的时候来告诉它
1.停止服务
2.启动服务器并添加参数
mysqld --skip-grant-tables
3.使用客户端登录服务器 执行修改命令 此时不需要输入密码
update mysql.user set password = password(“123123”) where user=“root” and host=“localhost”**
4.刷新权限
flush privileges
5.命令行中重启服务器验证新密码

编码设置

	使用客户端执行\s 可以查看当前服务器的设置信息

latin1 gbk 就是默认的编码。 服务器是拉丁 客户端是 GBK
很显然要乱码,我们必须保证编码方式一致!

如何设置:
在mysql安装目录下有个my_default.ini 他就是配置文件,但是他不是正在使用的
而是一个模板文件,我们如果要自己编写配置文件,需要自己复制一个叫做my.ini的文件来编写
编写格式我们已经学习过了
configpaser模块

[section]
option = value

要设置客户端的内容就写在mysql分区
要设置服务器的内容就写在mysqld分区下
mysql在启动的时候会自动到安装目录下找my.ini文件 找到命令对应的标题加载里面的设置项

测试:在配置文件中加入用户名密码配置

[mysql]
user = "root"
pasword = "123"

需要注意的是:mysql mysqld都会来读取这个文件,对于客户端和服务器我们需要使用section来区分

# 服务器配置部分
[mysqld]
character-set-server = utf8
# 客户端mysql配置部分
[mysql]
default-character-set = utf8
# 其余客户端配置部分
[client]
default-character-set = utf8

基本SQL语句

  • 库相关操作
增 
create database mydb charset utf8;

查  
show databases;
show create databases mydb;

改
alter database mydb charset gbk

删
drop database mydb;
  • 表相关操作
切换文件夹 (选择数据库)
use mydb;

增
create table t1 (id int,name char)

查
show tables;
show create table t1; (鸡肋)
desc t1; 

改
改字段
alter table 表名 add | modify | drop | change  
add  跟 列名和类型
modify 跟 列名 和 类型
drop 跟列名
change 跟 旧列名  新列名 类型

改字符编码
alter table 表名 default character set gbk

改名称
rename table tname1 to tname2

删
drop table 表名
  • 记录相关操作
增 
insert into tablename(字段名,字段名2,...可省略不写) values(data,....),(data)...

查 
select id,name from t1;     
列名可用*号表示通配符

改
update 表名 set 列名 = 值 where 条件; 
可同时修改多个字段,用逗号隔开  列名=值,列名=值...
没有条件则修改全部
    
删
delete from 表名 where 条件;
没有条件则删除所有;

重建表,清空所有数据;
truncate table t1;

SQL进阶

完整建表语句

[]表示可选

create table 名称(字段 类型[(宽度) 约束条件],字段 类型,......)
  • 存储引擎
#查看当前的默认存储引擎:

mysql> show variables like "default_storage_engine";

#查询当前数据库支持的存储引擎

mysql> show engines \G;

指定存储引擎

  1. 在建表时指定
     mysql> create table ai(id bigint(12),name varchar(200)) ENGINE=MyISAM; 
    mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB
   也可以使用alter table语句,修改一个已经存在的表的存储引擎。
    mysql> alter table ai engine = innodb;
  1. 在配置文件中指定
#my.ini文件
[mysqld]
default-storage-engine=INNODB
  • 整形和浮点

    整型 默认都是有符号的
    tinyint 1个字节 8个二进制 0-255 -128 - 127
    smallint 2个字
    mediumint 3个字节
    int 4个字节
    bigint 8个字节
    设置为无符号 需要在类型后添加unsigned
    create table t8(a tinyint unsigned);

    浮点
    float 4个字节
    float(a,b)
    double 8个字节
    double(a,b)
    decimal 不固定
    decimal(a,b)
    a代表总位数 b表示小数位数
    5,3 最大值99.999

    共同点: 小数位最大为30
    float与double总长最大为255
    都是不精确的 double比float精确点
    不同点:
    decimal总长最大为65 并且是精确的

    宽度在整型数据中 不是用来设置可存储的数据范围的
    用于控制最先小显示长度(字符数) 如果长度不足 就帮你补0 但是需要指定zerofill
    create table t12(a tinyint(5) zerofill);

    结论是: 使用整型数据 宽度这个属性一般不用管它

  • 字符串类型
    char固定长度 和 varchar 可变长度
    char(L) varchar(L)
    L 都是表示最大可存储的长度 不是字节
    a char(4) b varchar(4)
    a:S 最终还是占4个字符长度
    b:S 最终占1个字符长度 + 标识信息的长度(1-2字节)
    S S S
    如果有三个数据要存 每个数据都是一个s字符 最终3 * 4 12个字符长度
    占用空间较多 存取速度较快
    1S1S1S varchar 存储时必须保存一个长度标识信息 所以所占空间为实际内容长度+标识信息长度
    相比较char 空间节省了 但是效率降低了
    char采取的空间换时间 提高效率
    字符串类型的BUG 由于char类型是定长 mysql会在末尾填充空格来达到定长的效果
    所以char类型 不能存储末尾带有空格的数据 会直接把空格给去了
    固定长度的字符串类型 不常用
    tinytext 1字符
    text 2字符
    mediumtext 3字符
    longtext 4字符
    二进制数据类型 单位都是字节
    binary varbinary
    binary是固定长度的二进制
    varbinary 可变长度的二进制
    长度固定无法修改的二进制
    tinyblob
    blob
    mediumblob
    longblob
    强调:
    二进制数据类型 一般不用 如果要存储多媒体 如 音频 视频
    需要将其放到FTP文件服务器上 然后数据库中只存储连接即可

  • 严格模式
    5.7以下的版本 默认是非严格模式的 例如你的类型为tinyint 存储的是128 最终存储的是127
    set global sql_mode = “strict_trans_tables” 可以将其设置为严格模式
    最好写到配置文件中 永久有效

  • 时间类型

year 4为年份
date 日期 yyyy-MM-DD
time 时间 HH:mm:SS
datetime yyyy-MM-DD HH:mm:SS
timestamp 时间戳 一个浮点类型 从unix元年到现在的秒数

year 可以是数字 也可以是字符串

可以用四位字符串 也可以2位字符 或数字
00-69 == 2001-2069
70-99 == 1970 - 1999

甭管什么时间类型 照着标准格式字符串写 就行

timestamp 会自动更新时间 当你插入时 或修改时

current_time 和 now() 所有的时间 日期类型 都可以使用这两个方法来输入当前时间

所有的日期时间 数据库返回的都是字符串类型

  • 枚举和集合

  • 约束的定义和使用
    约束
    完整的建表语句
    create table 名称(字段 类型[(宽度) 约束条件],字段 类型,…)

    约束 是指 给数据的值加上一些限制

    类型就是一种限制 宽度对于整型数据 没有存储限制 其他类型的宽度是有限制作用的

    约束就是除了 数据类型以及宽度之外的其他限制

    unsigned就是约束中第一种 表示你的整数 不能包含符号 仅针对数字类型

    约束 是为了保证数据的完整性
    完整性约束

    not null 非空
    限制该字段 必须有值
    例如账号密码
    default 默认值
    例如 多数用户都是男的 游戏账号的金币可以默认

    1.建表直接指定
    create table t(name char(10) not null default 默认值);
    2.后期增加约束
    alter table t modify name char(10) not null default 已有的字段
    alter table t add sex char(10) not null default 新增字段

    unique 唯一性约束 并且是一个索引
    要求该字段的值 不能重复
    单字段:
    create table olbPerson(name char(20) unique,school char(10));

    多字段联合唯一约束
    create table olbPerson(name char(20),school char(10), unique(name,school));
    例如:姓名和校区两个字段 如果两个校区有相同的姓名 这时候就可以把这两个字段作为联合唯一索引
    这些字段都相同才算是重复
    primary key 主键约束
    从约束角度来看 和 非空 + 唯一 是相同的效果
    不能为空且不能重复
    需要强调的是:
    主键除了有约束的效果 还是一个索引 并且是非常重要的索引
    在该innodb 主键是必不可少的
    innodb 组织数据结构是按照树形结构来组织的,该结构中 必须有一个数据 不能为空且唯一的
    如果没有这样的数据 树形结构也就不存在.

    mysql在创建表的时候 会检测 是否存在主键
    如果没有 它就找一个具有非空且唯一约束的字段提升为主键
    如果也没有这样的字段 mysql就创建一个隐藏字段作为主键

    索引 可以提高查询速度

    结论是: 只要你是用innodb引擎 你就应该建表时设置一个主键 通常主键字段叫做id
    id 有唯一标识的意思
    索引 就像是 字典里目录 用于快速定位数据所在位置

  • 主键与自动约束

  • 主键 =非空+唯一

  • primary key = not null +unique
    主键在使用中 需要我们自己来维护 其正确性 你需要知道上一次写的是什么 然后找一个之前没用过的主键
    mysql 提高了自动增长约束 可以帮你自动管理主键的值
    要求必须是整型,每次插入数据都会自动+1 程序中就不要再自己管理主键了

语法:

create table table_name(id int primary key auto_increment,name char(10));

插入带有自动增长的字段时 可以直接忽略该字段 也可以插入一个null

insert into table_name values(null,“jack”);
insert into table_name(name) values(“jack”);

只要你创建一个表 就应该有主键 并且自动增长.

create table test (id int primary key,name char(20))

foreign key 外键约束

  • 自动增长
create table py6(id int primary key,name char(20)not null,sex char (1) default ‘男’)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值