Linux-了解MySQL与部署MySQL

Linux-了解MySQL与部署MySQL

  • MySQL 历史
    • MySQL的三大主要分支
    • 版本演变
  • 数据的时代
    • 数据的分类
  • 数据库的发展史
    • 文件管理系统的缺点
    • 数据库系统发展阶段
  • DBMS数据库管理系统
  • 数据库管理系统的优点
  • 数据库管理系统的基本功能
  • 数据库系统的架构
  • RDBMS 关系型数据库
    • 关系统型数据库相关概念
    • 常用关系数据库
    • 数据库排名
  • 关系型数据库理论
    • 实体联系模型E-R
    • 联系类型
    • 数据的操作
    • 数据库规划流程
  • 关系型数据库和非关系型数据库
  • 安装 mysql
    • yum安装
    • yum安装5.7版本
    • 编译安装mysql
      • 安装相关依赖包
      • 源码编译安装
      • 下载并解压缩源码包
    • 优化操作
      • 生成提示符
      • 自动补全
    • 客户端程序
    • 多实例
    • 安装mycli 插件 客户端工具
  • 基本操作
    • SQL分类
    • 查看帮助信息
  • 查看支持的字符集
  • 管理数据库
    • 创建数据库
    • 修改数据库
    • 删除数据库
    • 查看数据库列表
    • 数据类型
      • 整数型
      • 浮点型(float和double),近似值
      • 定点数
      • 字符串
      • 修饰符
      • 表操作
      • 查看数据库结构
      • 新建表
      • ##### 修改表结构
      • 其他例子
    • DML语言
      • 4.6.1 INSERT语句
      • UPDATE语句
      • DELETE语句
  • 总结

MySQL 历史

Linux-了解MySQL与部署MySQL_第1张图片

MySQL的历史可以追溯到1979年,它的创始人叫作Michael Widenius,他在开发一个报表工具的时候,设计了一套API,后来他的客户要求他的API支持sql语句,他直接借助于mSQL(当时比较牛)的代码,将它集成到自己的存储引擎中。但是他总是感觉不满意,萌生了要自己做一套数据库的想法。

直到1996年,MySQL 1.0发布,Michael Widenius的大女儿的简称就是MY,Michael Widenius大概也是把MySQL当成自己的女儿一样来对待.仅仅过了几个月的时间,1996年10月MySQL 3.11.1当时发布了Solaris的版本,一个月后,linux的版本诞生,从那时候开始,MySQL慢慢的被人所接受。

1999年,Michael Widenius成立了MySQL AB公司,MySQL由个人开发转变为团队开发,2000年使用GPL协议开源。

2001年,MySQL生命中的大事发生了,那就是存储引擎InnoDB的诞生!Oracle在2005年收购了InnoDB,只不过InnoDB一直以来都只能作为第三方插件供用户选择。直到现在,MySQL可以选择的众多存储引擎中,InnoDB依然是第一选择

2008年1月,MySQL AB公司被Sun公司以10亿美金收购,MySQL数据库进入Sun时代。Sun为MySQL的发展提供了绝佳的环境,2008年11月,MySQL 5.1发布,MySQL成为了最受欢迎的小型数据库。

2009年4月,Oracle公司以74亿美元收购Sun公司,MySQL也随之进入Oracle时代。

2010年12月,MySQL 5.5发布,Oracle终于把InnoDB做成了MySQL默认的存储引擎,MySQL从此进入了辉煌时代。

然而,从那之后,Oracle对MySQL的态度渐渐发生了变化,Oracle虽然宣称MySQL依然尊少GPL协议,但却暗地里把开发人员全部换成了Oracle自己人,开源社区再也影响不了MySQL发展的脚步,真正有心做贡献的人也被拒之门外,MySQL随时都有闭源的可能……看着自己辛苦养大的MySQL被Oracle搞成这样,Michael Widenius非常失望,决定在MySQL走向闭源前,将MySQL进行分支化,依然是使用了自己小女儿的名字MariaDB(玛莉亚DB)。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB由MySQL的创始人Michael Widenius主导,由开源社区的大神们进行开发。因此,大家都认为,MariaDB拥有比MySQL更纯正的MySQL血脉。最初的版本更新与MySQL同步,相对MySQL5以后的版本,MariaDB也有相应的5.1~5.5的版本。后来MariaDB终于摆脱了MySQL,它的版本号直接从10.0开始,以自己的步伐进行开发,当然,还是可以对MySQL完全兼容。

1979年:TcX公司 Monty WideniusUnireg
1996年:发布MySQL1.0Solaris版本,Linux版本
1999年:MySQL AB公司,瑞典
2003年:MySQL 5.0版本,提供视图、存储过程等功能
2008年:Sun公司 以10亿美元收购MySQL
2009年:Oracle公司以 74 亿美元收购 sun 公司
2009年:Monty成立MariaDB

MySQL的三大主要分支

mysql 网站
mysql https://www.mysql.com/
mariadb http://mariadb.org/
percona Server https://www.percona.com

版本演变

MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 ----->6.0 - —>7.0 --> 8.0

MariaDB:5.1 -->5.5 -->10.0–> 10.1 --> 10.2 --> 10.3 --> 10.4 --> 10.5

MySQLSun收购后,搞了个过渡的6.0版本,没多久就下线了,后来被Oracle收购后,终于迎来了像样的5.6版本,之后就是5.78.0版本。由于6.0版本号已被用过,7.x系列版本专用于NDB Cluster,因而新版本号从8.0开始

数据的时代

  • 涉及的数据量大

  • 数据不随程序的结束而消失

  • 数据被多个应用程序共享

  • 大数据

