MYSQL数据库

数据库的基本概念

库的相关操作

简单的sql语句

存东西先要有个库

一个应用程序需要单独对应一个数据库

库是文件夹,里面有好多表,文件就是表,表里面是一行一行数据。

# 数据库
# 本质就是一个c/s架构的套接字软件
# Server端的套接字软件专门管理本地硬盘上的数据文件




# 相关概念
# 数据库服务器:运行有数据库管理软件的计算机
# 数据库管理软件:套接字软件
# 库:文件夹
# 表:文件
# 记录:就相当于文件中的一行内容


# 基本的sql语句
# 什么叫sql语句?
# 管理数据文件方面的套接字软件不用写了,直接下载别人写好的,需要把服务端软件安装在一台机器之上,专门管理这台机器的数据文件
# 自己的应用程序里面需要拿到一个套接字客户端,远程连过去要给服务端提交一条命令


# 操作数据库无非是在客户端远程去操控服务端的库,表,记录。
# 库本质就是文件夹,表本质就是文件夹内的文件,记录本质就是文件内的一行行内容

# 对文件夹操作无非增删改查
# 增,怎么增呢?
# 创建一个数据库

# 创建 数据库 名字 指定数据库字符编码 utf8 以分号结束
# create database db1 charset utf8;

# 查,
# show databases;
# 查看有哪些数据库,本质就是查看有哪些文件夹名

# 查看刚刚的那个库
# show create database db1;

# 改,唯一改字符编码
# 改 数据库 哪个数据库 改什么东西啊? 改成什么?分号结尾
# alter database db1 charset gbk;

# 删
# 删 数据库 哪个数据库
# drop database db1;






# 表的增删改查
# 表其实就是文件,文件一定是存放在某个文文件夹下的,所以一定要有个文件夹

# 增
# 切换文件夹
# use db1;

# 创建 创建表 表名(记录编号 数据类型,name 数据类型)分号结束
# create table t1(id int,name char);
# 怎么样能称之为一个表?有字段,建表一定要括号括起来为其指定字段,建表一定要有个id,就是标识表都插到多少条记录了,是一个记录编号

# 如果不切,为这个表前面添加一个db1.文件夹下这个文件
# create table db1.t1(id int,name char);

# 删
# 删 删表 哪个表
# drop table db1.t1;
# drop table t1;

# 改
# 改他的字段
# 增加字段:
# 改什么 表 表名 add 字段名 类型 分号结束
# alter table t1 add age int;

# 修改字段数据类型
# alter table t1 modify name char(15);

# alter table t1 change name NAME char(15);

# alter table t1 drop age;
# 查
# show tables;
# 查看当前库下面都有哪些表

# 如果不知道在哪个库,可以
# select datasase();
# 返回当前你所在的库

# desc 表名
# 查看表结构,描述信息

写应用程序先建个库,针对库的相关操作

增:

创建数据库

create database db1(数据库名字);

查:(查看所有数据库)

show databases;(查看所有数据库)

show create database 库名字;(查看建库的语句)

删除:

drop database 数据库名字;

改:,文件夹能改什么?改默认编码

show create database 库名字;

mysql> show create database nwtz;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| nwtz     | CREATE DATABASE `nwtz` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

alter database 库名字 DEFAULT CHARACTER SET utf8(要改的属性名称);

alter database 库名字 CHARSET utf8;

mysql> show create database nwtz;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| nwtz     | CREATE DATABASE `nwtz` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

排序需要规则

数据库名称的命名规范:

1.不能是纯数字

2.可以是数字字母下划线的组合

3.可以使用下划线开头

4.不能是关键字,如create

大致和python相同

不区分大小写

DB db

怎么修改默认的编码?

提供配置文件

s(查看当前一些默认配置信息)

mysql> s
--------------
mysql  Ver 14.14 Distrib 5.7.24, for Win64 (x86_64)
Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.7.24 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 37 min 23 sec
Threads: 1  Questions: 11  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.004
--------------

