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学习笔记(基础)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享
- 2024-02-22docker mysql 5.7
- 2024-02-18从 20 多套 MySQL 到 1 套 TiDB丨骏伯网络综合运营管理平台应用实践
- 2024-02-07mysql 外键索引入门介绍,为什么工作中很少有人使用?