数据的分类

  • 结构化的数据:即有固定格式和有限长度的数据。例如填的表格就是结构化的数据,国籍:中华人

    民共和国,民族:汉,性别:男,这都叫结构化数据

  • 非结构化的数据:非结构化的数据越来越多,就是不定长、无固定格式的数据,例如网页,有时候

    非常长,有时候几句话就没了;例如语音,视频都是非结构化的数据

  • 半结构化数据:比如:XML或者HTML的格式的数据

数据库的发展史

文件管理系统的缺点

编写应用程序不方便

数据冗余不可避免

应用程序依赖性

不支持对文件的并发访问

数据间联系弱

难以按用户视图表示数据

无安全控制功能

数据库系统发展阶段

萌芽阶段:文件系统

使用磁盘文件来存储数据

初级阶段:第一代数据库

出现了网状模型、层次模型的数据库

中级阶段:第二代数据库

关系型数据库和结构化查询语言

高级阶段:新一代数据库

“关系-对象”型数据库

DBMS数据库管理系统

  • Database:数据库是数据的汇集,它以一定的组织形式存于存储介质上
  • DBMS:是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心
  • DBA:负责数据库的规划、设计、协调、维护和管理等工作
  • 应用程序:指以数据库为基础的应用程序

数据库管理系统的优点

  • 相互关联的数据的集合
  • 较少的数据冗余
  • 程序与数据相互独立
  • 保证数据的安全、可靠
  • 最大限度地保证数据的正确性
  • 数据可以并发使用并能同时保证一致性

数据库管理系统的基本功能

  • 数据定义
  • 数据处理
  • 数据安全
  • 数据备份

数据库系统的架构

  • 单机架构
  • 大型主机/终端架构
  • 主从式架构(C/S)
  • 分布式架构

RDBMS 关系型数据库

Relational Database Management System,关系模型最初由IBM公司的英国计算机科学家埃德加·科德

(Edgar F. Codd)于1969年描述,1974年,IBM开始开发系统R,这是一个开发RDBMS原型的研究项目。

然而,第一个商业上可用的RDBMS是甲骨文,于1979年由关系软件(现为甲骨文公司)发布

关系统型数据库相关概念

  • 关系Relational :关系就是二维表,其中:表中的行、列次序并不重要
  • 行row:表中的每一行,又称为一条记录record
  • 列column:表中的每一列,称为属性,字段,域field
  • 主键Primary key:PK , 用于惟一确定一个记录的字段,一张表只有一个主键
  • 域domain:属性的取值范围,如,性别只能是’男’和’女’两个值,人类的年龄只能0-150

常用关系数据库

MySQL: MySQL, MariaDB, Percona Server

PostgreSQL: 简称为pgsql,EnterpriseDB

Oracle

MSSQL

DB2

数据库排名

https://db-engines.com/en/ranking
Linux-了解MySQL与部署MySQL_第2张图片

关系型数据库理论

实体联系模型E-R

实体Entity:客观存在并可以相互区分的客观事物或抽象事件称为实体,在E-R图中用矩形框表示实体,把实体名写在框内

属性:实体所具有的特征或性质

联系:联系是数据之间的关联集合,是客观存在的应用语义链

• 实体内部的联系:指组成实体的各属性之间的联系。如职工实体中,职工号和部门经理号之间

有一种关联关系

• 实体之间的联系:指不同实体之间联系。例:学生选课实体和学生基本信息实体之间

• 实体之间的联系用菱形框表示
Linux-了解MySQL与部署MySQL_第3张图片

联系类型

  • 一对一联系(1:1)
  • 一对多联系(1:n):外键
  • 多对多联系(m:n):增加第三张表

数据的操作

  • 数据提取:在数据集合中提取感兴趣的内容。SELECT
  • 数据更新:变更数据库中的数据。INSERT、DELETE、UPDATE

数据库规划流程

  1. 收集数据,得到字段

收集必要且完整的数据项

转换成数据表的字段

关系型数据库和非关系型数据库

1)描述主流的数据库系统
关系型数据库:
Mysql(Oracle公司) 、 SQL server(微软) 、access(微软公司office产品)
Oracle 、DB2(IBM公司),sybase(sybase) 等等

2)关系型数据库和非关系型数据库的区别
关系数据库:
关系数据库结构是二维数据库表,二维表当中每个字段(列)用来描述对象的一个属性,
每个记录(行)用来描述一个对象的信息(完整信息),关系数据库写到哪里也就是存储在硬盘当中
读写系统就会受到的IO限制或者瓶颈

其他
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

缓存加速软件
非关系型数据库(NoSQL):
MongoDB 、 Redis(内存数据库/缓存数据库)K-V键值对、与之类似的Memcache,K-V键值对
redis-memecache对比:
相同点:存储高热数据(在内存中高速运行)
不同点:redis可以做持久化保存,可以存储对象

非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:

1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、
图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。

安装 mysql

yum安装

去官网下载yum源 : https://www.mysql.com/downloads/
Linux-了解MySQL与部署MySQL_第4张图片
Linux-了解MySQL与部署MySQL_第5张图片
Linux-了解MySQL与部署MySQL_第6张图片
Linux-了解MySQL与部署MySQL_第7张图片
下载下来之后,直接 rpm-ivh 可以安装

[root@localhost ~]# yum info mariadb
已加载插件:fastestmirror, langpacks
updates                         | 2.9 kB     00:00     
updates/7/x86_64/primary_db                              |  20 MB   00:09     
Determining fastest mirrors
 * base: mirrors.163.com
 * extras: mirrors.qlu.edu.cn
 * updates: mirrors.163.com
