1、数据库的介绍
1、Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL
2、DB2:IBM公司的数据库产品,收费的。常在银行系统中用
3、SQLServer:MicroSoft公司收费的中型的数据库。C#、.net等语言常使用
4、SyBase:已经淡出历史舞台。提供一个非常专业数据建模攻击PowerDesigner。
5、SQLite:嵌入式的小型数据库,应用在手机端
常用的数据库:MYSQL、Oracle
2、M1上安装MySQL
1、到官网上正常安装完毕就可以了
2、配置环境变量
export PATH=$PATH:/usr/local/mysql/bin
export PATH=$PATH:/usr/local/mysql/support-files
启动mysql
sudo mysql.server start
3、mysql登录
mysql -u root -p
或者 mysql -hip -u root -p
或者 mysql --host=ip --user=root --password=***
退出
quit
或者 exit
4、mysql的目录结构
1)、MySQL的安装目录:配置文件my.ini
2)、MySQL数据模块
2、SQL
1、什么是SQL
?
Structured Query Language
:结构化查询语言。
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
- 每一条语句是分号(
;
)结束 - 不区分大小写,建议关键字使用大写,其他使用小写,单词之间用下划线连接,比如
my_firstname
- 单行注释:
-- 注释内容
(-- 后面至少有一个空格)、# 注释内容
- 多行注释:
/*注释内容*/
2、SQL
语句可以分为4大类
DDL
(Data Definition Language
)
数据定义语言
创建(CREATE
)、修改(ALTER
)、删除(DROP
)数据库\表
DML
(Data Manipulation Language
)
数据操纵语言
增加(INSERT
)、删除(DELETE
)、修改(UPDATE
)记录
DQL
(Data Query Language
)
数据查询语言
查询记录(SELECT
)
DCL
(Data Control Language
)
数据控制语言
控制访问权限(GRANT
、REVOKE
)
2.1、DDL
语句 - 数据库
1、创建
CREATE DATABASE 数据库名 # 创建数据库(使用默认的字符编码)
CREATE DATABASE 数据库名 CHARACTER SET 字符编码 # 创建数据库(使用指定的字符编码)
CREATE DATABASE IF NOT EXISTS 数据库名 # 如果这个数据库不存在,才创建它
CREATE DATABASE IF NOT EXISTS 数据库名 CHARACTER SET 字符编码
2、查询
SHOW DATABASES # 查询所有的数据库
SHOW CREATE DATABASE 数据库名 # 查询数据库的创建语句
USE 数据库名 # 使用数据库
SELECT DATABSE() # 查询正在使用的数据库
3、修改
ALTER DATABASE 数据库名 CHARACTER SET 字符编码 # 修改数据库的字符编码
4、删除
DROP DATABASE 数据库名
DROP DATABASE IF EXISTS 数据库名 # 如果这个数据库存在,才删除它
2.2、DDL
语句 - 表
1、创建(基本语法)
CREATE TABLE 表名(
列表1 数据类型1,
列表2 数据类型2,
...
列表n 数据类型n,
)
2、查询
SHOW TABLES # 查询当前数据库的所有表
DESC 表名 # 查看表结构
3、删除
DROP TABLE 表名
DROP TABLE IF EXISTS 表名 # 如果这个表存在,才删除它
4、修改
ALTER TABLE 表名 RENAME TO 新表名 # 修改表名
ALTER TABLE 表名 CHARACTER SET 字符编码 # 修改表格的字符编码
ALTER TABLE 表名 ADD 列名 数据类型 # 增加新的一列
ALTER TABLE 表名 MODIFY 列名 新数据类型 # 修改某一列的数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型 # 修改某一列的列名、数据类型
ALTER TABLE 表名 DROP 列名 # 删除某一列
2.3、常用数据类型-数字类型

上述使用是数据格式为:
TYPE[ (M) ] [UNSIGNED] [ZEORFILL]
UNSIGNED
:无符号。ZEROFILL
:等价于 UNSIGNED ZEROFILL
,表示在显示数值时,若数字不足M
位,就在前面用0
填充。
2.4、常用数据类型-字符串类型

2.5、常用数据类型-日期和时间类型

