一.MySQL概述
1.常见数据库
Oracle(神喻):甲骨文
DB2:IMB
SQL Server:微软
Sybase:赛尔斯
MySQL:甲骨文
2.理解数据库
我们现在所说的数据库泛指“关系型数据库管理系统(RDBMS)“,即”数据库服务器“
3.数据库就是一个多行多列的表格,需要指定表的列数,以及列名称,列类型等形象。下图为表结构:
4.当把表格创建好之后,就可以向表格中添加数据了。下图为表记录:
总结:
RDBMS=管理员(manager)+仓库(database)
database=N个table
table:
表结构:定义表的列名和列类型
表记录:一行一行的记录
二.MySQL安装
1.Linux yum安装mysql5.7
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
yum repolist all |grep mysql
yum -y install yum-utils
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
yum install mysql-community-server
#sudo yum install mysql-community-{server,client,common,libs}-* mysql-5.*
grep "password" /var/log/mysqld.log
2.Linux编译安装 mysql5.7
1.创建mysql账户:
# useradd -r mysql -M -s /sbin/nologin
----------------------------------------------------------------------------------------------------
2.从官网下载.gz的源码安装包
mysql-5.7.20.tar.gz
boost_1_59_0.tar.gz
解压mysql压缩包,在解压boost安装包,把boost压缩包解压到mysql目录里面去。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.编译安装
编译安装有一定的系统安装条件,也就时对其他包的依赖。
这时候我们就要安装一些依赖包。下面呢,我们来讲一下,这些依赖包的作用以及需要使用的版本。
1> cmake
2> make3.75
3> gcc4.4.6
4> Boost1.59.0
5> bison2.1
6> ncurses
7>ncurses
# yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake
------------------------------------------------------------------------------------------------------------
4.配置:可以写入一个脚本执行
首先需要cd到解压的mysql目录(#cd mysql-5.7.22 ),执行下面的命令
#cmake . -DWITH_BOOST=boost_1_59_0/ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_DATADIR=/usr/local/mysql/data -DINSTALL_MANDIR=/usr/share/man -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
[[email protected] ~]# cmake . \
-DWITH_BOOST=boost_1_59_0/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ MySQL的安装目录
-DSYSCONFDIR=/etc \ 存放 配置文件的位置 (默认可以不安装配置文件)
-DMYSQL_DATADIR=/usr/local/mysql/data \ 数据目录的存放位置,同时错误日志文件也会在这个目录
-DINSTALL_MANDIR=/usr/share/man \ 帮助文档
-DMYSQL_TCP_PORT=3306 \ 默认端口
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ sock文件位置,用来做网络通信的,客户端连接服务器的时候会用到
-DDEFAULT_CHARSET=utf8 \ 默认字符集。字符集的支持,可以调
-DEXTRA_CHARSETS=all \ 扩展的字符集支持所有的
-DDEFAULT_COLLATION=utf8_general_ci \ 支持的utf8字符集
-DWITH_READLINE=1 \ 上下翻历史命令
-DWITH_SSL=system \ 使用私钥和证书登陆(公钥) 可以加密。 适用与长连接。坏处:速度慢
-DWITH_EMBEDDED_SERVER=1 \ 嵌入式数据库
-DENABLED_LOCAL_INFILE=1 \ 从本地倒入数据,不是备份和恢复。
-DWITH_INNOBASE_STORAGE_ENGINE=1 默认的存储引擎,支持外键
这些配置参数我偶有在下边做解释,大家一会看一下。
红字标识部分为有外网情况下使用
提示:boost也可以使用如下指令自动下载,如果不下载bost压缩包,把下面的这一条添加到配置中第二行
-DDOWNLOAD_BOOST=1/
提示一下内容标识配置成功:
-- Configuring done 配置完成
-- Generating done 生成完成
#make -g 数字(增加内核CPU)
# make -j 2 &&make install
-----------------------------------------------------------------------------------------------------------
5.初始化
需要先进入mysql的安装目录。
命令如下:
#cd /usr/local/mysql
# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
Ysnaf2O)>rRL
配置MySQL配置文件my.cnf
第一种:系统默认的配置文件
在5.6中常常使用源码包提供的默认配置文件,而在生产环境中一般是进行自定义配置文件(在5.7中会遇到support-files下没有my-default.cnf文件的情况,这种情况直接选择自定义配置 )
# cp support-files/my-default.cnf /etc/my.cnf
第二种:自定义配置(生产环境常用)
[root@mysql1 mysql]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql 安装目录
datadir=/usr/local/mysql/data 数据存放目录
------------------------------------------------------------------------------------------------------------
6.启动mysql
# cp support-files/mysql.server /etc/init.d/mysqld //生成mysql.server脚本(system V)
# chmod 755 /etc/init.d/mysqld(默认是755,安全起见敲一下)
# chkconfig --add mysqld // 给MySQL设置启动项
# chkconfig mysqld on //给MySQL设置开机启动
# service mysqld start // 执行启动命令
# /etc/init.d/mysqld start
# netstat -tanp | grep 3306
--------------------------------------------------------------------------------------------------------
7.修改密码:
方法一:
#/usr/local/mysql/bin/mysqladmin -u root -p'旧密码' password '新密码'
或者
利用初始密码进入MySQL
#./bin/mysql -uroot -p'Psxf*=g/y28i'
mysql> SET PASSWORD=PASSWORD('123');
方法二:
>set password=password('123')
----------------------------------------------------------------------------------------------------------
8.添加环境变量:
# vi ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
# source ~/.bash_profile
之后就可以在任何地方使用mysql命令登陆Mysql服务器:
#mysql -u root -p新密码
-------------------------------------------------------------------------------------------------------------
9.登陆mysql
# /usr/local/mysql/bin/mysql -u root -p‘123’
然后:shows databases // 查看数据库
退出:exit
----------------------------------------------------------------------------------------------------------
10.关闭MySQL服务
#service mysqld stop
强制关闭退出mysql服务:(非常时期,非常手段)
pkill -9 进程名
----------------------------------------------------------------------------------------------------------
重新安装MySQL的步骤:(之前安装过MySQL)
1.删除安装目录:rm -rf /usr/local/mysql
2.删除解压包目录:rm -rf ..../mysql.5.7.22----或者只删除CMakeCache.txt
3.删除mysql用户
4.删除mysql配置文件 /etc/my.cnf
三.SQL语句概述
SQL
1.什么是SQL:结构化查询语音(Structured Query Language)。
2.SQL的作用:客户端使用SQL来操作服务器
3.SQL标准(例如SQL99,即1999年制定的标准):
>由国际标准化组织(ISO)制定,对DBMS的统一操作方式(例如相同的语句可以操作:mysql、oracle等)
4.SQL方言
>某种DBMS不只会支持SQL标准,而且会有一些自己独有的语法,这就称之为方言,例如limit语句只在MySQL中可以使用
SQL语法
1.SQL语句可以在单行或多行书写,以分号结尾
2.可使用空格和缩进增强语句的可读性
3.MySQL不区别大小写,建议使用大写
SQL语句分类
1.DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
>创建、删除、修改:库、表结构
2.DML(Data Manipulation Language):数据库操作语言,用来定义数据库记录(数据);
>增、删、改:表记录
3.DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
4.DQL*****(Data Query Language):数据查询语音,用来查询记录(数据)
DDL:数据库或表的结构操作
DML:对表的记录进行更新(增、删、改)
DQL:对表的记录的查询
DCL:对用户的创建,以及授权
四.DDL(数据定义语言)之操作数据库
1.数据库
• 查看所有数据库:SHOW DATABASWS;
• 切换(选择要操作的)数据库:USE 数据库名
• 创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=uft8]
• 删除数据库:DROP DATABASE [IF EXISTS] mydb1
• 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET uft8(一个汉字3个字节)
2.数据类型(列类型)
int:整形
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,及最大值为999.99;
decimal:浮点型,在表单钱方面使用,因为不会出现精度缺失问题(十进制运算):
char:固定长度字符串类型:char(255),数据长度不足指定长度,补足到指定长度
varchar:可变长度字符串类型:varchar(65535),zhangSan
text(clob):字符串类型;
>很小 tinytext 2^8-1
>小 text 2^16-1
>中 mediumtext 2^24-1
>大 longtext 232-1
blob:字节类型:
>很小 tinyblob 2^8-1(256B)
>小 blob 2^16-1(64k)
>中 mediumblob 2^24-1 (16M)
>大 longblob 2^32-1 (4G)
data:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型;
3.表
• 创建表;
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
····
列名 列类型
);
•查看当前数据库中所有表名称:SHOW TABLES;
• 查看指定表的创建语句:SHOW CRERTE TABLE 表名(了解);
•查看表结构:DESC 表名;
• 删除表:DROP TABLE 表名;
• 修改表:前缀:ALTER TABLE 表名
>修改之添加列:
ALTER TABLE 表名 ADD (
列名 列类型,
列名 列类型,
····
);
>修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在的数据): ALTER TABLE 表名 MODIFY 列名 列类型;
>修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
>修改之删除列:ALTER TABLE 表名 DROP 列名;
>修改表名称:ALTER TABLE 原表名 RENAME TO 新表名;
五.DML(数据操作语言)之INSERT
DQL:SELECT * FROM 表名
DML(数据操作语言,它是对表记录的操作(增、删、改)
1.插入数据
• INSERT INTO 表名 (列名1,列名2,·····) VALUES(列值1,列值2····);
>在表名后给出要插入的列名,其他没有指定的列等同于插入null值,所以 插入记录总是插入一行,不可能是半行。
//插入所有列
//插入部分列,没有插入的列,为默认值null
>在VALUES后给出的列值,值的顺序和个数必须与前面指定的列对应
• INSERT INTO 表名 VALUES(列值1,列值2····);
>没有给出要插入的列,那么表示插入所有列。
>值的个数必须是该列的个数。
>值的顺序,必须与表创建时给出的列的顺序相同。
六.DML(数据操作语言)之修改记录
2.修改数据
• UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ····· [WHERE 条件]
• 条件(条件可选的):
>条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
>运算符:=、!=、<>、>、<、>=、<=、BETWEEN....AND、IN(...)、IS NULL、NOT、OR、AND
修改全部
修改区间内(between·····and·····)
修改满足两个条件 in('a','b')
set 后的=为赋值,如age=null,where中为age is null
七.DML(数据操作语言)之DELETE
3.删除数据
• DELETE FROM 表名 [WHERE 条件];
• TRUNCATE TABLE 表名:TRUNCATE是DDL语句,它是先删除DROP该表,再CREATE该表,且无法回滚。
在数据库中所有的字符串类型,必须使用单引号,不能使用双引号
日期类型也要使用单引号
八.DCL(数据控制语言)
1.创建用户
• CREATE USER 用户名@'IP地址' IDENTIFIED BY ‘密码’;
>用户只能在指定的ip上登录
• CREATE USER 用户名@'%' IDENTIFIED BY ‘密码’;
>用户可以在任意IP地址上登录
2.给用户授权
• GRANT 权限1,权限2,····,权限n ON 数据库.* TO 用户名@'IP地址'
>权限、用户、数据库
>给用户分派在指定的数据库上的指定权限
>例如:GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
• 给本地登录用户user1用户分派在mydb1数据库上的create,alter,drop,insert,update,delete,select权限
• GRANT ALL ON 数据库.* TO 用户名@IP地址;
>给用户分派指定数据库上的所有权限
3.撤销授权
• REVOKE 权限1,····,权限n ON 数据库.* FROM 用户名@IP地址;
>撤销指定用户在指定数据库上的指定权限3
>例如:REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
• 撤销user1用户在mydb1数据库上的create、alter、drop权限
4.查看权限
• SHOW GRANTS FOR 用户名@IP地址;
>查看指定用户的权限
5.删除用户
• DROP USER 用户名@IP地址
九.DQL(数据查询语音)之基础查询之列控制
一、基本查询
1.字段(列)控制
1)查询所有列
SELECT * FROM 表名;
SELECT * FROM emp;
>其中“*”表示查询所有列
2)查询指定列
SELECT 列1(,列2,····列N) FROM 表名
SELECT username,password FROM jo_user;
3)去除重复行查询
当查询结果中的多行记录一模一样,只显示一行,
SELECT DISTINCT * | 列1(,列2,····,列n) FROM 表名;
select distinct * from jo_user;
4)列运算
• 数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+com FROM emp;
• 字符串类型可以做连续运算
SELECT CONCAT('$',sal)
• 转换NULL值
有时需要把NULL转换为其他值,例如com+1000时,如果com存在NULL值,那么NULL+1000还是NULL,而我们这时希望吧NULL当前当做0来运算。
SELECT IFNULL(comm,0)+1000 FROM emp;
>IFNULL(comm,0),如果comm中存在NULL值,那么当成0来运算
• 给列起别名
当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列起个别名,这样在结果集中就显示别名了
SELECT IFNULL(comm,0)+1000 AS 奖金 FROM emp;
>其中AS可以省略
十.DQL(数据查询语言)之条件查询
2.条件控制
1)条件查询
• SELECT * from emp WHERE sal>20000;
SELECT * from emp WHERE comm is not null;
SELECT * from emp WHERE sal between 20000 and 30000;
SELECT * from emp WHERE job in('经理','分析师');
十一.DQL(数据库查询语言)之模糊查询
2)模糊查询
SELECT * FROM emp WHERE ename like '张';
>like只匹配一个字符
SELECT * from emp WHERE ename like '张_';
>'_'代表一个字符
SELECT * from emp WHERE ename like '张%';
>其中%匹配0~N个任意字符
SELECT * from emp WHERE ename like '%张%';
>查询姓名中以张开头或是姓名中有张
SELECT * from emp WHERE ename like ‘%';
>这个条件等同于不存在,但如果姓名为NULL的查询不出来
十二.DQL(数据查询语言)之排序
二、排序
1)升序
SELECT * FROM emp ORDER BY sal ASC;
>按sal排序,升序
>其中ASC是可以省略
2)降序
SELECT * FROM emp ORDER BY sal DESC;
>按comm排序,降序
>其中DESC不能省略
3)使用多列作为排序条件
SELECT * FROM WHERE emp ORDER BY sal ASC,comm DESC
十三.DQL(数据查询语言)之聚合函数
三、聚合函数
聚合函数用来做某列的纵向运算
1)COUNT
SELECT COUNT(*) FROM emp;
>计算emp表中所有列都不为NULL的记录的行数
SELECT COUNT(comm) FROM emp;
>计算emp表中comm列不为NULL的记录的行数
2)MAX
SELECT MAX(sal) FROM emp;
>查询最高工资
3)MIN
SELECT MIN(sal) FROM emp;
>查询最低工资
4)SUM
SELECT SUM(sal) FROM emp;
>查询工资总和
5)AVG
SELECT AVG(sal) FROM emp;
>查询平均工资
十四.DQL(数据库查询语言)之分组查询
四,分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息。
例如:查看所有部门的记录数,分组列和聚合函数
select job 职业, count(*) 人数,max(sal) 最高工资 from emp group by job;
select deptno,count(*) from emp where sal>15000 group by deptno;
select deptno,count(*) from emp where sal>15000 group by deptno having count(*)>=2;
执行顺序
select
from
where
group by
having
order by
十五.DQL(数据库查询语言)之limit方言
五、limit子句(方言)
LIMIT用来限定查询结果的起始行,以及总行数。
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4,5;
>其中4代表从第五行开始,其中5表示一共查询5行。(当前页-1)*每页记录数