前言
一、MySQL 服务基础
1.简介
- MySQL 是一个真正的多线程、多用户的 SQL 数据库服务,凭借其高性能、高可靠和易于使用的特点,成为服务器领域中最受欢迎的开源数据库系统
- 在 2008 年以前,MySQL 项目由 MySQL AB 公司进行开发、发布和支持,之后历经 Sun 公司收购 MySQL,Oracle 公司收购 Sun 公司的过程,目前 MySQL 项目由 Oracle 公司负责运营和维护
2.商业版与社区版
- MySQL 商业版是由 MySQL AB 公司负责开发与维护,需要付费才能使用
- MySQL 社区版是由分散在世界各地的 MySQL 开发者、爱好者一起开发与维护,可以免费使用
- 两者区别
商业版组织管理与测试环节更加严格,会比社区版更稳定 商业版不遵守 GPL,社区版遵从 GPL 可以免费使用 - 商业版可获得 7*24 小时的服务,社区版则没有
3.产品阵营
- 第一阵营:5.0-5.1 阵营,可说是早期产品的延续
- 第二阵营:5.4-5.7 阵营,整合了 MySQL AB 公司、社区和第三方公司开发的存储引擎,从而提高性能
- 第三阵营:6.0-7.1 阵营,就是 MySQL Cluster 版本,为适应新时代对数据库的集群需求而开发
4.编译安装
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
useradd -M -s /sbin/nologin mysql
cd /opt
mysql-boost-5.7.20.tar.gz
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
vim /etc/my.cnf
[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
chown -R mysql.mysql /usr/local/mysql/
chown mysql.mysql /etc/my.cnf
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
netstat -anpt | grep 3306
mysqladmin -u root -p password "123123"
mysql -u root -p
grant all privileges on *.* to 'root'@'%' identified by '123123';
show databases;
quit
另附一键编译脚本
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
. /etc/init.d/functions
SRC_DIR=`pwd`
MYSQL='mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz'
COLOR="echo -e \\033[01;31m"
END='\033[0m'
MYSQL_ROOT_PASSWORD=123456
check (){
cd $SRC_DIR
if [ ! -e $MYSQL ];then
$COLOR"缺少${MYSQL}文件"$END
$COLOR"请将相关软件放在${SRC_DIR}目录下"$END
exit
elif [ -e /usr/local/mysql ];then
action "数据库已存在,安装失败" false
exit
else
return
fi
}
install_mysql(){
$COLOR"开始安装MySQL数据库..."$END
yum -y -q install libaio numactl-libs libaio &> /dev/null
cd $SRC_DIR
tar xf $MYSQL -C /usr/local/
MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
chown -R root.root /usr/local/mysql/
id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
mysqld --initialize --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
[ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
action "数据库安装完成"
}
check
install_mysql
ln -s /usr/local/mysql/bin/mysql /usr/local/sbin
mysql -u用户 -p密码
二、使用MySQL
1.查看数据库信息
SHOW DATABASES
mysql> show databases;
+
| Database |
+
| information_schema |
| mysql |
| performance_schema |
| sys |
+
4 rows in set (0.00 sec)
2.查看数据库中的表信息
USE 数据库名
SHOW TABLES
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+
| Tables_in_mysql |
+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
......
3.显示数据表的结构(字段)
DESCRIBE [数据库名] 表名
mysql> describe user;
+
| Extra |+
| || User | char(32) | NO | PRI |
| || Select_priv | enum('N','Y') | NO | | N
| || Insert_priv | enum('N','Y') | NO | | N
Field:字段名称
type:数据类型
Null :是否允许为空
Key :主键
Type:数据类型
Null :是否允许为空key :主键
Default :默认值
Extra :扩展属性,例如:标志符列(标识了种子,增量/步长)1 2
id:1 3 5 7
4.常用的数据类型
int:整型 用于定义整数类型的数据
float:单精度浮点4字节32位 准确表示到小数点后六位
double:双精度浮点8字节64位
char:固定长度的字符类型 用于定义字符类型数据。
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面有2位 指定长度数组
三、SQL语句概述
1.SQL语言
- Structured Query Language的缩写,即结构化查询语言
- 关系型数据库的标准语言
- 用于维护管理数据库
包括数据查询、数据更新、访问控制、对象管理等功能
2.SQL分类
- DDL:数据定义语言,用于创建数据库对象,如库、表、索引等
- DML:数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据
- DQL:数据查询语言,用于从数据表中查找符合条件的数据记录
- DCL:数据控制语言,用于设置或者更改数据库用户或角色权限(数据控制语句,用于控制不通数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,如COMMIT、ROLLBACK、GRANT、REVOKE)
四、创建及删除库和表
1.使用DDL语句新建库、表
CREATE DATABASE 数据库名
CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)
USE test;
Database changed
mysql> CREATE TABLE test1 (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT'', PRIMARY KEY (id));
Query OK, 0 rows affected (0.04 sec)
mysql> desc test1;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| passwd | char(48) | YES | | | |
+
4 rows in set (0.00 sec)
2.使用DDL语句删除库、表
DROP TABLE 表名
mysql> drop table test1;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables
DROP TABLE [数据库名.] 表名;
mysql> drop tables test.test1;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables
DROP DATABASE 数据库名;
mysql> drop database test;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
五、管理表中的数据记录
1.向数据表中插入新的数据记录
INSERT INTO 表名(字段1,字段2[,...]) VALUES (字段1的值,字段2的值,...);
mysql> create database zone;
mysql> use zone
create table dsj (id int not null,name char(10) not null,sex char(1),primary key (id));
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO dsj (id,name,score,passwd) values(1,'zhangsan',70.5,PASSWORD('123456'));
Query OK, 1 row affected, 1 warning (0.00 sec
2.查询数据记录
SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];
例:
mysql> select * from dsj;
+
| id | name | score | passwd |
+
| 1 | zhangsan | 70.50 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+
1 row in set (0.00 sec)
mysql> select name from dsj where id=1;
+
| name |
+
| zhangsan |
+
1 row in set (0.01 sec)
select * from dsj limit 2;
select * from dsj limit 2,3;
3.修改、更新数据表中的数据记录
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
例:
insert into dsj (id,name) values(2,'lisi');
insert into dsj (id,name) values(3,'zhangsan');
select * from dsj;
UPDATE dsj SET passwd=PASSWORD('') WHERE name='zhangsan';
UPDATE dsj SET name='lisi',passwd='123' WHERE id=2;
mysql> select *from dsj;
+
| id | name | score | passwd |
+
| 1 | zhangsan | 70.50 | |
| 2 | lisi | NULL | 123 |
+
2 rows in set (0.00 sec)
4.在数据表中删除指定的数据记录
DELETE FROM 表名 [WHERE 条件表达式];
例:
mysql> delete from dsj where id=1;
mysql> select * from dsj;
+
| id | name | score | passwd |
+
| 2 | lisi | NULL | 123 |
+
1 row in set (0.00 sec)
5.修改表名和表结构
- 修改表名
ALTER TABLE 旧表名 RENAME 新表名;
例:
alter table dsj rename dlh;
show tables;
select * from dlh;
- 扩展表结构(增加字段)
ALTER TABLE 表名 ADD address varchar(50) default '地址不详';
例:
alter table dlh add address varchar(50) default '地址不详';
- 修改字段(列)名,添加唯一键
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];
例:
alter table dlh change name student_name varchar(20) unique key;
select * from dlh;
- 删除字段
ALTER TABLE 表名 DROP 字段名;
例:
alter table dlh drop address;
6.案例拓展
例:
use zone;
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));
|