- 从
MySQL 5.6.4
开始,允许TIME\DATETIME\TIMESTAMP
有小数部分,需要0
~3
字节的存储 -
DATETIME
支持范围:1000-01-01 00:00:00.000000
到9999-12-31 23:59:59.999999
-
TIMESTAMP
支持范围:1970-01-01 00:00:01.000000
到2038-01-19 03:14.07.999999
DATETIME\TIMESTAMP
的自动设置
DEFAULT CURRENT_TIMESTAMP
:当插入记录时没有指定时间值,就设置时间为当前的系统时间
CREATE TABLE student (
`name`VARCHAR(10),
age INT,
birthday DATETIME ON UPDATE CURRENT_TIMESTAMP #DEFAULT CURRENT_TIMESTAMP
);
NO UPDATE CURRENT_TIMESTAMP
:修改记录时没有指定时间值,就设置时间为当前的系统时间
2.6、DML
语句
1、增加
INSERT INTO 表名(列名1,列名2...列名n) VALUES (值1,值2...值n)
非数字类型的值一般要有用引号括住(单引号或双引号,建议使用单引号)
INSERT INTO
表名 VALUES
(值1,值2...值n)#从左到右顺序给列添加值
2、修改
UPDATE
表名 SET
列名1 = 值1,列名2=值2...列名n=值n [WHERE
条件]
如果没有添加条件,将会修改表中的所有记录
3、删除
DELETE FROM
表名 [WHERE
条件]
如果没有添加条件,将会删除表中的所有记录
2.7、 TRUNCATE
1、如果要删除表中的所有数据(保留表结构),有两种常见的做法
DELETE FROM
表名 # 逐行删除每一条记录
TRUNCATE
[TABLE
] 表名 # 先删除后重新创建表(效率高)
-
TRUNCATE
归类为DDL
语句 而不是DML
语句 - 为了实现高性能,它绕过了删除数据的
DML
方法。因此,它不能被回滚,不会导致ON DELETE
触发器触发,并且不能对InnoDB
具有父子外键关系的表执行
2.8、 DQL
语句 - SELECT
语句
SELECT [DISTINCT]
列名1,列名2...列名n
FROM
表名
[WHERE
...]
[GROUP BY
...]
[HAVING
...]
[ORDER BY
...]
[LIMIT
...]
SELECT
* FROM
customer # 查询表中的所有记录
SELECT DISTINCT
* FROM
customer # 查询表中的所有记录 (出去重复记录)
2.9、 聚合函数
SELECT COUNT(
*) FROM
customer #查询表中的记录总数
SELECT COUNT(
phone ) FROM
customer # 查询表中 phone 的总数(不包括NULL)
SELECT COUNT( DISTINCT
phone ) FROM
customer # 查询表中 phone 的总数(不包括NULL)# 查询表中 phone 的总数(不包括NULL,去除了重复记录)
SELECT SUM(
salary ) FROM
customer # 计算salary的总和
SELECT MIN(
age) FROM
customer # 查询最小的age
SELECT MAX(
age) FROM
customer # 查询最大的age
SELECT AVG(
salary) FROM
customer # 计算salary的平均值
2.10、 常见的WHERE
子句
1、比较运行
WHERE
age >
18 # age大于18岁
WHERE
age <=
18 # age小于等于18岁
WHERE
age =
18 # age等于18岁
WHERE
name =
'张三' # name等于张三
WHERE
age !=
18 # age不等于18岁
WHERE
age <>
18 # age不等于18岁
2、NULL
值判断 (不能用 =
、!=
、<>
)
WHERE
phone IS NULL
# phone 的值为NULL
WHERE
phone IS NOT NULL
# phone 的值不为NULL
3、逻辑运算
WHERE
age >
18 AND
age <=
30 # age大于18岁并且小于等于30
WHERE
age >
18 &&
age <=
30 # age大于18岁并且小于等于30
WHERE
age BETWEEN
20 AND
30 # age大于等于20并且小于等于30
WHERE
age =
18 OR
age =
20 OR
age =
22 # age等于18或者等于20或者等于22
WHERE
age IN
(18, 20, 22) # age等于18或者等于20或者等于22
WHERE NOT
(age <
18) # age 大于等于18
WHERE !
(age <
18) # age 大于等于18
4、模糊查询(_
代表单个任意字符,%
代表任意个任意字符)
WHERE
name LIKE
'_
码_
' # name是3个字符并且中间是码字
WHERE
name LIKE
'___
' # name是3个字符
WHERE
name LIKE
'李%
' # name以李字开头
WHERE
name LIKE
'_
码%
' # name的第二个字符是码字
WHERE
name LIKE
'%
码%
' # name中包含码字
2.11、 表的复制
1、创建一张拥有相同表结构的空表(只复制表结构,不复制记录)
CREATE TABLE
new_table LIKE
old_table
2、创建一张拥有相同表结构、相同记录的表(复制表结构、复制记录)
CREATE TABLE
new_table AS
(SELECT
* FROM
old_table)
可以省略 AS
2.12、 列的常见属性
NOT NULL
:不能设置为NULL
值
COMMENT
:注释
DEFAULT
:默认值(BLOB
、TEXT
、GEOMETRY
、JSON
类型不能有默认值)
AUTO_INCREMENT
:自动增长
适用于INT
、FLOAT
、DOUBLE
类型
在插入记录时,如果不能指定此列的值或设置为NULL
,会在此前的基础上自动增长1
不能有默认值(不能使用DEFAULT
)
在一个表格中,最多只能有一列被设置为AUTO_DEFAULT
这一列必须被索引(UNIQUE
、PRIMARY KEY
、FOREIGN KEY
等)
2.13、 UNIQUE
索引
1、一旦某一列被设置了UNIQUE
索引
该列所有值必须是唯一的、允许存在多个NULL
值
2、2种常见的写法
CREATE TABLE student(
id INT UNIQUE, # 列名 数据类型 UNIQUE [KEY]
name VARCHAR(20),
UNIQUE (name) # UNIQUE [KEY](列名)
);
2.14、 主键(PRIMARY KEY
)
1、主键的作用:可以保证在一张表中的每一条记录都是唯一的
如果将某一列设置为主键,那么这一列相当于加上了NOT NULL UNIQUE
建议每一张表都有主键
主键最好跟业务无关,常设置为 INT AUTO_INCREMENT
2、两种常见的写法
# 列名 数据类型 PRIMARY KEY
CREATE TABLE company(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL UNIQUE
);
# PRIMARY KEY(列名)
CREATE TABLE company(
id INT AUTO_INCREMENT,
name VARCHAR(20) NOT NULL UNIQUE,
PRIMARY KEY (id)
);
2.15、 外键(FOREIGN KEY
)
一般用外键来引用其他表的主键
常见写法
# FOREIGN KEY (列名)REFERENCE 表名(列名)
CREATE TABLE company(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL UNIQUE
);
CREATE TABLE customer(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
company_id INT NOT NULL,
FOREIGN KEY (company_id) REFERENCE company(id)
);
2.16、 级联(CASCADE
)
定义外键时,可以设置级联
ON DELETE CASCADE
当删除被引用的记录时,引用了此记录的其他所有记录都会被自动删除
ON UPDATE CASCADE
当修改被引用的记录时,引用了此记录的其他所有记录都会被自动更新
2.17、 多表查询
1、内连接
INNER JOIN
、CROSS JOIN
、JOIN
在MySQL
中,他们是等价的;当时在标准SQL
中,他们并不是等价的
2、外连接
LEFT
[OUTER
] JOIN
、RIGHT
[OUTER
] JOIN
3、并集
UNION
MySQL
并不支持标准SQL
中的 “FULL
[OUTER
] JOIN
”,但可以用UNION
来替代
ON
和 WHERE
后面都可以跟着条件,它们的区别是
ON
:配合JOIN
语句使用,用以指定如何连接表的条件
WHERE
:限制哪些记录出现在结果集中
INNER JOIN
和逗号(,
)在没有连接条件的情况下,语义上是等价的
都是在指定的表之间产生笛卡尔乘积(Cartesian Product
)
也就是说,第一个表中的每一行都连接到第二个表中的每一行

# l ∪ r
# FULL OUTER JOIN EXCLUDING INNER JOIN
(
SELECT * FROM
customer l
LEFT JOIN
company r
ON
l.company_id = r.id
)
UNION
(
SELECT * FROM
customer l
RIGHT JOIN
company r
ON
l.company_id = r.id
);
2.18、 排序、分页
1、排序
ORDER BY
字段 [ ASC
| DESC
]
2、分页
LIMIT
{[offset ,
] row_count | row_count OFFSET
offset}
offset
是记录的偏移量(最小值是0),从哪一条记录开始选择
row_count是希望选择的记录数量
比如
LIMIT
10 ,
20 或 LIMIT
20 OFFSET
10
表示从第10条记录开始,选择10条记录
SELECT * FROM customer WHERE id > 20 ORDER BY company_id DESC LIMIT 10, 20
2.19、 子查询
当一个查询是另一个查询的条件是子查询
SELECT * FROM customer WHERE company_id = (SELECT id FROM company WHERE name = '腾讯')
网友评论