可安装的软件包
名称    :mariadb
架构    :x86_64
时期       :1
版本    :5.5.68
发布    :1.el7
大小    :8.8 M
源    :base/7/x86_64
简介    : A community developed branch of MySQL
网址    :http://mariadb.org
协议    : GPLv2 with exceptions and LGPLv2 and BSD
描述    : MariaDB is a community developed branch of MySQL.
         : MariaDB is a multi-user, multi-threaded SQL database server.
         : It is a client/server implementation consisting of a server daemon
         : (mysqld) and many different client programs and libraries. The base
         : package contains the standard MariaDB/MySQL client programs and
         : generic MySQL files.

MySQL被Sun收购后,搞了个过渡的6.0版本,没多久就下线了,后来被Oracle收购后,终于迎来了像样的5.6
版本,之后就是5.7、8.0版本。由于6.0版本号已被用过,7.x系列版本专用于NDB Cluster,因而新版本
号从8.0开始。

yum安装5.7版本

[root@localhost ~]# yum install mariadb-server -y

[root@localhost ~]# systemctl start mariadb.service

[root@localhost ~]#mysql
[root@localhost ~]#mysql_secure_installation 
#初始化设置  先输入密码 一路回车   

[root@centos7 ~]#tee /etc/yum.repos.d/mysql.repo <<EOF
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
EOF

清华大学


[root@centos7 ~]#tee /etc/yum.repos.d/mysql.repo <<EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=0
EOF

官方源

[root@centos7 ~]#cat >/etc/yum.repos.d/mysql.repo <<EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=0
EOF


http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/

[root@centos7 ~]#yum -y install mysql-community-server
[root@localhost yum.repos.d]# systemctl start mysqld
[root@localhost yum.repos.d]# ss -ntap |grep 3306
[root@localhost yum.repos.d]# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

[root@centos7 ~]#grep password /var/log/mysqld.log
[root@localhost yum.repos.d]# mysql -u root -p'+8saq%5+ljzG'
#特殊符号用单引号引起来

mysql> status
#必须改密码
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

set global validate_password_policy=0;
set global validate_password_length=1;
#修改密码策略

mysql> alter user root@'localhost' identified by '123123';


mysql> \h
#查看帮助



应用单多线程:
pstree -p
cat /proc/线程id/status
proc 存在内存中

mysql> system hostname
localhost.localdomain
#可以直接使用系统命令
#source 可以调用脚本


mysql> \h, help
mysql> \u,use
mysql> \s,status
mysql> \!,system

mysql [OPTIONS] [database]
命令格式

-A, --no-auto-rehash 禁止补全
-u, --user= 用户名,默认为root
-h, --host= 服务器主机,默认为localhost
-p, --passowrd= 用户密码,建议使用-p,默认为空密码
-P, --port= 服务器端口
-S, --socket= 指定连接socket文件路径
-D, --database= 指定默认数据库
-C, --compress 启用压缩
-e   "SQL" 执行SQL命令
-V, --version 显示版本
-v  --verbose 显示详细信息
--print-defaults 获取程序默认使用的配置

#默认空密码登录
mysql  -uroot  -p

mysql>use mysql #切换数据库
mysql> select database();                   #查看当前数据库
mysql>select user(); #查看当前用户
mysql>SELECT User,Host,Password FROM user;
mysql>system clear #清屏
mysql> ^DBye       #ctrl+d 退出

mysqladmin命令

mysqladmin [OPTIONS] command command...

#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -u用户 -p密码   ping
mysqladmin -uroot -p123123  ping
#关闭mysql服务,但mysqladmin命令无法开启
mysqladmin -uroot -pcentos shutdown
#创建数据库testdb
mysqladmin -uroot -pcentos   create testdb 
#删除数据库testdb
mysqladmin -uroot -pcentos   drop testdb
#修改root密码
mysqladmin -uroot -pcentos password 'magedu'
#日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs

编译安装mysql

建议:内存4G以上

安装相关依赖包

yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel   ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel

源码编译安装

编译安装说明

利用cmake编译,而利用传统方法,cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译编译
选项: https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

下载并解压缩源码包

tar xf  mysql-boost-5.7.20.tar.gz

[root@localhost opt]#cd mysql-5.7.20/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1

#############模块解释#####################
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
#指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
#指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DSYSCONFDIR=/etc \
#指定配置文件的存储路径
-DSYSTEMD_PID_DIR=/usr/local/mysql \
#指定进程文件的存储路径
-DDEFAULT_CHARSET=utf8  \
#指定默认使用的字符集编码,如utf8
-DDEFAULT_COLLATION=utf8_general_ci \
#指定默认使用的字符集校对规则
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
#安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
#安装ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
#安装BLACKHOLE存储引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
#安装FEDERATED存储引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \
#指定数据库文件的存储路径
-DWITH_BOOST=boost \
#指定boost的路径,
-DWITH_SYSTEMD=1
#生成便于systemctl管理的文件
#############模块解释#####################


make 
make install

4、数据库目录进行权限调整
[root@localhost mysql-5.7.20]#chown -R mysql:mysql /usr/local/mysql/

5、调整配置文件
[root@localhost mysql-5.7.20]#vi /etc/my.cnf
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES


NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
STRICT_TRANS_TABLES
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_AUTO_CREATE_USER
禁止:GRANT创建密码为空的用户
NO_AUTO_VALUE_ON_ZERO
mysql中的自增长列可以从o开始。默认情况下自增长列是从1开始的,如果你插入值为0的数据会报错
NO_ZERO_IN_DATE
mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。默认情况下数据被零除时MysQL返回NULL
IPES_AS_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和oracle数据库是一样的,
ANSI QUOTES
启用ANSI QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

