一、准备
1.源码编译安装 MySQL
必须先准备好软件包至/opt目录下
- 软件包资源传送门:百度网盘 请输入提取码
- 提取码:u4vw
#!/bin/bash
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
#关闭防火墙(开机禁用)及安全访问策略
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
#安装 MySQL 环境依赖包
useradd -M -s /sbin/nologin mysql
#创建运行用户
cd /opt
tar zxvf mysql-boost-5.7.20.tar.gz
#解压软件包
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_EXTRA_CHARSETS=all \
-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
#配置软件模块
make -j 4 && make install
#编译安装(时间较长!)
echo '[client]
port = 3306
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
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
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' > /etc/my.cnf
#修改mysql配置文件
chown -R mysql.mysql /usr/local/mysql/
chown mysql.mysql /etc/my.cnf
#更改mysql安装目录和配置文件的属主属组
echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
source /etc/profile
#设置路径环境变量
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
#初始化数据库
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld
#添加mysql系统服务
netstat -anpt | grep 3306
#检查端口,服务是否正常开启
ln -s /usr/local/mysql/bin/* /usr/local/sbin
- 执行脚本
. mysql.sh
#静静等待即可,主要是编译安装的时间较长
mysqladmin -u root -p password "123123"
#修改mysql登录密码,输入后直接再回车即可
mysql -u root -p
#输入密码后登录
grant all privileges on *.* to 'root'@'%' identified by '123123';
#授权远程登录,密码为'123123'
show databases;
#查看数据库结构
quit
#退出数据库
mysql -uroot -p123123
#可直接登录
2.创建两个表以作例子
mysql -uroot -p123123
create database school;
#创建库
use school;
create table class01(id int(4),name char(10),number char(11));
create table class02(id int(4),name char(10),number char(11));
#创建表
desc class01;
desc class02;
#查看表结构
insert into class01 values (1,'ghr1','111111','80');
insert into class01 values (2,'ghr2','222222','90');
insert into class01 values (3,'ghr3','333333','80');
insert into class01 values (4,'ghr4','444444','60');
#在表一中插入数据
select * from class01;
#查看表中的所有数据
insert into class02 values(1,'ghr5','55555','80');
insert into class02 values(2,'ghr6','66666','85');
insert into class02 values(3,'ghr3','123','65');
insert into class02 valuer(4,'ghr4','1234','75');
select * from class02;
二、SQL 语句高阶运用
1.SELECT
- 显示表格中一个或数个字段的所有资料
- 用法:
SELECT 字段 FROM 表名
例:
select name from class01;
select money from class02;
2.DISTINCT
- 不显示重复的资料,及去重
- 用法:
ELECT DISTINCT 字段 FROM 表名
例:
select distinct money from class01;
select distinct money from class02;
3.WHERE
- 有条件查询
- 用法
SELECT 字段 FROM 表名 WHERE 条件
例:
select name from class01 where number > 300000;
select money from class02 where id = 4;
select number from class01 where money < 85;
4.AND、OR
- 且和或
- 用法:
SELECT 字段 FROM 表名 WHERE 条件1 [AND|OR] (条件2);
例:
select money from class02 where money >60;
select money from class02 where money > 60 and money <80;
select money from class02 where money > 60 and money < 80 or name = 'ghr5';
5.IN
SELECT 字段 FROM 表名 WHERE 字段 IN ('值1','值2',...);
例:
select name,money from class02 where money in (85,65);
select money,date from class02 where money in (select money from class01);
6.BETWEEN
- 显示两个值范围内的资料
- 用法:
SELECT 字段 FROM 表名 WHERE 字段 BETWEEN '值1' and '值2';
例:
select * from class02 where money between 70 and 80;
select * from class02 where money between 65 and 85;
7.通配符(LIKE)
- 通常通配符都是跟LIKE一起使用
- %:百分号表示零个、一个或多个字符
- _:下划线表示单个字符
- LIKE:用于匹配模式来查找资料
- 用法:
SELECT 字段 FROM 表名 WHERE 字段 LIKE ‘模式’;
例:
select * from class02 where name LIKE 'g_r5';
select * from class02 where name LIKE '%6';
8.ORDER BY
- 按关键字排序
- 用法:
SELECT 字段 FROM 表名 [WHERE 条件] ORDER BY 字段 [ASC,DESC];
#ASC:按照升序进行排序,默认的排序方式
#DESC:按照降序进行排序
例:
select * from class01 order by money desc;
select * from class01 order by money asc;
select id,money from class01 order by money asc;
select id,money from class01 where money > 60 order by money asc;
三、函数
1.数学函数
- 具体用法如下表所示:
函数 | 解释 |
---|---|
abs(x) | 返回 x 的绝对值 |
rand() | 返回 0 到 1 的随机数 |
mod(x,y) | 返回 x 除以 y 以后的余数 |
power(x,y) | 返回 x 的 y 次方 |
round(x) | 返回离 x 最近的整数 |
round(x,y) | 保留 x 的 y 位小数四舍五入后的值 |
sqrt(x) | 返回 x 的平方根 |
truncate(x,y) | 返回数字 x 截断为 y 位小数的值 |
ceil(x) | 返回大于或等于 x 的最小整数 |
floor(x) | 返回小于或等于 x 的最大整数 |
greatest(x1,x2…) | 返回集合中最大的值 |
east(x1,x2…) | 返回集合中最小的值 |
- 例:
select abs(-1),rand(),mod(5,3),power(2,3),round(1.567);
select sqrt(9),truncate(1.2345,2),ceil(1.3);
select floor(1.7),greatest(1,2,3,4,5),least(1,2,3,4,5);
2.聚合函数
函数 | 解释 |
---|---|
avg() | 返回指定列的平均值 |
count() | 返回指定列中非 NULL 值的个数 |
min() | 返回指定列的最小值 |
max() | 返回指定列的最大值 |
sum(x) | 返回指定列的所有值之和 |
例
select avg(money) from class01;
select count(money) from class01;
select min(money) from class01;
select max(money) from class01;
select sum(money) from class01;
3.字符串函数
函数 | 解释 |
---|---|
trim() | 返回去除指定格式的值 |
concat(x,y) | 将提供的参数 x 和 y 拼接成一个字符串 |
substr(x,y) | 获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同 |
substr(x,y,z) | 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串 |
length(x) | 返回字符串 x 的长度 |
replace(x,y,z) | 将字符串 z 替代字符串 x 中的字符串 y |
upper(x) | 将字符串 x 的所有字母变成大写字母 |
lower(x) | 将字符串 x 的所有字母变成小写字母 |
left(x,y) | 返回字符串 x 的前 y 个字符 |
right(x,y) | 返回字符串 x 的后 y 个字符 |
repeat(x,y) | 将字符串 x 重复 y 次 |
space(x) | 返回 x 个空格 |
strcmp(x,y) | 比较 x 和 y,返回的值可以为-1,0,1 |
reverse(x) | 将字符串 x 反转 |
- [位置]:的值可以为 LEADING (起头), TRAILING (结尾), BOTH (起头及结尾)
- [要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串;缺省时为空格
- 例:
select trim(leading 'be' from 'beijing');
select trim(trailing '--' from 'beijing--');
select trim(both '--' from '--shenzhen--');
select concat(id,name) from class01 where name = 'ghr1';
select concat(id,' ',name) from class01 where name = 'ghr1';
select substr(money,1,2) from number;
select substr(money,1,3) from number;
select length(name) from class01;
select length(number) from class01;
select replace(name,'ghr1','ghr13') from class01;
select replace(name,'ghr2','ghr14') from class01;
select upper(name) from class01;
select upper(name) from class02;
select lower('ABCDERG');
select left(number,2) from class02;
select right(number,3) from class02;
select repeat(number,2) from class02;
select repeat(number,3) from class02;
select space(2);
select strcmp(100,200);
select strcmp(200,100);
select strcmp(200,200);
select reverse(name) from class02;
select reverse(money) from class02;
4.’||'连接符
- 如果在 mysql 的配置文件中,sql_mode 开启开启了 PIPES_AS_CONCAT,则"||"视为字符串的连接操作符而非或运算符
- 和字符串的拼接函数 Concat 相类似,这和 Oracle 数据库使用方法一样的
mysql -uroot -p123123
use school;
select name || ' ' || number from class02 where name like 'ghr%';
select number || ' ' || money || ' ' || id from class01;
5.GROUP BY
- BY 后面的栏位的查询结果进行汇总分组,通常是结合聚合函数一起使用的
- GROUP BY 有一个原则,就是 SELECT 后面的所有列中,没有使用聚合函数的列,必须出现在 GROUP BY 后面
- 用法:
select id,name,sum(money) from class02 group by name;
#聚合函数按找group by 后面的字段来判断,name字段若是相同的数值则会将money字段内的内容相加在输出
6.别名
- 用于字段别名与表格别名
- 用法:
SELECT “表格別名”.“字段1” [AS] “字段1別名” FROM “表格名” [AS] “表格別名”;
例:
select RE.region AS reg, count(site) from REGION AS RE group by reg;
select FA.site AS si,sum(money),count(money),date AS da from FARE AS FA group by si;
8.子查询
- 连接表格,在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句
#可以是符号的运算符
#例:=、>、<、>=、<=
#也可以是文字的运算符
#例:LIKE、IN、BETWEEN
例:
select A.site,region from REGION AS A where A.site in(select B.site from FARE AS B where money<2000);
select B.site,money,date from FARE AS B where site in(select A.site from REGION AS A where region = 'north');