美文网首页
[java]24、MySQL

[java]24、MySQL

作者: 史记_d5da | 来源:发表于2022-01-02 16:27 被阅读0次

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大类
DDLData Definition Language
数据定义语言
创建(CREATE)、修改(ALTER)、删除(DROP)数据库\表
DMLData Manipulation Language
数据操纵语言
增加(INSERT)、删除(DELETE)、修改(UPDATE)记录
DQLData Query Language
数据查询语言
查询记录(SELECT
DCLData Control Language
数据控制语言
控制访问权限(GRANTREVOKE

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、常用数据类型-日期和时间类型
日期和时间类型
  1. MySQL 5.6.4开始,允许TIME\DATETIME\TIMESTAMP有小数部分,需要0~3字节的存储
  2. DATETIME支持范围:1000-01-01 00:00:00.0000009999-12-31 23:59:59.999999
  3. TIMESTAMP支持范围:1970-01-01 00:00:01.0000002038-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:默认值(BLOBTEXTGEOMETRYJSON类型不能有默认值)
AUTO_INCREMENT:自动增长
适用于INTFLOATDOUBLE类型
在插入记录时,如果不能指定此列的值或设置为NULL,会在此前的基础上自动增长1
不能有默认值(不能使用DEFAULT
在一个表格中,最多只能有一列被设置为AUTO_DEFAULT
这一列必须被索引(UNIQUEPRIMARY KEYFOREIGN 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 JOINCROSS JOINJOIN
MySQL中,他们是等价的;当时在标准SQL中,他们并不是等价的
2、外连接
LEFT [OUTER] JOINRIGHT [OUTER] JOIN
3、并集
UNION
MySQL并不支持标准SQL中的 “FULL [OUTER] JOIN”,但可以用UNION来替代
ONWHERE 后面都可以跟着条件,它们的区别是
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 = '腾讯')

相关文章

网友评论

      本文标题:[java]24、MySQL

      本文链接:https://www.haomeiwen.com/subject/mmyraltx.html