[root@localhost mysql-5.7.20]#chown mysql:mysql /etc/my.cnf
#改变属主 属组


6、设置环境变量
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile


7、初始化数据库
cd /usr/local/mysql/

bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/

8、数据库开启自启、 关闭、状态 
systemctl enable mysqld
systemctl start mysqld
systemctl stop mysqld
systemctl status mysqld
netstat -anpt | grep 3306


9、设置Mysql密码

mysqladmin -u root -p password
#开始初始密码为空  回车即可   然后输入新密码


update mysql.user set authentication_string=password('123123') where user='root' and host='127.0.0.1' or host='localhost';
update mysql.user set authentication_string=password('newpassword') where user='root' and host='127.0.0.1' or host='localhost';



10、登录数据库
mysql -u root -p 



#################提示:#############
如果出错,执行rm -f CMakeCache.txt
###################################

优化操作

生成提示符

#查看mysql版本
[root@centos7 ~]#mysql -V

#修改提示符

[root@localhost ~]#vim /etc/my.cnf                       
[mysql]
prompt=(\\u@\\h) [\\d]>\\_

自动补全

yum安装可以 编译安装有问题

[mysql]
prompt=(mysql) [\\d]>\\_
auto-rehash
#自动补全 只能补全敲过的命令

客户端程序

  • mysql: 交互式或非交互式的CLI工具
  • mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成
  • insert等写操作语句保存文本文件中
  • mysqladmin:基于mysql协议管理mysqld
  • mysqlimport:数据导入工具
  • MyISAM存储引擎的管理工具:
  • myisamchk:检查MyISAM库
  • myisampack:打包MyISAM表,只读

用户账号

mysql用户账号由两部分组成:

'USERNAME'@'HOST'
zhou@'10.0.0.100'     只有100能访问后面单引号必加
zhou@'10.0.0.%'

说明:

HOST限制此用户可通过哪些远程主机连接mysql服务器

支持使用通配符:

% 匹配任意长度的任意字符,相当于shell中*, 示例: 172.16.0.0/255.255.0.0172.16.%.%
_ 匹配任意单个字符,相当于shell中?

多实例

多实例介绍

  • 什么是数据库多实例

多实例类似微信双开,端口号类比微信账号,数据库类比聊天窗口,表类比聊天记录MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307、3308等),同时运行多个MySQL服务进程,这些服务进程通过不同的Socket监听不同的服务端口来提供服务。多实例可能是MySQL的不同版本,也可能是MySQL的同一版本实现

  • 多实例的好处

可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳选择

  • 多实例弊端

存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者SQL查询慢时,整个实例会消耗大量的CPU、磁盘I/O等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以具体的需求要根据自己的实际情况而定。

[root@localhost ~]# yum -y install mariadb-server
[root@localhost ~]#mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
[root@localhost ~]# chown -R mysql.mysql /mysql
[root@localhost ~]# tree -d /mysql/
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3306/data
#生成数据库文件重复三次
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3307/data
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3308/data
[root@localhost ~]#vim /mysql/3306/etc/my.cnf
#编辑配置文件
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid
[root@localhost ~]#sed 's/3306/3307/' /mysql/3306/etc/my.cnf > 
/mysql/3307/etc/my.cnf
[root@localhost ~]#sed 's/3306/3308/' /mysql/3306/etc/my.cnf > 
/mysql/3308/etc/my.cnf

#######准备启动脚本
[root@localhost ~]#vim /mysql/3306/bin/mysqld
#!/bin/bash

port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}


function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
   fi
}


function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
[root@localhost ~]#chmod +x /mysql/3306/bin/mysqld 
#重复上述过程,分别建立33073308的启动脚本

#######启动服务
[root@localhost ~]#/mysql/3306/bin/mysqld start
[root@localhost ~]#/mysql/3307/bin/mysqld start
[root@localhost ~]#/mysql/3308/bin/mysqld start
[root@localhost ~]#ss -ntl

#######登录实例
[root@localhost ~]#/mysql/3308/bin/mysqld start
#两种连接方法
[root@localhost ~]#mysql -h127.0.0.1 -P3308
[root@localhost ~]#mysql -u root -S /mysqld/3306/socket/mysql.sock
#确认连接的端口

####关闭数据库,需要手动输入root的密码
[root@localhost ~]#/mysql/3308/bin/mysqld stop
Stoping MySQL...
Enter password: 
[root@localhost ~]#/mysql/3308/bin/mysqld start
Starting MySQL

##########修改密码
[root@localhost ~]#mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password 
'123123' 
[root@localhost ~]#mysqladmin -uroot -S /mysql/3307/socket/mysql.sock password 
'123123' 
[root@localhost ~]#mysqladmin -uroot -S /mysql/3308/socket/mysql.sock password 
'123123'


#####测试连接
[root@localhost ~]#mysql -uroot -p -S /mysql/3306/socket/mysql.sock #提示输入口令才
能登录


######开机启动
[root@localhost ~]#vim /etc/rc.d/rc.local
#在最后一行加下面内容
for i in {3306..3308};do /mysql/$i/bin/mysqld start;done
[root@localhost ~]#chmod +x /etc/rc.d/rc.local

安装mycli 插件 客户端工具

客户端工具和mysql

