MySQL基础知识

141 阅读6分钟

1、MySQL概述

MySQL是一种关系型数据库

1.1、存储引擎

  • 在一个数据库中有多种引擎,常用的两个引擎是:InnoDB MyISAM
索引全文索引主键速度事务外键
InnoDB数据和主索引文件是一起的,辅助索引记录的是主键值行锁不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好InnoDB如果没有设定主键或非空唯一索引,就会自动生成一个6字节的主键,数据是主索引的一部分,附加索引保存的是主索引的值支持支持
MyISAM数据和主索引文件是分开的,辅助索引和主索引类似表锁支持FULLTEXT类型的全文索引MyISAM允许没有任何索引和主键的表存在,索引都是保存行的地址较快不支持不支持

1.2、列类型

常见类型比较

JAVAJava备注MYSQLMYSQL备注
Int短整型int短整型
long长整型bigint长整型
float单精度float单精度
double双精度double双精度
bigdecimal[类]金融数据decimal金融数据
String字符串char不可变字符串
varchar可变字符串
Boolean布尔值bit取值0和1
  • varchar与char的区别
    • char的长度是不可变的,而varchar的长度是可变的
    • char未达到设置长度的部分用空格填充,而varchar则是有多少字符就存储多少个
    • char最多可以存放255个字符,varchar的最大长度为65535个字节,varchar可存放的字符数跟编码有关

日期类型 java->Date

类型备注
DATETIME年月日,时分秒
DATE年月日
TIME时分秒
YEAR
TIMESTAMP时间缀(时间戳--范围19700101080001 - 203801191111407 基本不会用它,了解)

其它类型

类型备注
BLOB(TINYBLOB,BLOB,LONGBLOB,...)这一类都是放二进制文件(音乐,图片,视频等) 不建议使用
TEXT大量文本使用 (4G)

2、DDL-操作数据库和表

2.1、操作数据库

/* 查询全部数据库 */
show databases;

/* 进入数据库 */
use 数据库名;

/* 创建一个数据库 */
create database 数据库名;

/* 删除一个数据库 */
drop database 数据库名;

2.2、操作表

/* 查询全部表 */
show tables;

/* 查询表的结构 */
desc 表名;

2.3、表的约束

  1. 主键约束
    1. 每张表必须要有主键
    2. 主键非空且唯一,代表某一条数据的唯一性
    3. 主键类型:
      1. 自然主键:有业务含义的主键(身份证,电话号码,用户名等) --> 不建议使用
      2. 代理主键:没有业务含义的主键 --> 建议使用
  2. 非空约束:必须有值,不能为空
  3. 唯一约束:不可重复
  4. 外键约束
  5. 自增:代理主键一般加上自增,自动增加值
  6. 默认值:不输入修改时默认使用一个值

3、DQL-查询操作

3.1、简单查询

3.1.1、查询全部

SELECT 列名1,列名2,... FROM 表名;
SELECT * FROM 表名; *代表全部文件

3.1.2、消除重复数据

/* 使用DISTINCT关键字 */
SELECT DISTINCT 列名 FROM 表名;

3.1.3、列名重命名

/* 使用AS关键字 */
SELECT 列名1 AS 别名1,列名2 AS 别名2,... FROM 表名;

3.1.4、设置显示格式(字符串拼接)

/* 使用CONCAT关键字 */
SELECT CONCAT(列名1,列名2,...) FROM 表名;

3.2、过滤查询

/* 使用WHERE关键字 */
SELECT * FROM 表名 WHERE 条件;

3.2.1、运算符条件

/* 使用WHERE关键字,不等于条件可使用!=或<> */
SELECT * FROM 表名 WHERE 条件;

3.2.2、逻辑运算符条件

/* 使用WHERE关键字,逻辑运算符AND,OR,NOT */
SELECT * FROM 表名 WHERE 条件;

3.2.3、范围条件

/* 使用BETWEEN关键字,闭区间包括范围1和范围2 */
SELECT * FROM 表名 WHERE 条件 BETWEEN 范围1 AND 范围2;

3.2.4、集合条件

/* 使用IN关键字 */
SELECT * FROM 表名 WHERE 条件 IN(值1,值2,...);
SELECT * FROM 表名 WHERE 条件 NOT IN(值1,值2,...);

3.2.5、空值查询

/* 使用IS关键字 */
SELECT * FROM 表名 WHERE 列名 IS null;
SELECT * FROM 表名 WHERE 列名 IS NOT null;

3.2.6、模糊查询

/* 使用LIKE关键字 */
/* %通配符:用来表示0个或多个任意的字符 */
/* _通配符:用来表示1个任意的字符 */
SELECT * FROM 表名 WHERE 列名 LIKE "关键字";

3.2.6、正则表达式查询

/* 使用REGEXP关键字 */
/* "[A-Za-z]+" : 包含字母 */
SELECT * FROM 表名 WHERE 列名 REGEXP "[A-Za-z]+";

3.3、结果排序

/* 使用ORDER BY关键字,多个排序使用逗号隔开 */
/* ASC:升序,默认不写表示升序 */
/* DESC:降序 */
SELECT * FROM 表名 ORDER BY 列名1 DESC / ASC , 列名2 DESC / ASC;

3.4、分页查询

/* 使用LIMIT关键字 */
SELECT * FROM 表名 LIMIT (当前页数-1)*每页条数,每页条数;

3.5、聚集函数

/* AVG(列名):求平均数  */
SELECT AVG(列名) FROM 表名;