找到mysql的安装目录

新建一个ini文本文档,配置文件都是固定的模板

[client]      客户端的配置
 
[mysql]     mysql这个客户端的配置
 
[mysqld]    服务端的配置
 
 
[client]
 
[mysql]
default-character-set = utf8
[mysqld]
character-set-server = utf8
 
需要重启服务器
 
 
C:WINDOWSsystem32>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。

C:WINDOWSsystem32>net start mysql
MySQL 服务正在启动 .
MySQL 服务已经启动成功。

C:WINDOWSsystem32>mysql
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
C:WINDOWSsystem32>mysql -uroot -p
Enter password: *********
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 3
Server version: 5.7.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql> s
--------------
mysql  Ver 14.14 Distrib 5.7.24, for Win64 (x86_64)
Connection id:          3
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.7.24 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 49 sec
Threads: 1  Questions: 5  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.102
--------------
 
注意:
配置文件放在安装路径根目录下 就是和bin同级,名称必须叫my.ini
 
 
 
简单的增删改查
表的相关操作,表就是一个一个文件。
 
建表时要明确数据库:
 use 库名字
在创建时同时指定数据库名称.表名称
create table  表名字来个括号(放字段名称 类型(长度),...);
nikename在python中是字符串,叫char类型
 
mysql> use nwtz
Database changed
mysql> create table dog(nikename char(10),gender char(1),age int);
Query OK, 0 rows affected (0.02 sec)
 
不想用use,直接建立一个数据库名称
 
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)
mysql> create table db2.dog(nikename char(10),gender char(3),age int);
Query OK, 0 rows affected (0.02 sec)
 
 
 
改:能改表名,字段名。。
alter table 表名字 drop|change|modify|add
drop:删除字段
drop 字段名称
 
change:修改字段名字
change 旧的字段名 新的字段名 新的类型
 
modify:修改类型
modify 字段名 新的类型
 
add:添加字段
add 字段名 字段类型
mysql> alter table dog add color char(10);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
 
 
 
重命名表
rename 旧的表名 to 新的表名
 

查:

show tables (查看所有表)

mysql> show tables
    -> ;
+----------------+
| Tables_in_nwtz |
+----------------+
| dog            |
+----------------+
1 row in set (0.00 sec)

查看建表语句:

show create table 表名;

show create table dogtable;

修改表的属性:

alter table 表名 属性名 值:

alter table dogtable DEFAULT CHARSET gbk;

desc 表名字;(查看表结构)

mysql> desc dog;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| nikename | char(10) | YES  |     | NULL    |       |
| gender   | char(1)  | YES  |     | NULL    |       |
| age      | int(11)  | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)

删:

drop table 表名;

记录相关操作,CRUD

mysql> use db2;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| dog           |
+---------------+
1 row in set (0.00 sec)
mysql> desc dog;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| nikename | char(10) | YES  |     | NULL    |       |
| gender   | char(3)  | YES  |     | NULL    |       |
| age      | int(11)  | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

insert into 表名 values(值1,值2,值3....)

mysql> insert into dog values('zaizai','w',2);
Query OK, 1 row affected (0.00 sec)

delete from 表名(全删除)

delete from 表名 where 字段名称 = 值

mysql> delete from dog where nikename = '银狐';
Query OK, 1 row affected (0.00 sec)
mysql> select *from dog;
+----------+--------+------+
| nikename | gender | age  |
+----------+--------+------+
| zaizai   | w      |    2 |
| 大黑     | w      |    4 |
+----------+--------+------+
2 rows in set (0.00 sec)

update 表名 set 字段名 = 新的值 where 字段名 = 值;

mysql> update dog set nikename = '美女' where nikename = '大黑';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select *from dog;
+----------+--------+------+
| nikename | gender | age  |
+----------+--------+------+
| zaizai   | w      |    2 |
| 美女     | w      |    4 |
+----------+--------+------+
2 rows in set (0.00 sec)