[root@localhost opt]#yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
[root@localhost opt]#tar zxvf Python-3.7.7_.tgz
[root@localhost Python-3.7.7]#cd Python-3.7.7/
[root@localhost Python-3.7.7]#./configure --prefix=/usr/local/Python-3.7.7/
[root@localhost Python-3.7.7]#make  
[root@localhost Python-3.7.7]#make install
[root@localhost Python-3.7.7]#ln -s  /usr/local/Python-3.7.7/bin/python3.7  /usr/bin/python37
[root@localhost Python-3.7.7]#ln -s /usr/local/Python-3.7.7/bin/pip3.7 /usr/bin/pip37
[root@localhost Python-3.7.7]#pip37 install mycli -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
[root@localhost Python-3.7.7]#ln -s /usr/local/Python-3.7.7/bin/mycli /usr/bin/mycli
[root@localhost Python-3.7.7]#mycli -u root -p 123123

[root@localhost ~]#vim /etc/my.cnf                       
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
auto-rehash

图形化界面:

[mysqld]
skip_grant_tables

基本操作

SQL分类

  • 数据库:database
  • 表:table,行:row 列:column
  • 索引:index
  • 视图:view
  • 存储过程:procedure
  • 存储函数:function
  • 触发器:trigger
  • 事件调度器:event scheduler,任务计划
  • 用户:user
  • 权限:privilege

SQL 语言规范

在数据库系统中,SQL 语句不区分大小写,建议用大写

SQL语句可单行或多行书写,默认以 " ; " 结尾

关键词不能跨多行或简写

用空格和TAB 缩进来提高语句的可读性

子句通常位于独立行,便于编辑,提高可读性

数据库对象和命名

数据库的组件(对象):

数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等

命名规则:

必须以字母开头,后续可以包括字母,数字和三个特殊字符(# _ $)

不要使用MySQL的保留字,tabble select show databases

SQL语句分类

  • DDL: Data Defination Language 数据定义语言

CREATE,DROP,ALTER

  • DML: Data Manipulation Language 数据操纵语言

INSERT,DELETE,UPDATE

软件开发:CRUD

  • DQL:Data Query Language 数据查询语言

SELECT

  • DCL:Data Control Language 数据控制语言

GRANT,REVOKE

  • TCL:Transaction Control Language 事务控制语言

COMMIT,ROLLBACK,SAVEPOINT

#DDL: Data Defination Language 数据定义语言
CREATEDROPALTER

#DML: Data Manipulation Language 数据操纵语言
INSERTDELETEUPDATE

#DQL:Data Query Language 数据查询语言
SELECT 


#DCL:Data Control Language 数据控制语言
GRANTREVOKECOMMITROLLBACK


SELECT *                 #SELECT子句
FROM products             #FROM子句
WHERE price>666         #WHERE子句

查看帮助信息

mysql> help create
#help 后面跟上具体命令可以查看帮助
Many help items for your request exist.
To make a more specific request, please type 'help ',
where <item> is one of the following
topics:
   CREATE DATABASE
   CREATE EVENT
   CREATE FUNCTION
   CREATE FUNCTION UDF
   CREATE INDEX
   CREATE LOGFILE GROUP
   CREATE PROCEDURE
   CREATE SERVER
   CREATE TABLE
   CREATE TABLESPACE
   CREATE TRIGGER
   CREATE USER
   CREATE VIEW
   SHOW
   SHOW CREATE DATABASE
   SHOW CREATE EVENT
   SHOW CREATE FUNCTION
   SHOW CREATE PROCEDURE
   SHOW CREATE TABLE
   SHOW CREATE USER
   SPATIAL

查看支持的字符集

show charset;
#查看支持字符集
默认拉丁文字

utf8     | UTF-8 Unicode   
#阉割版的

utf8mb4  | UTF-8 Unicode 
#真实的版本

我们编译安装已经修改过了

管理数据库

创建数据库

CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME'
CHARACTER SET 'character set name'
COLLATE 'collate name';

mysql> show variables like 'char%';
#查看当前默认字符
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)


MySQL root@localhost:(none)> create database db1;
#建立数据库  db1
Query OK, 1 row affected
Time: 0.002s

MySQL root@localhost:(none)> show create database db1;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| db1      | CREATE DATABASE "db1" /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+

1 row in set
Time: 0.018s


MySQL root@localhost:(none)> create database db2 charset=utf8;
#指定utf8 字符集
Query OK, 1 row affected
Time: 0.001s


mysql> create database zabbix character set utf8 collate utf8_bin;
#字符集 utf8  不区分大小写    collate utf8_bin这个排序规则  可以区分  

例子:

建立db2 数据库 并设置字符集

mysql> create database db2 charset=latin1;
mysql> show create database db2

修改数据库

当建立好数据库后可以使用 ALTER 命令修改

ALTER DATABASE DB_NAME character set utf8;
#修改字符集
[root@node2 db2]#cat /usr/local/mysql/data/db2/db.opt 
#查看当前字符集   yum  安装可以用find 查找同名的数据库
default-character-set=latin1
default-collation=latin1_swedish_ci

例子:

(mysql)[school]> alter database school character set utf8 collate utf8_bin;
#修改默认字符集 和 排序规则
(mysql)[school]> show create database school ;
+----------+----------------------------------------------------------------------------------+
| Database | Create Database                                                                  |
+----------+----------------------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

删除数据库

DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';

MySQL root@localhost:(none)> drop database db1;
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
Query OK, 0 rows affected
Time: 0.005s
MySQL root@localhost:(none)> show databases;

例子:

[root@localhost mysql]#cd /home/mysql/
#数据库其实 就是一个文件夹,删除数据库等于删除文件夹
[root@localhost mysql]#ls
auto.cnf  db2      ib_logfile0  localhost.localdomain.err  mysql       performance_schema  test
db1       ibdata1  ib_logfile1  localhost.localdomain.pid  mysql.sock  school

