 ljc.👏
  ljc.👏
  
  - MySQL入门基础知识@ljcccc.com - 入门知识- 优点- 性能卓越,服务稳定
开源无版权制约,自主性强,使用成本低
社区用户活跃
软件体积小,安装简单,易于维护
口碑效应好
支持多操作系统,提供多种API、对Java、Python、PHP有很好的支持
 
 - 发行版本- GA 稳定版- 5.7版本- 小版本是偶数版,5.7.17以上(支持高可用MGR)
 
 
 
 - MySQL产品线- 产品线2- PerconaDB 第三方 Xtrabackup PerconaDB
 
 
 - 软件的命名- mysql-5.6.40.tar.gz
5---主版本号
6---发行级别
40---发行系列的版本号
 
 
 - 安装方式- yum/rpm- rpm- rpm -ivh MySQL-client-5.6.40-1.el6.x86_64.rpm
rpm -ivh MySQL-server-5.6.40-1.el6.x86_64.rpm
rpm -ivh MySQL-devel-5.6.40-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-5.6.40-1.el6.x86_64.rpm
 
 - yum- yum install mysql-server -y
 
 
 - 二进制安装步骤- 包:mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
 - 安装依赖:yum install -y ncurses-devel libaio-devel autoconf cmake gcc gcc-c++ glibc
 - 解压: tar xf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
 - 移动到指定目录:mv mysql-5.6.40-linux-glibc2.12-x86_64 /usr/local/mysql-5.6.40
 - 创建软连接: ln -s /usr/local/mysql-5.6.40 /usr/local/mysql
 - 创建MySQL用户:useradd mysql -s /sbin/nologin -M
 - 添加环境变量:[root@mysql50 ~]#  vim /etc/profile.d/mysql.sh
export PATH="/usr/local/mysql/bin:$PATH"
source /etc/profile
 - 进入初始化目录:cd /usr/local/mysql/scripts
 - 执行初始化: ./mysql_install_db  --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
 - 修改默认配置文件- vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server_id=6
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=3306 [\\d]>
 
 - 拷贝启动脚本- (centos6版本): cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
 - (centos7版本):加入到system管理
[root@mysql50 ~]# vim /usr/lib/systemd/system/mysqld.service
[root@mysql50 ~]# systemctl daemon-reload ###重载- [Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
 
 
 - 创建初始密码:mysqladmin -uroot -p password 123
 
 - 源码编译安装- 包:mysql-5.6.40.tar.gz、boost_1_59_0.tar.bz2
 - 安装依赖:yum install -y ncurses-devel libaio-devel autoconf cmake gcc gcc-c++ glibc
 - 安装boost:[root@ljc-97 tools]tar xf boost_1_59_0.tar.bz2
[root@ljc-97 tools]mv boost_1_59_0 /usr/local/boost
 - 生成: cmake或gmake    ./configure --prefix=- cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data/ \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_USER=mysql \
-DWITH_DEBUG=0 \
-DWITH_EMBEDDED_SERVER=1 \
-DDOWNLOAD_BOOST=1  -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost
 
 - 编译并安装:make && make install
 - 创建用户:useradd mysql -s /sbin/nologin -M
 - 授权:chown mysql.mysql /usr/local/mysql/ -R
 - ####暂不用做软连接:ln -s /usr/local/mysql-5.6.40 /usr/local/mysql
 - 添加环境变量:[root@mysql50 ~]#  vim /etc/profile.d/mysql.sh
export PATH="/usr/local/mysql/bin:$PATH"
source /etc/profile
 - 修改配置文件(etc/my.cnf)- [root@ljc-97 ~]# egrep -v "^#|^$" /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql             ----mysql安装位置
datadir=/usr/local/mysql/data        ----mysql数据存放位置
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysql.log         ----mysql错误日志
pid-file=/var/run/mysql.pid
!includedir /etc/my.cnf.d
 
 - 拷贝启动脚本- (centos6版本): cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
 - (centos7版本):加入到system管理