/* COUNT(列名):求记录条数,当列的值为null时不会记录,故一般使用主键 */
SELECT COUNT(列名) FROM 表名;

/* MAX(列名):求最大值  */
SELECT MAX(列名) FROM 表名;

/* MIN(列名):求最小值  */
SELECT MIN(列名) FROM 表名;

/* SUM(列名):求和  */
SELECT SUM(列名) FROM 表名;

3.6、分组查询

/* SELECT 列名 FROM 表名 GROUP BY 列名 */
SELECT AVG(salePrice),dir_id FROM product GROUP BY dir_id;

/* SELECT 列名 FROM 表名 GROUP BY 列名 HABING	条件 */
/* HABING关键字对分组之后的结果进行筛选,WHERE关键字对分组之前的结果进行筛选 */
SELECT dir_id,SUM(salePrice) FROM product GROUP BY dir_id HAVING SUM(salePrice) > 1500;

4、DQL-多表查询操作

4.1、笛卡尔积

在多表查询中,没有指定连接条件而产生的结果,使用WHERE关键字加入连接条件可以避免笛卡尔积

4.2、内连接

/* 隐式内连接,不包含JOIN */
SELECT * FROM 列名1,列名2 WHERE 条件;
/* 显式内连接,使用INNER JOIN连接,INNER可省略 */
SELECT * FROM 列名1 JOIN 列名2 ON 条件;

4.3、外连接

/* 左外连接,使用LEFT JOIN连接 */
SELECT * FROM 列名1 LEFT JOIN 列名2 ON 条件;
/* 右外连接,使用RIGHT JOIN连接 */
SELECT * FROM 列名1 RIGHT JOIN 列名2 ON 条件;

4.4、子查询

/* WHERE中的查询条件来自于另一个查询 */
SELECT * FROM product WHERE salePrice > (SELECT salePrice FROM product WHERE productName = "罗技MX1100");

4.5、自连接

/* 本质上仍为内连接和外连接,只是连接的是同一个表,由于连接的是一个表,故必须重命名以作区分 */
SELECT * FROM 表名1 重命名,表名2 重命名 WHERE 条件;
SELECT * FROM 表名1 重命名 JOIN 表名2 重命名 ON 条件;
SELECT * FROM 表名1 重命名 LEFT JOIN 表名2 重命名 ON 条件;
SELECT * FROM 表名1 重命名 RIGHT JOIN 表名2 重命名 ON 条件;

5、DML-数据操作

5.1、插入数据

INSERT INTO 表名 (列名1,列名2,...) VALUES (值1,值2,...);

5.2、修改数据

UPDATE 表名 SET 列名1 =1,列名2 =2,... WHERE 条件;

5.3、删除数据

DELETE FROM 表名 WHERE 条件;

6、函数

6.1、聚集函数

/* AVG(列名):求平均数  */
SELECT AVG(列名) FROM 表名;

/* COUNT(列名):求记录条数,当列的值为null时不会记录,故一般使用主键 */
SELECT COUNT(列名) FROM 表名;

/* MAX(列名):求最大值  */
SELECT MAX(列名) FROM 表名;

/* MIN(列名):求最小值  */
SELECT MIN(列名) FROM 表名;

/* SUM(列名):求和  */
SELECT SUM(列名) FROM 表名;

6.2、类型转换函数

/* 使用CAST(值 AS 类型),CONVERT(值, 类型)进行类型转换 */
SELECT CAST(值 AS 类型) FROM 表名;
SELECT CONVERT(值, 类型) FROM 表名;

/* 常见MySQL类型 */
/* 二进制,同带binary前缀的效果 : BINARY */
/* 字符型,可带参数 : CHAR() */
/* 日期 : DATE */
/* 时间: TIME */
/* 日期时间型 : DATETIME */
/* 浮点数 : DECIMAL */
/* 整数 : SIGNED */
/* 无符号整数 : UNSIGNED */

6.3、字符串函数

/* LENGHT(s): 返回传入字符串长度,编码集为utf8时,中文字符长度为3 */
/* CONCAT(s1,S2,...): 拼接字符串,若其中有任意参数为null,则返回null */
/* TRIM(s): 去掉传入字符串开始和结尾处的空格 */
/* UPPER(s): 将传入字符串的所有字母改为大写字母 */
/* LOWER(s): 将传入字符串的所有字母改为小写字母 */

6.4、日期函数

/* 返回当前日期 */
CURDATE(),CURRENT_DATE(),CURRENT_DATE

/* 返回当前时间 */
CURTIME(),CURRENT_TIME(),CURRENT_TIME

/* 返回当前日期和时间 */
NOW(),CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE(),LOCALTIMESTAMP()

/* 相关函数 */
YEAR(d):接受date参数,并返回日期的年份

6.5、控制流程函数

/* SELETE IF(参数1,参数2,参数3),若参数1为真,则返回参数2,若参数1为假,则返回参数3 */

/* SELETE IFNULL(参数1,参数2),若参数1为空,则返回参数2,若参数1不为空,则返回参数1 */

7、备份与恢复

7.1、使用DOS命令

导入:mysqldump -u账户 -p密码 数据库名称 > 脚本文件存储地(地址精确到文件,例如:F:/xx.sql)

导出:mysqldump -u账户 -p密码 数据库名称 < 脚本文件存储地(地址精确到文件,例如:F:/xx.sql)

7.2、使用Navicat工具

导入:右键数据库 --> 运行SQL文件

导出:右键数据库 --> 转储SQL文件