MySQL基础

114 阅读7分钟

数据库概述

什么是数据库?

数据库是[存储数据的仓库],本质是一个[文件系统],数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除以及查询操作。

什么是关系型数据库?

数据库中的[记录是有行有列的数据库]就是关系型数据库,与之相反的就是NoSQL数据库了。

数据库和表

image.png 数据库管理系统(DataBase Management System DBMS):指一种[操作和管理数据库]的大型软件,用于建立,使用和维护数据库,对数据库进行同意管理和控制,以保证数据库的安全性和完整性,用户通过数据库管理系统访问数据库中表内的数据(记录)。

常见的数据库管理系统

image.png

MySQL介绍

MySQL是最流行的【关系型数据库管理系统】,在WEB应用方面MySQL是最好的RDMBS应用软件之一。

MySQL发展历程

image.png

image.png

SQL介绍

image.png

image.png

SQL语言分类

image.png

DDL语句

数据库操作:database

1.创建数据库

create database 数据库名;
create database 数据库名 character set 字符集;

2.查看数据库

查看所有数据库

show databases;

查看某个数据库定义的信息

show create database 数据库名;

3.删除数据库(慎用)

drop database 数据库名称;

4.其他据库操作命令

切换数据库

use 数据库名;

查看正在使用的数据库

select database();

表操作:table

常见的字段类型:

image.png

image.png

image.png

1.创建表

image.png

单表约束

  • 主键约束
  • 唯一约束
  • 非空约束

注意:主键约束 = 唯一约束 + 非空约束

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>    

image.png

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(外连接,又分为左连接和右连接)

建表语句

image.png

image.png

交叉连接

关键字:CROSS JION

交叉连接也叫做笛卡尔积连接,笛卡尔积是指在数学中,两个集合x和y的笛卡尔积,又称为直积,表示为x * y,第一个对象是x的成员,而第二个对象是y的所有成员。

交叉连接的表现:行数相乘,列数相加

  • 隐式交叉连接:
select * from A,B;
  • 显示交叉连接
select * from A cross join B;

案例:查询商品表和分类表的笛卡尔积

image.png

内连接

关键字: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

image.png

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