[root@mysql50 ~]# vim /usr/lib/systemd/system/mysqld.service
[root@mysql51 ~]# systemctl daemon-reload ###重载- [Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
 
 
 - 初始化脚本:cd /usr/local/mysql/scripts/
 - 初始化:./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --user=mysql
 - 启动加入开机自启:systemctl start mysqld          systemctl status mysqld
 
 - 安装后优化- 创建密码- mysqladmin -uroot password '123'
 
 
 
 - 两种连接方式- TCP/IP连接- mysql -uroot -p123 -h 127.0.0.1
 - mysql -uroot -p123 -h127.0.0.1 -S /tmp/mysql.sock
 
 - socket连接- mysql -uroot -p -hlocalhost
 
 - 注意- 默认使用socket连接,因为使用TCP/IP连接需要建立三次握手
 - 不一定-h都是tcp,-hlocalhost是socket连接
 
 
 - 程序结构- 连接层- 通过以下语句可以查看到连接线程基本情况
mysql> show processlist;
 
 - SQL层- 4、验证语义- DDL :数据定义语言
DCL :数据控制语言
DML :数据操作语言
DQL :数据查询语言
 
 - 5、解析器:解析SQL语句,对语句执行前,进行预处理,生成解析树(执行计划),说白了就是生成多种执行方案.
 - 6、优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划
        代价模型:资源(CPU IO MEM)的耗损评估性能好坏
 - 7、执行器:根据最优执行计划,执行SQL语句,产生执行结果
执行结果:在磁盘的xxxx位置上- 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果
 
 - 8、提供查询缓存(默认是没开启的),会使用redis tair替代查询缓存功能
 - 9、提供日志记录(日志管理章节):binlog,默认是没开启的。
 
 - 存储引擎层- 负责根据SQL层执行的结果,从磁盘上拿数据。
将16进制的磁盘数据,交由SQL结构化化成表,
连接层的专用线程返回给用户。
 
 
 - 常用数据类型- 字符串类型- 文本VARCHAR:可变长度字符串,最多为65535个字符
 
 
 - 表属性- 列属性- primary key:主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
 - not null:非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
 - key:索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加
 - default:默认值
列中,没有录入值时,会自动使用default的值填充
 - auto_increment:自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
 
 - 表属性- 字符集和排序规则:
utf8---中文占3个字符       
utf8mb4---中文占4个字符
 
 
 - 基础管理- 用户管理- 增- mysql> create user @'10.0.0.%' identified by '123';
 
 - 删- mysql> drop user ljc@'10.0.0.%';
 
 - 改- mysql> alter user ljc@'10.0.0.%' identified by '456';
 - 修改密码- mysqladmin -uroot -p123  password '12'
 - mysql> set password=password('456')
 - mysql> update user set password=PASSWORD('123') where user='root' and host='localhost';
 - mysql> grant all privileges on *.* to oldboy@’10.0.0.%’ identified by ‘123’;
 
 - 忘记密码- 跳过授权表启动- [root@db01 data]# mysqld_safe --skip-grant-tables --skip-networking &
 
 - update修改密码- mysql> update mysql.user set password=password('567') where user='root' and host='localhost';
 
 
 
 - 查- mysql> desc mysql.user;    ---->  authentication_string
mysql> select user ,host ,authentication_string from mysql.user
 
 
 - 权限管理- 常用权限:
ALL:
SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
ALL : 以上所有权限,一般是普通管理员拥有的
with grant option:超级管理员才具备的,给别的用户授权的功能
 - 查看权限:mysql> show grants for app@'10.0.0.%';
 - 收回权限:mysql> revoke  delete on app.*  from app@'10.0.0.%';
 - 授权原则:最小权限- 单库- grant all on mysql.* to ljc@'10.0.0.%' identified  by '123';
 
 - 单表- grant all on mysql.user to ljc@'10.0.0.%' identified  by '123';
 
 - 单列- grant select(user,host) on mysql.user to ljc@'%' identified by '123';
 
 
 
 - 连接管理- MySQL自带的连接工具:mysql- -u:指定用户	mysql -uroot