查看数据库列表

SHOW DATABASES;

MySQL root@localhost:(none)> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |#系统自带数据库
| bbs                |
| db2                |
| db3                |
| kgc                |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
9 rows in set
Time: 0.010s

例子:

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

数据类型

MySQL支持多种内置数据类型

数值类型

日期/时间类型

字符串(字符)类型

数据类型参考链接

https://dev.mysql.com/doc/refman/8.0/en/data-types.html

Linux-了解MySQL与部署MySQL_第8张图片

选择正确的数据类型对于获得高性能至关重要,三大原则:

  1. 更小的通常更好,尽量使用可正确存储数据的最小数据类型

  2. 简单就好,简单数据类型的操作通常需要更少的CPU周期

  3. 尽量避免NULL,包含为NULL的列,对MySQL更难优化

整数型

tinyint(m) 1个字节 范围(-128~127)

smallint(m) 2个字节 范围(-32768~32767)

mediumint(m) 3个字节 范围(-8388608~8388607)

int(m) 4个字节 范围(-2147483648~2147483647)

bigint(m) 8个字节 范围(±9.22*10的18次方)

上述数据类型,如果加修饰符unsigned后,则最大值翻倍

如:tinyint unsigned的取值范围为(0~255)

浮点型(float和double),近似值

float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位, 注意: 小数点不占用总个数

double(m,d) 双精度浮点型16位精度(8字节) m总个数,d小数位, 注意: 小数点不占用总个数

设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以

实际为准,即6位

定点数

在数据库中存放的是精确值,存为十进制 decimal(5.2) 100.01 - 999.99

格式 decimal(m,d) 表示 最多 m 位数字,其中 d 个小数,小数点不算在长度内

比如: DECIMAL(6,2) 总共能存6位数字,末尾2位是小数,字段最大值 9999.99 (小数点不算在长度内)

参数m<65 是总个数,d<30且 d

MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。

例如: decimal(18,9)小数点两边将各存储9个数字,一共使用9个字节:其中,小数点前的9个数字用4个

字节,小数点后的9个数字用4个字节,小数点本身占1个字节

浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储。double占用

8个字节

因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时

字符串

char(n) 固定长度,最多255个字符,注意不是字节

varchar(n) 可变长度,最多65535个字符

tinytext 可变长度,最多255个字符

text 可变长度,最多65535个字符

mediumtext 可变长度,最多2的24次方-1个字符

longtext 可变长度,最多2的32次方-1个字符

BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节

VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节

内建类型:ENUM枚举, SET集合

char和varchar的比较:

参考:https://dev.mysql.com/doc/refman/8.0/en/char.html

在这里插入图片描述

修饰符

适用所有类型的修饰符:

名称 含义
NULL 数据列可包含NULL值,默认值
NOT NULL 数据列不允许包含NULL值,*为必填选项
DEFAULT 默认值
PRIMARY KEY 主键,所有记录中此字段的值不能重复,且不能为NULL
UNIQUE KEY 唯一键,所有记录中此字段的值不能重复,但可以为NULL
CHARACTER SET name 指定一个字符集

适用数值型的修饰符:

名称 作用
AUTO_INCREMENT 动递增,适用于整数类型
UNSIGNED 无符号

建立表

(mysql)[school]> help create table
#查看帮助
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    ..............................................................

URL: http://dev.mysql.com/doc/refman/5.6/en/create-table.html

表操作

查看数据库结构

#查看数据库
show create database db1;



#选择数据库,切换库类似于cd
show tables;
show tables in mysql;


####查看表结构(字段)####
格式:describe [数据库名.]表名;
desc user;
desc servers;
#查看表结构

desc mysql.servers;
#不想先使用数据库可以使用上面的

例子:

desc student;




show create table student;

show tablesshow table status like 'student';
show table status like 'student'\G;
#分行

新建表

###创建新的表####
create table 表名 (字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]);
#主键一般选择代表唯一性的字段不允许为空值(null),且一个表只能有一个主键###

例子:

create table info (id int NOT NULL,name char(10) NOT NULL, age int, phone int
PRIMARY KEY (id) );


 create table student (id smallint unsigned primary key auto_increment, name varchar(10), age tinyyint unsigned,gender enum('M','F') default 'M' );

unsigned:取消负数
primary:主键
key auto_increment: 自增长
enum('M','F'):多选 
default 'M':默认值为 M


insert student(name,age) values('ben',19);
#加入数据



insert student values();
#加入空字段
select * from student;
#查找 会发现多一条空记录

##### 修改表结构

alter 添加字段

例子:

mysql [db1]> alter table student add phone char(11) not null ;


mysql [db1]> desc student;
+--------+----------------------+------+-----+---------+----------------+
| Field  | Type                 | Null | Key | Default | Extra          |
+--------+----------------------+------+-----+---------+----------------+
| id     | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(10)          | YES  |     | NULL    |                |
| age    | tinyint(3) unsigned  | YES  |     | NULL    |                |
| gender | enum('M','F')        | YES  |     | M       |                |
| phone  | char(11)             | NO   |     | NULL    |                |
+--------+----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

change 修改字段 名称**

例子:

mysql [db1]> alter table student change phone mobile char(11);
mysql [db1]> desc student;
+--------+----------------------+------+-----+---------+----------------+
| Field  | Type                 | Null | Key | Default | Extra          |
+--------+----------------------+------+-----+---------+----------------+
| id     | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(10)          | YES  |     | NULL    |                |
| age    | tinyint(3) unsigned  | YES  |     | NULL    |                |
| gender | enum('M','F')        | YES  |     | M       |                |
| mobile | char(11)             | YES  |     | NULL    |                |
+--------+----------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