select *from 表名;*表示通配符 查看所有字段

select 字段名称1,字段名称2,字段名称3.....from表名;

mysql> select *from dog;
+----------+--------+------+
| nikename | gender | age  |
+----------+--------+------+
| zaizai   | w      |    2 |
+----------+--------+------+
1 row in set (0.00 sec)

---------------------------------------------------------------------------------------------------------2-------------------------------------------------------------

今日内容;
 
 1.详细的建表语句
 create table 表名(字段名 数据类型[(长度)约束条件]);
 括号内代表可选
 为什么需要给数据分类?
 1.描述数据更加准确
 2.减少内存
 
 
 
 2.数据类型
 
 整数类型
 TINYINT 一个字节  小整数值 默认是有符号的。
 设置为无符号
 create table t2(age tinyint unsigned);
 
 对于整数而言,长度不是数据所占的字节数 是显示数据时的宽度(字符数)
 默认情况下 存储的数值的十进制的位数 小于所设置的显示宽度时 不回填充 没有任何效果
 加上zerofill 指定 当存储的数值的十进制的位数 小于所设置的显示宽度时 用0填充
 
 该参数如果不指定会有默认值
 
 smallint 2字节  大数整值
 mediumint 3字节 大整数值
 int或integer 4字节  大整数值
 bigint 8字节 极大整数值
 
总结;
这几个类型有什么区别?
除了存储范围没啥区别
相同点 :
 都是整型
 都是有默认符号
 对于显示宽度原理都一样
  
  
 int最常用
 
 当数据的十进制位长度 大于显示宽度 可以正常显示
 主要记住整型后面的长度的含义 与字符是不同的
 
 
严格模式
 什么是严格模式,就是对插入的数据严格要求,不在范围内直接报错 例如在tinyint 中插入大于255的值就将报错
 什么是非严格模式  保存当前的值的最大值
 5.6默认是非严格模式
 5.7以后默认是严格模式
 
 查看严格模式SQL模式:
 selete @@sql_mode;
 show varlables like 'sql_mode';
 
 怎么改?
 set @@sql_mode = ‘值’;
 正常情况下不需要修改
 
 
浮点型
float 4个字节 最大范围(255,30) 单精度浮点数值
double 8字节 (255,30)双精度浮点数值
declmal(65,30) 字节不固定
浮点需要传入m表示总长度,d表示小数部分的长度
长度表示的不是数据存储的范围,就是个十进制的长度,字符长度
10.12 总长为4 小数部分为2
create table t9(num float(m,d))
长度有范围限制m是

区别:
float和double长度相同精度不同,都是不准确的小数
decimal 准确的小数 不会丢失精度(军事跟银行用)
float满足大部分使用场景
括号中m跟d的值可以限制数据存储范围 与整型不同
重点记住m跟d的含义,默认也有。

字符串类型常用的两种:
char和varchar
char定长的字符串
char(1)
只能有一个字符
varchar可变长字符串
 
注意字符串中 长度指定的是数据的字符长度 与字节没关系
create table t13(c1 char,c2 varchar(10));
在创建时varchar必须指定长度,char有默认值1.
char取数据时根据长度取,不关心真实数据长度
无论数据有多长 占用的空间是固定的 造成了一定空间的浪费
varchar先获取数据长度,再根据长度获取真实数据 关心真实数据长度
先存储长度需要一个字节 再存储真实数据 不会浪费空间  缺点时需要计算数据的长度,所以存取速度会比定长慢
相同点:
括号中的把数字都是表示存储的最大字符长度
正常开发中char常用
MySQL会在存储数据时自动将数据末尾的空格去掉。
如果必须要存需要修改sql_mode 增加
由于自动去除空格这个机制 在使用等于符号 和 like 是有区别的:
select *from 表名 where name = 值,会自动去除空格
select  *from 表名 where name like 值 不会自动去除空格
like 用于模糊匹配 使用%表示0或任意个字符 使用_表示一个任意字符
 
