MySQL学习笔记(基础)

2021/4/10 19:22:23

本文主要是介绍MySQL学习笔记(基础),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

学习目标:

Java的JDBC需要用到的SQL基础


学习内容:

一.DDL(数据定义语言)

1.数据库

  • 查看所有数据库 SHOW DATABASES;
  • 切换数据库 USE 数据库名;
  • 创建数据库 CREATE DATABASES 数据库名;
  • 删除数据库 DROP DATABASES 数据库名;
  • 修改数据库编码 ALTER DATABASES 数据库名 CHARACTER SET 编码;

2.常用数据类型

INT 整型

DOUBLE 浮点型 , DOUBLE(5.2) 表示最多5位,必须有两位小数

DECIMAL 浮点型 ,不会出现精度缺失问题,在钱方面使用

CHAR 字符串类型(固定长度),CHAR(255) 表示最长255,会补足

VARCHAR 字符串类型(可变长度),VARCHAR(65535) 表示最长65535,不补足。有专门字节记录长度

BLOB 字节类型

DATE 日期类型(yyyy-MM-dd)

TIME 时间类型(hh:mm:ss)

TIMESTAMP 时间戳类型(有年月日,也有时分秒)

3.表

  • 创建表
CREATE TABLE  表名{
		列名1   列类型1;
		...
		列名n  列类型n;
};
  • 查看当前数据库中所有表名称 SHOW TABLES;
  • 查看表结构 DESC 表名;
  • 删除表 DROP TABLE 表名;
  • 修改表(前缀:ALTER TABLE 表名)
    添加列 ALTER TABLE 表名 ADD(列名 列类型; ...);
    修改列类型 ALTER TABLE 表名 MODIFY 列名 列类型;
    修改列名 ALTER TABLE 表名 ADD 原列名 新列名 列类型;
    删除列 ALTER TABLE 表名 DROP 列名;
    修改表名称 ALTER TABLE 原表名 RENAME TO 新表名;

二.DML(数据操作语言)

  • 插入数据
    插入行(列值与列名必须相对应):
    INTERT INTO 表名(列名1,列名2,...) VALUES(列值1,列值2,...);
    插入所有列(值的个数必须是该表列的个数,值的顺序也必须对应):
    INTERT INTO 表名 VALUES(列值1,列值2,...);
  • 修改数据
    UPDATE 表名 SET 列名1 = 列值1,列名2 = 列值2,... [WHERE 条件];
    条件必须是boolean类型的值或者表达式
  • 删除数据
    DELETE FROM 表名 [WHERE 条件];
    TRUNCATE TABLE 表名 ; 无法回滚(先删除,再创建新的表)

三.DQL(数据查询语言)

1.基本查询

  • 字段(列)控制
    查询所有列:SELECT * FROM 表名;
    查询指定列:SELECT 列名1,列名2,... FROM 表名;
    查询指定列(当查询结果中有多行一模一样的时,只显示一行):
    SELECT DISTINCT * | 列名1,列名2,... FROM 表名;
    列运算(原表不变):
    .数量类型的列可以做加减乘除运算SELECT 列名[*1] FROM 表名;
    .字符串类型的列可以做连接运算SELECT CONCAT(['我是'],列名) FROM 表名;
    .给列起别名SELECT IFNULL (列名,别名);
  • 条件控制
    条件查询:SELECT * FROM 表名 WHERE 条件;
    模糊查询:SELECT * FROM 表名 WHERE 列名 LIKE 条件; ‘_’ 一个字符, ‘%’ 0-n个字符

2.排序

  • 升序:SELECT * FROM WHERE 表名 ORDER BY 列名 ASC ;
  • 降序:SELECT * FROM WHERE 表名 ORDER BY 列名 DESC;
  • 使用多列作为排序条件:SELECT * FROM WHERE 表名 ORDER BY 列名 ASC . 列名 DESC;

3.聚合函数

用来做某列的纵向运算
COUNT 表中(所有列都不为NULL的)记录的行数SELECT COUNT(列名) FROM 表名;
MAX查询某列的最高值
MIN查询某列的最低值
SUM查询某列的和
AVG查询某列的平均值

4.分组查询

把记录使用某一列进行分组,然后查询组信息
SELECT 条件列名 , COUNT(*) FROM 表名 GROUP BY 条件列名;

5.LIMIT子句

用来限定结果的起始行以及总行数(是MySQL的方言)
SELECT * FROM 表名 LIMIT 起始行数 , 总行数;

四.DCL(数据控制语言)

  • 创建用户
    CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
    指定IP地址才能登录,如果把IP地址改为’%’,则任意IP地址能登录

  • 给用户授权
    GRANT 权限1,权限2,... ON 数据库 . * TO 用户名@IP地址;

  • 撤销授权
    REVOKE 权限1,权限2,... ON 数据库 . * FROM 用户名@IP地址;

  • 查看权限
    SHOW GRANTS FOR 用户名@IP地址;

  • 删除用户
    DROP USER 用户名@IP地址;

五.MySQL的编码问题

1.查看MySQL编码

  • 查看MySQL编码:SHOW VARIABLES LIKE 'char%';

2.编码解释

character_set_client:server解析客户端sql语句的字符集
character_set_results:server返回给客户端的查询结果或者错误提示的字符集编码
character_set_server:服务器默认字符集编码
character_set_database:默认数据库的字符集编码
character_set_connection:字符串字面值(literal strings)的字符集
character_set_system:mysqlserver用来存储元数据的编码,通常就是utf8,不要去改动它
character_set_dir:mysql字符集编码存储文件夹
character_set_filesystem:文件系统字符集编码,主要用于解析用于文件名称的字符串字面值

