MySQL 数据库--SQL 语句(一)

一、准备

1.源码编译安装 MySQL

必须先准备好软件包至/opt目录下

#!/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');

Guess you like

Origin blog.csdn.net/Arlssaze/article/details/120999878