-p:指定密码	mysql -uroot -p123
-h:指定主机	mysql -uroot -p123 -h127.0.0.1
-P:指定端口	mysql -uroot -p123 -h127.0.0.1 -p3307
-S:指定sock	mysql -uroot -p123 -h127.0.0.1 -S /tmp/mysql.sock
-e:指定SQL(库外执行SQL语句)	mysql -uroot -p123 -e "show databases;"
--protocol=name:指定连接方式
 
 
 
 - MySQL的启动优先级- 配置文件的读取生效顺序- 生效顺序:最后读取的配置生效
配置文件读取顺序:
1、/etc/my.cnf
2、/etc/mysql/my.cnf
3、$basedir/my.cnf
4、defaults-extra-file (类似include)
5、~/my.cnf				----------同时配置仅有它的配置生效
 - 若加入了system管理并指定了默认的配置文件:
--defaults-file:默认配置文件
如果使用./bin/mysqld_safe 守护进程启动mysql数据库时,使用了 --defaults-file=<配置文件的绝对路径>参数,这时只会使用这个参数指定的配置文件。
 
 - 1、命令行
2、defaults-file
3、配置文件(~/my.cnf)
5、配置文件(defaults-extra-file (类似include))
6、配置文件($basedir/my.cnf)
7、配置文件(/etc/mysql/my.cnf)
8、配置文件(/etc/my.cnf)
9、预编译
 
 - MySQL客户端常用命令- 库内接口命令- \G:		格式化显示查询的结果(key:value)
 
 - mysqldump命令- 修改密码/设置密码- [root@mysql50 ~]# mysqladmin -uroot -p password
 
 - 关闭MySQL服务- [root@mysql50 ~]# mysqladmin -uroot -p shutdown
 
 - 查看配置文件所有的默认参数- [root@mysql50 ~]# mysqladmin -uroot -p variables |grep database
 
 - 查看MySQL存活状态- [root@mysql50 ~]# mysqladmin -uroot -p ping
 
 - 查看MySQL状态信息- [root@mysql50 ~]# mysqladmin -uroot -p status
 
 - 删除数据库- [root@mysql50 ~]# mysqladmin -uroot -p drop DATABASE
 
 - 创建数据库- [root@mysql50 ~]# mysqladmin -uroot -p create DATABASE
 
 - 重载授权表/刷新缓存主机- [root@mysql50 ~]# mysqladmin -uroot -p reload
 
 - 刷新日志- [root@mysql50 ~]# mysqladmin -uroot -p flush-log
 
 - 查看当前所在位置- mysql> select database();
 
 
 
 - 常用SQL分类- DDL应用(数据定义语言)- 库- 创建库- 建库规范:
1.库名不能有大写字母   
2.建库要加字符集         
3.库名不能有数字开头
4.库名要和业务相关
 - 建库标准语句:
mysql> create database db charset utf8mb4;
mysql> show create database xuexiao;
 
 - 删除- mysql>drop database test;
 
 - 修改- mysql>ALTER DATABASE school  CHARSET utf8;
 
 - 查询(DQL)- show databases;
show create database test;
 
 
 - 表- 创建- 建表规范:
1. 表名小写
2. 不能是数字开头
3. 注意字符集和存储引擎
4. 表名和业务有关
5. 选择合适的数据类型
6. 每个列都要有注释
7. 每个列设置为非空,无法保证非空,用0来填充。
 - 语法格式:
create table stu(
列1  属性(数据类型、约束、其他属性) ,
列2  属性,
列3  属性
)
 
 - 查询(DQL)- use school
show tables;
desc stu;
show create table stu;
CREATE TABLE ceshi LIKE stu;
 
 - 改- #1.在上图表中添加QQ列
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT	'qq号';
#2.在sname后加微信列
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE  COMMENT '微信号' AFTER sname ;
#3.在id列前加一个新列num
ALTER TABLE stu ADD num INT NOT NULL COMMENT '数字' FIRST;
#4.修改sname数据类型的属性
ALTER TABLE stu MODIFY sname VARCHAR(128)  NOT NULL ;
#5.将sgender 改为 sg 数据类型改为 CHAR 类型
ALTER TABLE stu CHANGE sgender sg CHAR(1) NOT NULL DEFAULT 'n' ;
 
 - 删除- #4.把刚才添加的列都删掉
