数据库概述
什么是数据库?
数据库是[存储数据的仓库],本质是一个[文件系统],数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除以及查询操作。
什么是关系型数据库?
数据库中的[记录是有行有列的数据库]就是关系型数据库,与之相反的就是NoSQL数据库了。
数据库和表
数据库管理系统(DataBase Management System DBMS):指一种[操作和管理数据库]的大型软件,用于建立,使用和维护数据库,对数据库进行同意管理和控制,以保证数据库的安全性和完整性,用户通过数据库管理系统访问数据库中表内的数据(记录)。
常见的数据库管理系统
MySQL介绍
MySQL是最流行的【关系型数据库管理系统】,在WEB应用方面MySQL是最好的RDMBS应用软件之一。
MySQL发展历程
SQL介绍
SQL语言分类
DDL语句
数据库操作:database
1.创建数据库
create database 数据库名;
create database 数据库名 character set 字符集;
2.查看数据库
查看所有数据库
show databases;
查看某个数据库定义的信息
show create database 数据库名;
3.删除数据库(慎用)
drop database 数据库名称;
4.其他据库操作命令
切换数据库
use 数据库名;
查看正在使用的数据库
select database();
表操作:table
常见的字段类型:
1.创建表
单表约束
- 主键约束
- 唯一约束
- 非空约束
注意:主键约束 = 唯一约束 + 非空约束
2.查看表
查看数据库所有表
show tables;
查看表结构
desc 表名
3.删除表
drop table 表明;
4.修改表
alter table 表名 add 列名 类型(长度) 约束; ---添加列
alter table 表名 modify 列名 类型(长度) 约束; ---修改列类型长度及约束
alter table 表名 change 旧列名 新列名 类型(长度) 约束; ---修改列名
alter table 表名 drop 列名;---删除列
rename table 表名 to 新表名;---修改表名
alter table 表名 character set 字符集;---修改表的字符集
DML语句
插入记录:insert
insert into 表 (列名1,列名2...) values (值1,值2...);
- 列名树与values后面的值的个数相等
- 列的顺序与插入的值的顺序一致
- 列名的类型与插入的值要一致
- 插入的时候不能超过最大长度
- 值如果是字符串或者日期需要加引号''(一般是单引号)
例如:
insert into sort(sid,name) values('s001','电器');
更新记录:update
update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 条件;
- 列名的类型与修改的值要一致
- 修改值的时候不能超过最大长度
- 值如果是字符串或者日期需要加'';
删除记录:delete
delete from 表名 [where 条件]
面试题
删除表中的记录使用delete from 表名,还是使用truncate table 表名?
- delete:一条一条删除,不清空auto_increment记录数
- truncate:直接将表删除,重新建表,auto_increment将重置为零,从新开始
DQL语句
完整DQL语法顺序:
SELECT DISTINCT
<select_list>
FROM
<left_table> <join_type>
JOIN <right_table> ON <join_condition>
WHERE
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_condition>
ORDER BY
<order_by_condition>
LIMIT <limit_number>
但是它的执行顺序却是这样的
FROM <left_table>
ON <join_condition
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT ----分组之后才会执行SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
FROM (将最近的两张表,进行笛卡尔积) --VT1
ON (将VT1按照它的条件进行过滤)--VT2
<join_type> JOIN <right_table> --VT3
WHERE (过滤VT3中的记录) --VT4
GROUP BY (对VT4中的记录进行分组) --VT5
HAVING (对VT5中的记录进行过滤) --VT6
SELECT (对VT6中的记录进行过滤) --VT7
ORDER BY (对VT7中的记录进行排序) --VT8
LIMIT <limit_number> --MYSQL特有语法
总结:
-
SQL的执行顺序每个步骤都会形成一个虚拟表即VT,作为下一个步骤的输入
-
因为在mysql中where中的查询条件是从左往右执行的(Oracle是从右往左的),尽量让过滤条件大的放在左边,否则会影响性能,比如,如果你第一个where条件在100万条记录中之过滤掉100条,那么还剩99万多条记录交给第一个where条件过滤,可想而知这样的性能很慢,其实查询优化器也一般情况下也会帮我们进行检测,把过滤条件大的放在左边,当然查询优化器一般也会帮我们把过滤条件大的调整到左边
多表关联查询
如何使用MySQL的join在两个或者多个表中查询数据呢?
join按照功能大致分为如下三类:
- CROSS JOIN(交叉连接,即笛卡尔积)
- INNER JOIN(内连接)
- OUTER JOIN(外连接,又分为左连接和右连接)
建表语句
交叉连接
关键字:CROSS JION
交叉连接也叫做笛卡尔积连接,笛卡尔积是指在数学中,两个集合x和y的笛卡尔积,又称为直积,表示为x * y,第一个对象是x的成员,而第二个对象是y的所有成员。
交叉连接的表现:行数相乘,列数相加
- 隐式交叉连接:
select * from A,B;
- 显示交叉连接
select * from A cross join B;
案例:查询商品表和分类表的笛卡尔积
内连接
关键字:INNER JOIN
内连接也叫做等值连接,内连接使用比较运算符根据每个表共有列的值匹配两个表中的行。
- 隐式内连接
select * from A,B where A.id = B.id;
- 显式内连接
select * from A,B where A innner join B on A.id = B.id;
外连接
外连接可以是左外连接,右外连接和全外连接(MySQL不支持全外连接)。
select * from A left join B on A.id=B.id;
select * from A right join B on A.id=B.id;
- 使用left join,则主表在它左边
- 使用right join,则主表在它右边
- 查询结果以主表为主,从表记录匹配不到的,则需要补null
MySQL安装
- 操作系统:CentOS7
- MySQL 5.6
MySQL卸载
1.查看MySQL软件
rpm -qa | grep mysql
2.卸载MySQL
yum remove -y mysql mysql-libs mysql-common
rm -rf /var/lib/mysql
rm /etc/my.cnf
查看是否还有MySQL软件,有的话继续删除,软件卸载完毕之后如果需要可以删除MySQL的数据库:/var/lib/mysql
安装MySQL
wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.npm
rpm -ivh mysql-community-release-el6-5.noarch.npm
yum install -y mysql-community-server
配置MySQL
编辑mysql的配置文件:
vim /etc/my.cnf
修改的内容如下:
[mysqld]
# MySQL设置大小不敏感:默认:区分表名的大小写,不区分列名的大小写
# 0:大小写敏感,1:大小写不敏感
lower case table names=1
# 默认字符集
default-character-set=utf8
启动MySQL
1.启动MySQL服务mysqld
systemctl start mysqld
2.设置root用户密码
默认一开始执行mysql命令直接可以进入mysql控制台执行SQL,但是这样肯定是没有安全性的,我们可以为root账户设置密码为111111
/usr/bin/mysqladmin -u root password '111111'
3.登录MySQL
mysql -uroot -p111111
- -u:指定数据库的用户名
- -p:指定数据库密码,记住-p和登陆密码之间没有空格
MySQL远程连接授权
默认情况下,只允许安装MySQL这台主机连接MySQL,比如我们现在想要远程的一台主机通过navicat连接这台主机上的MySQL怎么办?这就需要远程授权。
比如:授予root用户对所有的数据库对象的全部操作权限
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
- ALL PRIVILEGES:表示授予所有的权限,此处可以指定具体的授权权限
- .:表示所有库中的所有表
- 'root'@'%':root是数据库的用户名,%表示任意的ip地址,可以指定具体的ip地址
- IDENTIFIED BY 'root':root是数据库的密码
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld.service(设置开启不启动防火墙)
MySQL的常用目录
- mysql 数据库文件的存放路径:
/var/lib/mysql/ - mysql配置文件路径:
/etc/my.cnf - mysql服务启停相关:
/etc/init.d/mysql - 相关命令目录:
/usr/bin