一、数据库相关介绍
1.什么是SQL:结构化的查询语句
2.什么是数据库 ?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。
数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
主流的数据库有:sqlserver,mysql,Oracle、SQLite、Access、MS SQL Server等
3.使用数据库的必要性
使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据。
数据库具有以下特点:
数据库技术是计算机科学的核心技术之一,具有完备的理论基础。
关系型数据库和非关系型数据库的区别
关系数据库: 关系数据库结构是二维数据库表,二维表当中每个字段(列)用来描述对象的一个属性, 每个记录(行)用来描述一个对象的信息(完整信息),关系数据库写到哪里也就是存储在硬盘当中 读写系统就会受到的IO限制或者瓶颈
其他关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、都是使用表结构,格式一致;
2、SQL语言通用,可用于复杂查询;
3、支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度不高;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、 图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性与高可用性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
二、MySQL编译安装
1.安装依赖环境
yum -y install \
ncurses \
ncurses-devel \
bison \
cmake
2.创建运行用户
useradd -s /sbin/nologin mysql
3.编译安装
cd /opt
将mysql软件包拖入该目录下进行解压
tar -zxf 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_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 && make install -j4
4.数据库目录进行权限调整
chown -R mysql:mysql /usr/local/mysql
5.调整配置文件
vi /etc/my.cnf
将文件内容删除重新写入以下内容:
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
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 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
6.设置环境变量
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
7.初始化数据库
cd /usr/local/mysql
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system
8.数据库开启自启、 关闭、状态
systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld
netstat -anpt | grep 3306
9.设置Mysql密码
ln -s /usr/local/mysql/bin/* /usr/local/bin
mysqladmin -u root -p password
10.登录数据库
mysql -u root -p
三、MySQL基础命令
1.登录
mysql -uroot -p密码;(本地登录)
mysql -h ip -p 端口(3306) -uroot -p密码; (远程登录)
2.创建
create database 数据库名 ; ( 创建数据库)
create table 表名(列名 数据类型 约束···,列名 数据类型 约束···);(创建表)
create table 表名(列名 数据类型 primary key auto_increment,列名 数据类型 约束···)(创建含主键的表)
create table 表名(列名 数据类型 primary key,列名 数据类型 constraint fk_外键名 foreign key (列名[,]) references 表名2(列名[,])···)(创建含外键的表)
数据类型:
数字(int,tinyint,smallint,float,double)
字符串(char(个数)varchar(个数))
时间(DATE,TIME,DATETIME)
枚举enum(值只能是枚举中的元素)
集合set(值只能是结合元素的组合)
create user '用户名' @'ip' identified by '密码'; (创建用户)
3.数据的插入,修改,删除
插入:
use 库名
insert into 表名(列名1,列名2···) values(值1,值2···),(值1,值2···),(值1,值2···); (插入值)
insert into 表1(列名) select 列名 from 表2; (插入另一个表中数据)
修改:
update 表名 set 列名1=value1,列名2=value2 where 条件1[and/or 条件2] ;
删除:
delete from 表名; 清除表(如果有自增id,id 不会重新开始)
delete from 表名 where 条件; 清除特定数据
truncate table 表名;清除表(如果有自增id,id 会重新开始)
delete与truncate主要区别在于delete删的慢,逐行删除;truncate删的快,相当于格式化表。
4.查看
select * from 表名;
select 列名···from 表名;
select 列名 from 表名 where 列名(id等) >/</!= value;
select 列名,常量 from 表名; 增加一个常量列
select 列名 from 表名 where 列名 in/not in/between and value;
select 列名 from 表名 where 条件1 and 条件2;
select 列名 from 表名 limit num; 显示num个
select 列名 from 表名 limit num1,num2;从num1后取num2行数据,num1是起始位置,num2是个数
select 列名 from 表名 limit num1 offset num2;从num2后取num1行数据,num2是起始位置,num1是个数
5.排序
select * from 表名 order by 列名 desc;从大到小排序
select * from 表名 order by 列名 asc;从小到大排序
select * from 表名 order by 列名1 desc 列名2 asc; 首先遵循列1从大到小排序,遇到相同数据时,按列2从小到大排序
6.修改表结构
alter table 表名 auto_increment=value;设置自增键起始值;
alter table 表名 drop 列名;删除列
alter table 表名 add 列名 数据类型 约束; 增加列
alter table 表名 change 旧列名 新列名 数据类型; 修改字段类型
alter table 表名 modify 列名 数据类型; 修改数据类型
alter table 旧表名 rename 新表名; 修改表名
alter table 表名 drop primary key; 删除表中主键
alter table 表名 add 列名 数据类型 primary key;添加主键
alter table 表名 add primary key(列名);设置主键
alter table 表名 add column 列名 数据类型 after 列名;在某一列后添加主键
Mysql概述
MySql是一种关系型数据库
连接到mysql数据库:mysql -u root -p
退出:exit
SQL分类:
DDL:数据定义语言
* create,alter,drop...
DML:数据操纵语言
* update,insert,delete
DCL:数据控制语言
* grant,if..
DQL:数据查询语言
* select
数据库增删查改
创建数据库:语法:create database 数据库 [character 字符集 collate 校对规则]
查看数据库:
查看所有数据库:show databases;
查看某个数据库:show create database 数据库名;
修改数据库:语法:alter database 数据库名 character 字符集 collate 校对规则
删除数据库:语法:drop database 数据库名;
切换数据库:use 数据库名;
查看当前使用数据库:select database();
数据库表操作
创建表语法:
create table 表名 (
字段名 类型(长度) 约束,
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
数据类型:
整数类型:tinyint、smallint、mediumint、int、bigint
浮点数类型:float、double
定点小数:decimal
日期/时间类型
year、time、date、datetime、timestamp
字符串类型
char、varchar、text、enum、set等
二进制类型
bit、binary、varbinary、blob
约束:
单表约束:
主键约束:primary key (默认就是唯一非空的)
唯一约束:unique
非空约束:not null
数据表的操作:
1.查看
查看数据库中有哪些表: show tables;
查看表结构:desc 表名;
2.删除
表的删除:drop table 表名;
3.修改
修改表添加列:alter table 表名 add 列名 类型(长度) 约束;
修改表删除列:alter table 表名 drop 列名;
修改表的列的类型长度及约束:alter table 表名 modify 列名 类型(长度) 约束;
修改表的列名:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
修改表名:rename table 旧表名 to 新表名;
修改表的字符集:alter table 表名character set 字符集;
4.插入记录
语法:
1.insert into 表名 (列名,列名,...) values (值1,值2,...); ---插入指定列的值
2.insert into 表名 values (值1,值2,...); ---插入所有列的值
注意事项:
5.修改记录
语法:update 表 set 列名=值,列名=值 [where 条件];
注意事项:
6.删除记录
语法:delete from 表 [where 条件];
注意事项:
1.删除表中的一行记录,不能删除某列值
2.如果没有条件删除表中的所有列.
7.删除所有记录:delete from employee;
8.删除表中的所有记录truncate table 表名 和 delete from 表 有什么区别?
区别:
查询语句:select [distinct] *|列名 from 表 [where 条件];
where语句后面可以加:
= , > , >= , <, <= , <>
排序查询:
order by 对数据进行排序.默认升序. (asc升序,desc降序)
聚合函数:
sum() 求和
count() 统计
max() 最大值
min() 最小值
avg() 平均数
分组
group by
交叉连接:
* select * from A,B; --- 获得的是两个表的笛卡尔积.
内连接: inner join -- inner 可以省略
* 显式内连接:select * from A inner join B on 条件;
* 隐式内连接:select * from A,B where 条件;
外连接:outer join -- outer 可以省略
* 左外连接:left outer join -- select * from A left outer join B on 条件;
* 右外连接:right outer join -- select * from A right outer join B on 条件;