drop 删除字段

例子:

mysql [db1]> alter table student drop mobile;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql [db1]> desc student;
+--------+----------------------+------+-----+---------+----------------+
| Field  | Type                 | Null | Key | Default | Extra          |
+--------+----------------------+------+-----+---------+----------------+
| id     | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(10)          | YES  |     | NULL    |                |
| age    | tinyint(3) unsigned  | YES  |     | NULL    |                |
| gender | enum('M','F')        | YES  |     | M       |                |
+--------+----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

其他例子

ALTER TABLE students RENAME s1;
ALTER TABLE s1 ADD phone varchar(11) AFTER name;
ALTER TABLE s1 MODIFY phone int;
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
ALTER TABLE s1 DROP COLUMN mobile;
ALTER TABLE s1 character set utf8;
ALTER TABLE s1 change name name varchar(20) character set utf8;
ALTER TABLE students ADD gender ENUM('m','f');
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY; 
ALTER TABLE students DROP age;
DESC students;
#新建表无主键,添加和删除主键
CREATE TABLE t1 SELECT * FROM students;
ALTER TABLE t1 add primary key (stuid);
ALTER TABLE t1 drop primary key

DML语言

DML: INSERT, DELETE, UPDATE

4.6.1 INSERT语句

功能:一次插入一行或多行数据

语法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
   [INTO] tbl_name [(col_name,...)]
   {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
   [ ON DUPLICATE KEY UPDATE #如果重复更新之
     col_name=expr
       [, col_name=expr] ... ]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
   [INTO] tbl_name
   SET col_name={expr | DEFAULT}, ...
   [ ON DUPLICATE KEY UPDATE
     col_name=expr
       [, col_name=expr] ... ]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
   [INTO] tbl_name [(col_name,...)]
    SELECT ...
   [ ON DUPLICATE KEY UPDATE
     col_name=expr
       [, col_name=expr] ... ]

简化

INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)