ALTER TABLE stu DROP num;
ALTER TABLE stu DROP qq;
ALTER TABLE stu DROP wechat;
 
 
 
 - DML应用(数据操作语言)- 作用:对表中的数据进行增、删、改- 增- insert 插入一行数据- --- 最标准的insert语句
INSERT INTO stu(id,sname,sage,sg,sfz,intime) 
VALUES
(1,'zs',18,'m','123456',NOW());
SELECT * FROM stu;
--- 省事的写法
INSERT INTO stu 
VALUES
(2,'ls',18,'m','1234567',NOW());
--- 针对性的录入数据
INSERT INTO stu(sname,sfz)
VALUES ('w5','34445788');
--- 同时录入多行数据
INSERT INTO stu(sname,sfz)
VALUES 
('w55','3444578d8'),
('m6','1212313'),
('aa','123213123123');
SELECT * FROM stu;
 
 
 - 删- delete 删除数据- 全表删除- DELETE FROM stu  WHERE id=3;
 - DELETE FROM stu
truncate table stu;
区别:
delete: DML操作, 是逻辑性质删除,逐行进行删除,速度慢.
truncate: DDL操作,对与表段中的数据页进行清空,速度快.
 
 - 伪删除- 用update来替代delete,最终保证业务中查不到(select)即可
 - 1.添加状态列
ALTER TABLE stu ADD state TINYINT NOT NULL DEFAULT 1 ;
SELECT * FROM stu;
2. UPDATE 替代 DELETE
UPDATE stu SET state=0 WHERE id=6;
3. 业务语句查询
SELECT * FROM stu WHERE state=1;
 
 
 
 - 改- update 修改数据- DESC stu;
SELECT * FROM stu;
UPDATE stu SET sname='zhao4' WHERE id=2;
注意:update语句必须要加where。
 
 
 
 
 - DQL应用(数据查询语言)- select- 单独使用- -- select 函数()- SELECT CONCAT("hello world");
 - SELECT CONCAT(USER,"@",HOST) FROM mysql.user;
 - SELECT GROUP_CONCAT(USER,"@",HOST) FROM mysql.user;
 
 
 - 单表子句-from- 语法:
SELECT 列1,列2 FROM 表
SELECT  *  FROM 表- 例子:
-- 查询stu表中,学生姓名和入学时间
SELECT sname , intime FROM stu;
-- 查询stu中所有的数据(不要对大表进行操作)
SELECT * FROM stu ;
 
 
 - 单表子句-where- where配合等值查询- SELECT * from city WHERE District='ZHEJIANG'
 
 - where配合比较操作符(<、> 、>=、 <= 、!=)- SELECT * from city WHERE Population < 100
 
 - where配合逻辑运算符(and  or)- SELECT * from city WHERE CountryCode='chn' and Population >5000000
 - SELECT * from city WHERE CountryCode='chn' or Population >5000000
 
 - where配合模糊查询- SELECT * FROM city WHERE district LIKE 'guang%';
 
 - where配合in语句- SELECT * FROM city WHERE countrycode IN ('CHN' ,'USA');
 
 - where配合between  and- SELECT * FROM city  WHERE population >1000000 AND population <2000000;
SELECT * FROM city  WHERE population BETWEEN 1000000 AND 2000000;
 
 
 - 单表子句-group by- 作用:根据 by后面的条件进行分组,方便统计,by后面跟一个列或多个列
 - 常用聚合函数- **max()**      :最大值
**min()**      :最小值
**avg()**      :平均值
**sum()**      :总和
**count()**    :个数
group_concat() : 列转行
 
 - 例子- 例子1:统计世界上每个国家的总人口数.
SELECT countrycode ,SUM(population)    FROM  city  GROUP BY countrycode;
例子2:统计世界上每个国家的城市数量
SELECT countrycode,COUNT(id)  FROM city GROUP BY countrycode;
 
 
 
 
 - DCL应用(数据控制语言)- grant:
			grant all on *.* to root@'%' identified by '123';
			max_queries_per_hour:一个用户每小时可发出的查询数量
			max_updates_per_hour:一个用户每小时可发出的更新数量
			max_connections_per_hour:一个用户每小时可连接到服务器的次数
			max_user_connections:允许同时连接数量
			
		revoke:
			revoke select on *.* from root@'%';