3.乱码问题

  • 插入或修改时出现乱码 / 查询出的数据为乱码
  • 解决办法:
    (1)设置变量(只对当前连接有效,再次登陆后无效)
    如:set character_set_client = gbk;
    (2)在总配置文件(my.ini)中设置
    如:default_character_set = gbk; [可以同时修改三个变量(client,results,connections)]

4.指定默认编码

安装MySQL时,默认为utf8
也可以设置(在my.ini中设置)
如:character_set_server = utf8;

六.备份与恢复

1.数据库导出SQL脚本

(1).不要打分号,不要登录mysql,直接在cmd下运行
(2).生成的脚本文件不包含create database语句
mysqldump -u用户名 -p密码 数据库名 > 生成的脚本文件路径;

2.执行SQL脚本

不要打分号,不要登录mysql,直接在cmd下运行
(1)mysql -u用户名 -p密码 数据库名 < 生成的脚本文件路径;
(2)先登录mysql,然后source SQL脚本路径

七.约束

1.主键约束

  • 需要满足的条件:非空唯一被引用
  • 创建主键的两种方式:
CREATE TABLE  表名(
	列名1  列类型1  PRIMARY  KEY,
	...
);
CREATE TABLE  表名(
	列名1  列类型1 ,
	...
	PRIMARY  KEY(列名1),
);
  • 修改表时指定主键:ALTER TABLE 表名 ADD PRIMARY KEY(列名 );
  • 删除主键:ALTER TABLE 表名 DROP PRIMARY KEY;

2.主键自增长

  • 创建表时指定主键自增长:
CREATE TABLE  表名(
	列名1  列类型1  PRIMARY  KEY  AUTO_INCREMENT,
	...
);
  • 修改表时设置主键自增长:ALTER TABLE 表名 CHANGE 主键名 主键名 类型 AUTO_INCREMENT ;
  • 修改表时设置主键自增长:ALTER TABLE 表名 CHANGE 主键名 主键名 类型 ;
  • 测试主键自增长(插入数据):INSERT INTO 表名(列...) VALUES (列值...);

3.非空约束

因为某些列不能设为NULL值,所以要加非空约束

CREATE TABLE  表名(
	...
	列名  列类型  NOT  NULL,
	...
);

4.唯一约束

因为某些列不能设为重复值,所以要加唯一约束

CREATE TABLE  表名(
	...
	列名  列类型  UNIQUE,
	...
);

5.外键约束

要求:必须是另一张表的主键的值,可以重复,可以为空

  • 修改表时添加外键约束:
    ALTER TABLE 表名1 ADD CONSTRAINT 表1的列名 FOREING KEY(表1的列名) REFERENCES 表2(列);
  • 修改表时删除外键约束:
    ALTER TABLE 表名 FOREING KEY 列名;

6.概念模型

  • 当我们要完成一个软件系统时,需要把系统中的实体抽取出来,形成概念模型。
  • 实体间存在的关系:
    1:n
    1:1 :加外键约束
    n:n :使用第三张表,引用其它两张表的主键

八.多表查询

1.合并结果集

要求:被合并的表中,列的类型与列的数量相同

SELECT  *  FROM  表名1
UNION  (ALL)   //(不)去除重复行
SELECT  *  FROM  表名2;

2.连接查询

  • 内连接(查询出的所有记录都满足条件)
    MySQL方言SELECT * FROM 表名1 别名1 , 表名2 别名2 WHERE 别名1.xx = 别名2.xx;
    SQL标准语言SELECT * FROM 表名1 别名1 INNER JOIN 表名2 别名2 ON 别名1.xx = 别名2.xx;
    SQL自然语言SELECT * FROM 表名1 别名1 NATURAL JOIN 表名2 别名2;
  • 外连接(有一主一次,左外连接即左表为主)
    左外连接 SELECT * FROM 表名1 别名1 LEFT OUTER JOIN 表名2 别名2 ON 别名1.xx = 别名2.xx;
    右外(自然)连接 SELECT * FROM 表名1 别名1 NATURAL RIGHT OUTER JOIN 表名2 别名2 ON 别名1.xx = 别名2.xx;
  • 全连接
    SELECT * FROM 表名1 别名1 UNION 表名2 别名2 ON 别名1.xx = 别名2.xx;

3.子查询

查询中有查询(查看SELECT关键字的个数)

  • 出现的位置
    WHERE 后作为条件存在
    FROM 后作为表存在(多行多列)
  • 条件
    单行单列 SELECT * FROM 表名1 别名1 WHERE 列1 ['=' '!=' ' <' '>' '<=' '>='] (SELECT * FROM 表名2 别名2 WHERE 条件);
    多行单列 SELECT * FROM 表名1 别名1 WHERE 列1 ['IN' 'ALL' ' ANY'] (SELECT * FROM 表名2 别名2 WHERE 条件);
    单行单列 SELECT * FROM 表名1 别名1 WHERE (列1,列2) IN (SELECT * FROM 表名2 别名2 WHERE 条件);
    单行单列 SELECT * FROM 表名1 别名1 (SELECT * FROM 表名2 别名2 WHERE 条件) WHERE 条件;

学习时间:

两天


总结:

  • SQL语法:
    1.可以单行或者多行书写
    2.可以使用空格和缩进来增强语句的可读性
    3.MySQL不区分大小写,关键字建议用大写
  • 数据库中的字符串和日期类型必须用单引号,不能用’+'连接
  • 运算符'=' '!=' ' <' '>' '<=' '>=' 'BETWEEN ... AND' 'IN(...)' 'IS NULL ' 'NOT' 'OR ' 'AND'
  • 全是双手敲出来的,可能会有一些错误的地方



这篇关于MySQL学习笔记(基础)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程