日期时间相关的
year 一个字节 yyyy
范围是1901到2155
可以指定各种格式的year值
数字0代表空,必须是字符串‘0’

date 四个字节 yyyy-mm-dd
表示日期,不包含时间
current_time或now()
time 三个字节 hh:mm:ss
表示时分秒,可以表示某个时间发生的长短
范围时-838到838
datetime 八个字节 yyyy-mm-dd  hh:mm:ss
包含日期和时间

timestamp 八个字节 时间戳  yyyy-mm-dd
         hh:mm:ss
current_timesamp
null
无任何输入也可以
当这条记录被修改了,会自动更新当前时间。
保存需要更新的数据
日期和时间 datetime和timestamp用的比较多!
 

枚举与集合
enum可以指定一堆字符串的值,在插入数据时 数据必须是这对字符串中的其中一个,是多选一
集合
enum 是多选多
共同点:数据都是字符串类型
       

 3.约束
 什么叫约束?
 是一种对数据的限制,数据类型,字符串长度,浮点的长度,unsigned
 约束的作用是?
 为了保证数据的正确性,完整性
 例如要存储密码char(10)只限制了长度跟类型,无法保证数据的正确性
 
 加点别的
 
 NOT NULL 非空约束,限制该字段不能为空
 
 UNIQUE   唯一性约束 限制该字段的值是唯一的不能重复出现
 
 DEFAULT  默认值约束 如果插入数据时没有指定该字段的值则使用默认值
 
 PRIMARY KEY 主键约束 限制该字段 不能为空 并且是唯一的 (可以唯一的标识一条数据)
 相当重要,每一个表都应当有一个主键,否则可能出现完全相同的两个数据,无法区分
 UNIQUE 就可以唯一标识一条数据 但是可以为空导致还是不能唯一标识
 UNIQUE NOT NULL 不能为空唯一 可以唯一标识一条数据  书写顺序无所谓
 UNIQUE NOT NULL 与主键的区别,UNIQUE NOT NULL不能被其他表引用,主键一个表中只能有一个
 
 FOREIGN KEY  外键约束 用来指向另一个表的主键
 
 索引:用来加速查询
 InnoDB中索引是树形结构
  为了提高查询效率InnoDB会找一个不为空且唯一的字段作为主键。
  如果表中不存在这样的字段,会自动建一个隐藏主键字段但是无法提升查询效率
  
  只要是使用InnoDB就应该为每个表指定一个非空 且唯一的字段。
  InnoDB组织数据时 首先使用主键,如果没有 找一个非空且唯一 如果也没有 建一个隐藏字段
 
 
 
 多个约束写不需要加逗号。
 添加语法的约束
 create table 表名称 (字段名 类型(长度)约束名称1.约束名称2,)
 
 
 alter table 表名称 modify 字段名 类型(长度) 约束名称1 约束名称2,)
 
 insert 语句的另一种写法
 
 insert into表名(字段名1....字段名n)values(值1.....值n);
 
 
                           6-
 
 
 
 
 当一个表中 由于业务需求没有 一个非空且唯一的字段时 我们可以建一个新的字段专门作为主键
 自动增长
 auto_increment 
 
 手动修改自动增长基数
 alter table 表名 auto_increment 新的值;
 
 这个新的值小于当前的最大值是无效的
 通常建一个表就要建一个主键 主键的类型通常是整型。
 
 
 
 
 
 
存储引擎
什么是引擎-->发动机
一个产品或者服务的核心部分称之为引擎
数据库里有好多引擎,汽油机,采油机,电动机
柴油价格便宜 动力还强 但是噪音大,不完全燃烧
汽油
电机 加速快噪音小 续航不足
在mysql中核心功能是存储数据,mysql存储引擎就是负责存取数据那一段代码。
原文地址:https://www.cnblogs.com/zhangrenguo/p/9984701.html