#解释
insert  表名[(字段)]  值(值1,值2....,(1,值2)......;
使用 insert 语句时 如果不在表后加上字段就要一一对应填写上信息(注意 字符串用引号引起来)

也可以指定添加的字段 

例子:

mysql [db1]> insert student(name,age,phone) values('mike',20,'10086')#添加一条记录

mysql [db1]> insert student(name,age,phone) values('mike',20,'10086'),('peter',18,'10000');
#用逗号隔添加多条记录



mysql [db1]> insert student values(null,'小强',20,'M','10010');
#不指明添加字段,  学生编号有 自增长可以使用空

UPDATE语句

语法:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
   [WHERE where_condition]
   [ORDER BY ...]
   [LIMIT row_count]
   
   
   
#解释
update  表名   set  字段=修改  指定哪条记录

注意:一定要有限制条件,否则将修改所有行的指定字段

例子:

mysql [db1]> update student set gender='F' where id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql [db1]> select * from student;
+----+--------+------+--------+-------+
| id | name   | age  | gender | phone |
+----+--------+------+--------+-------+
|  1 | ben    |   19 | M      |       |
|  2 | NULL   | NULL | M      |       |
|  3 | mike   |   20 | M      | 10086 |
|  4 | peter  |   18 | M      | 10000 |
|  5 | 小强   |   20 | M      | 10010 |
|  6 | 小红   |   20 | F      | 10010 |
+----+--------+------+--------+-------+
6 rows in set (0.00 sec)



mysql [db1]> update student set name='旺财' , age=15 where id=2;

mysql [db1]> select * from student;
+----+--------+------+--------+-------+
| id | name   | age  | gender | phone |
+----+--------+------+--------+-------+
|  1 | ben    |   19 | M      |       |
|  2 | 旺财   |   15 | M      |       |
|  3 | mike   |   20 | M      | 10086 |
|  4 | peter  |   18 | M      | 10000 |
|  5 | 小强   |   20 | M      | 10010 |
|  6 | 小红   |   20 | F      | 10010 |
+----+--------+------+--------+------

DELETE语句

删除表中数据,但不会自动缩减数据文件的大小。

语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
   [WHERE where_condition]
   [ORDER BY ...]
   [LIMIT row_count]
 可先排序再指定删除的行数
 
 #解释:
 delete  from  表名   指定条件

注意:一定要有限制条件,否则将清空表中的所有数据

如果想清空表,保留表结构,也可以使用下面语句,此语句会自动缩减数据文件的大小。

例子:

mysql [db1]> delete from student where id=5;
Query OK, 1 row affected (0.01 sec)

总结

常用的数据类型:
int:整型						用于定义整数类型的数据
float:单精度浮点4字节32位		准确表示到小数点后六位		
double:双精度浮点8字节64char:固定长度的字符类型		用于定义字符类型数据。
varchar:可变长度的字符类型		
text:文本
image:图片
decimal(5,2)5个有效长度数字,小数点后面有2位		指定长度数组
#Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,
#如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错


########查看数据库结构#############

------SQL语句-------
用于维护管理数据库,包括对数据查询,数据更新、访问控制、对象管理功能。

增删改    #  查  #



SQL语言分类:
DDL:数据定义语言,用于创建数据库对象,如库、表、索引等。(create )
DML:数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据(insert drop delete update )
DQL:数据查询语言,用于从数据表中查找符合条件的数据记录(select )
DCL:数据控制语言,用于设置或者更改数据库用户或角色权限(grant )
(数据控制语句,用于控制不通数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,COMMITROLLBACKGRANTREVOKE1####查看数据库结构###
SHOW DATABASES;    #大小写不区分,分号“;”表示结束

2####查看数据库中包含的表###
use 数据库名
use mysql;
选择数据库,切换库类似于cd
show tables;

show tables in mysql;



3####查看表结构(字段)####
格式:describe [数据库名.]表名;
desc user;
desc servers;
#查看表结构

desc mysql.servers;
#不想先使用数据库可以使用上面的


#创建新的数据库####
CREATE DATABASE 数据库名;

SHOW DATABASES;




---------创建及删除数据库和表--------------
##1.创建新的数据库###
create database(数据库名)###2.创建新的表####
create table 表名 (字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]);
#主键一般选择代表唯一性的字段不允许为空值(null),且一个表只能有一个主键###

例子
create table info (id int NOT NULL,name char(10) NOT NULL, age int, phone int
PRIMARY KEY (id) );

desc info;
#查看表结构

CREATE DATABASE school;
USE school;
CREATE TABLE ky15 (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT'', PRIMARY KEY (id));
DESC zzz;


####管理表中的数据#####
1.向数据表中插入新的数据记录
insert into 表名(字段1,字段2,字段3values(字段1的值,字段2的值,字段3的值);

例子:
insert into INFO(ID,NAME,AGE,NUMBER) VALUES(1,'jj',22,13755);
#注意字符串要用引号引起来。
insert into INFO VALUES(3,'19',21,1244);
#直接使用表名添加数据

insert into INFO(ID,NAME,NUMBER) VALUES(3,'KK',1244)#可以指定字段添加
select * from INFO
#查询表中的数据记录
select * from mysql.user\G

2.查询数据记录
select NAME,NUMBER from `INFO`
#查看指定字段字段
格式 select 字段1,字段2 from 表名 [where 条件表达式]
可以使用where来写条件表达式

SELECT * FROM students WHERE id < 3
#id小于3的
select * from INFO where age=22;
#只找22岁的
select * from INFO where age=22 and name='jj';
#只找22岁和名字叫jj的

select * from INFO limit 2;
#加上limit选项可以看前几行
select * from INFO limit 2,3;
#第二行之后的前三行



3 修改、更新数据表中的数据记录
update 表名 set 字段名1=修改字段值1 ,字段名2=修改的字段值2 [where 条件表达式]

例子:
update INFO set name='kl';
#后面不跟条件就全部修改了
update INFO set name='kl' where id=3;
#指定id为3 的修改名字
可以 修改多个字段


4 在数据表中删除指定的数据记录
delete from 表名 [where 条件表达式]

delete from 表名
将整个表中的数据整个删除

例子:
delete from `INFO` where id=6;



-----修改表名和表结构-------
1 修改表名
alter table 旧表名 rename 新表名;

例子:
alter table INFO rename calss;
alter table calss rename info;

2扩展表结构(增加字段)
alter table 旧表名 add address varchar(50) default '居无定所';

alter table info add guoji varchar(50) default 'zhongguo';
default 字段 表示没有设置时会自动匹配

3 修改字段(列)名,添加唯一键
alter table 表名 change 旧列名 新列名 数据类型 [unique key];
unique key 唯一键,可以为多个



例子:
alter table info change user_address address char(50) unique key;

insert into info values(8,'tc',30,333,'nj','中国','男'); 


insert into info values(9,'tc',30,333,'中国','中国',' 男');
ERROR 1062 (23000): Duplicate entry '中国' for key 'address'


4删除字段
alter table info drop sex;
alter table 表名  drop 字段名;




##案列扩展
use school;
create table if not exists info (id int(4) zerofill primary key auto_increment,    name varchar(10) not null,cardid int(18) not null unique key,hobby varchar(50));
------------------------------------------------------------------------------------------------------------------------
#if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;
自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且
添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
---------------------------------------------------------------------


create table if not exists bbs (id int(4) zerofill auto_increment primary key,name char(20) not null, age int(3));

insert into bbs (name,age) values('zls',23);
insert into bbs (name,age) values('xw',23);



=====数据表高级操作======
克隆表
create table yyy2 like yyy;    #复制格式,通过LIKE方法,复制yyy表结构生成yyy2表
insert into yyy2 select * from yyy;      #备份内容

克隆表,将数据表的数据记录生成到新的表中
CREATE TABLE test02 (SELECT * from test);   #复制test 表数据到test02中
  
show create table test02\G    #获取数据表的表结构、索引等信息
SELECT * from test02;

#####清空表,删除表内的所有数据######
方法一:
delete from yyy3;
#DELETE清空表后,返回的结果内有删除的记录条目; 
DELETE 工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM 删除
所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。

方法二:
truncate table test01;
#TRUNCATE清空表后,没有返回被删除的条目: TRUNCATE 工作时是将表结构按原样重新建立,
因此在速度上TRUNCATE会比DELETE清空表快;使用TRUNCATE TABLE 清空表内数据后,
ID会从1开始重新记录


小结:
#删除类型
drop table table_name
1)属于DDL
2)不可回滚(无法恢复)
3)不可带where
4)表内容和结构删除
5)删除速度快

truncate table table_name
1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快

delete from table_name
1)属于DML
2)可回滚(可恢复)
3)可带where
4)表结构在,表内容要看where执行的情况
5)册删除速度慢,需要逐行删除

不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate

#删除
速度
drop> truncate > delete
安全性
delete 最好

你可能感兴趣的:(mysql,数据库,java)