MySQL基础和 表的‘CRUD’(基础版)
目录
MySQL数据库基础
1. 数据库的操作
1.1 创建数据库
1.2显示当前的数据库
1.3使用数据库
1.4删除数据库
2.常用的数据类型:
2.1数值类型:
2.2字符串类型
2.3日期类型
3.表的操作
3.1创建表
3.2查看表结构
3.3查看数据所有的表
3.4删除表
MySQL表的增查改删(CRUD)
1.CRUD
2.增加(Create)
2.1单行插入
2.2指定行插入
2.3一次插入多个记录:
3.查询(Retrieve)
3.1全列查询
3.2 指定列查询
3.3别名(AS)
3.4去重(DISTINCT)
3.5排序 (ORDER BY)
3.6条件查询
3.7 范围查询
3.8模糊查询(LIKE)
3.9NULL查询( IS [NOT] NULL)
3.9分页查询LIMIT
4.修改(Update)
5. 删除(Delete)
MySQL数据库基础
1. 数据库的操作
1.1 创建数据库
CREATE DATABASE 数据库名;
注意:
- create,database...相当于“关键字”.
- SQL的关键字不区分大小写的.
- 创建的数据库的名字可以随便取,但是不能重复!!
- 单词之间至少一个空格,也可以是多个,不能没有!!!
- 在命令行中输入sql必须以 ; 作为结尾!!
在MySQL安装与配置【windows&Mac】完成配置后,打开目标文件所在位置,输入密码并创建数据库。当出现红色框标识时,即表示数据库创建成功。
标准的创建数据库语句:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...]
- []里的内容是可选的~
- IF NOT EXISTS如果不存在,才创建.如果存在就什么也不用干~(不会报错)
create database test1 charset utf8;
- charset utf8是character set uft8的缩写,创建数据库同时指定数据库的字符集~
- 说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8
字符集是干什么的???
问:一个汉字,占几个字节?
A:2个
B:3个
C:4个
答案是全错!!
得看它的【编码】!
字符集就是针对汉字进行编码~
英文字母在计算机里如何表示?
ascii~~使用数字表示字符~~
而汉字要表示的特别多~几万个~所以要一个更大的表来表示汉字~
(vs使用的编码方式是跟随系统的,windows简体中文版,系统编码就是gbk)
- gbk: 使用两个字节表示一个汉字
- utf8:使用三个字节表示一个汉字
目前更主流的还是utf8,这个东西能表示的内容特别多~~
除了汉字之外,各种其他国家的语言文字符号都能表示~~
所以手动设定一个字符集是非常关键的!!!
后续如果要插入一些中文,如果不是utf8/gbk之类的中文就会乱码~~
在网上还有的能看到utf8b4(完整版),在MySQL中utf8是残缺的(残缺了一些emoji表情)
1.2显示当前的数据库
SHOW DATABASES;
1.3使用数据库
USE 数据库名;
1.4删除数据库
DROP DATABASE 数据库名;
- 删除数据库,内部就看不到对应的数据库,里面的表和数据全部被删除,所以如果和公司没死仇就别删库跑路 。
2.常用的数据类型:
2.1数值类型:
分为整型和浮点型:
数据类型 | 大小 | 说明 | 对应的java类型 |
BIT[ (M) ] | M指定位数,默认为1 | 二进制数,M 范围从 1 到 64 , 存储数值范围从0 到 2^M-1 | 常用 Boolean 对应 BIT ,此时 默认是 1 位,即只能存 0 和 1 |
TINYINT | 1字节 | Byte | |
SMALLINT | 2字节 | Short | |
INT | 4字节 | Integer | |
BIGINT | 8字节 | Long | |
FLOAT(M,D) | 4字节 | 单精度,M指定长度,D指定小数位数,会发生精度丢失 | Float |
DOUBLE(M,D) | 8字节 | Double | |
DECIMAL(M,D) | M/D最大值+2 | 单精度,M指定长度,D指定小数位数,精确数值 | BigDecimal |
NUMERIC(M,D) | M/D最大值+2 | 和DECIMAL一样 | BigDecimal |
- 如float(3,1)就得55.2,22.4这种
- float和double是不能竞争表示小数的!!
- DECIMAL能够精确表示小数
2.2字符串类型
数据类型 | 大小 | 说明 | 对应java类型 |
VARCHAR(SIZE) | 0-65,535 字节 | 可变长度字符串 | String |
TEXT | 0-65,535字节 | 长文本数据 | String |
MEDIUMTEXT | 0-16777215字节 | 中等长文本数据 | String |
BLOB | 0-65,535字节 | 二进制形式的长文本数据 | String |
- varchar(size)属于可变长的字符串~~
- size表示最大长度,单位是字符(不是字节!!!)
- varchar(10)=>最多十个字~~
2.3日期类型
数据类型 | 大小 | 说明 | 对应java类型 |
DATETIME | 8字节 | 范围从 1000 到 9999 年,不会进行时区的 检索及转换。 | java.util.Date 、 java.sql.Timestamp |
TIMESTAMP | 4字节 | 范围从 1970 到 2038 年,自动检索当前时 区并进行转换。 | java.util.Date 、 java.sql.Timestamp |
- DETETIME这个时间更充足一些~~
3.表的操作
------------------------------------------------------先使用数据库!--------------------------------------------------------
3.1创建表
CREATE TABLE 表名(
field1 datatype;
field2 datatype;
field3 datatype;
);
- 可以使用comment增加字段说明。
create table student (name varchar(20) comment '姓名' , age int , password varchar(20) comment '密码');
注意:
- 创建表格之前要先使用数据库!!!
否则会报错use 数据库名;
ERROR 1046 (3D000): No database selected
- 单词之间一定要有空格!!!尤其是表名和后面的()有空格!!! 否则报错
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
3.2查看表结构
desc 表名;
- field 字段
- type 类型
- null 该列是否允许为空
- default 默认值
- Extra 额外补充
3.3查看数据所有的表
show tables;
- 不要轻易的查看,前提是库中的表特别多的情况!!
3.4删除表
DROP TABLE 表名;
MySQL表的增查改删(CRUD)
1.CRUD
2.增加(Create)
insert into 表名 values (值,值...);
(值,值....)此处列出的这些值的数目和类型表的列相匹配。
2.1单行插入
😈tips:
- SQL表示字符串,使用 ' 或者 " 都是可以的.
- SQL中没有“字符”类型(大部分没有字符类型的编程语言,都是允许单引号和双引号表示字符串,并且单双银行通常是等价的).
- Python,JS,PHP,Linux,Shell....都是属于没有字符类型,单双银行都表示字符串的.
2.2指定行插入
- 使用 () 来标识当前要针对哪些列插入.
- 多个列名之间可以使用 , 来分割.
- 后续 values 里的列,必须要和当前 () 中的个数和类型都匹配.
2.3一次插入多个记录:
在values后面可以有多个(),多个()之间使用 , 分割,每一组 () 就是一条记录(也就是一行)
3.查询(Retrieve)
3.1全列查询
select * from 表名;
- * 是通配符(相当于斗地主的癞子牌).
- 这个操作就是查询当前数据库中所有的行和所有的列 .
3.2 指定列查询
select 列名 from 表名;
也可以使数学+10查询
此处看到的客户端的结果其实是一个临时表.
select操作不管怎么写,都不会影响到数据库服务器硬盘上存储的原始数据.
3.3别名(AS)
- 为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称。
select 列名 as 别名 from 表名;
- 别名会最终显示在查询结果的临时表中.
- as 关键字,可以省略,但是建议不要省略.
3.4去重(DISTINCT)
- 使用 DISTINCT 关键字对某列数据进行去重
select distinct 列名 from 表名;
3.5排序 (ORDER BY)
ASC 为升序(从小到大)可以省略不写.
DESC 为降序(从大到小)
select 列名, 列名 from 表名 order by 列名;
select 列名, 列名 from 表名 order by 列名 desc;
依据英语成绩排序。
order by 还能指定多个列排序(order by 后面可以写多个列)
此处是先拿english这一列进行排序,如果english相同了,然后根据math排序。
3.6条件查询
比较运算符:
运算符 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于, NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于, NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=,<> | 不等于 |
BETWEEN a0 AND an | 范围匹配, [a0, a1] ,如果 a0 <= value <= a1 ,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
like | 模糊匹配。 % 表示任意多个(包括 0 个)任意字符; _ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
AND | 多个条件必须都为 TRUE(1) ,结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1) ,结果为 FALSE(0) |
😈(注意):
- WHERE条件可以使用表达式,但不能使用别名.
- AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分.
- WHERE条件可以使用表达式,但不能使用别名。
注意区分:
报错:
- 当我们在条件中,尝试使用别名的时候,这个别名不能被正确的识别出来.
- MySQL的where条件中,无法使用列的别名!!!
- 从数据库设计的角度来看,MySQL是完全可以做到让where子句中,能识别出别名的,但是确实现在MySQL没支持,不能保证若干年后某个新版本就能支持了.
- 不支持别名属于结论,属于MySQL对于语法的规定.
- AND的优先级高于OR,在同时使用时,需要使用小括号 () 包裹优先执行的部分
- 在SQL中,and的优先级比or更高,但没什么用~~
- 建议使用 () 收到的明确优先级~~
3.7 范围查询
- BETWEEN...AND...
- 查询语文成绩在80-90之间的同学
select name,chinese from exam_result where between 80 and 90;
- 也可以使用AND实现
select name,chinese from exam_result where chinese >= 80 and chinese <= 90;
- IN
- 查询数学成绩是58或者59或者60的同学
select name,math from exam_result where math in (58,59,60);
也可以使用OR实现
select name, math from exam_result where math = 58 or math =69 or math =60;
3.8模糊查询(LIKE)
% 匹配0个或者任意多个字符
- 查询姓’孙‘的同学
select * from exam_result where name like '孙%';
查询姓以’孙‘结尾的同学
select * from exam_result where name like '%孙';
查询姓名中有’孙‘字的同学
select * from exam_result where name like '%孙%';
📌:金角大王举葫芦喊:“孙行者!”悟空挠头:“你认错人啦,我是‘者行孙’~”✨ 妖怪刚掏出本子记名字,他又蹦跶:“错错错,我是‘行者孙’本孙!”🌚 葫芦:“这届猴子咋这么会玩文字狱啊喂!”😤
_ 匹配一个字符
- 想查到孙某的信息
select * from exam_result where name like '孙_';
想查到孙某某的信息
select * from exam_result where name like '孙__';
想查到孙某某某的信息
select * from exam_result where name like '孙___';
3.9NULL查询( IS [NOT] NULL)
- 查询语文成绩为空的
select * from exam_result where chinese =null;
这里null =null =>null =>false (条件不成立!!)
select * from exam_result where chinese <=> null;select * from exam_result where chinese is null;
这两句都可以
3.9分页查询LIMIT
select 列名 from 表名[where ...] [order by ...] limit n;
针对查询的结果进行截取,截取其中的一部分~~
一次查询,最多获得3条记录~~ 约束力结果中最多包含几个记录。
offset 3 表示描述了当前的结果,从哪一条开始算,这是表示从下标为3的记录开始获得的(下标从0开始算)
4.修改(Update)
update 表名 set 列名 = 值 where 条件...;
进行修改,要明确一些重要的信息
- 改哪个表~
- 改这个表里面的哪个列/哪些列,改成什么~
- 改这个表的哪些行~
update exam_result set math = 80 where name = '孙悟空';
此处的修改是修改MySQL服务器,保存在硬盘上的数据 (持久生效的).
- 如果没有指定条件:
update exam_result set math = 0 ;
所有的数据都会改变!
- 删库,是指所有的数据删除,你可以根据之前的备份导入进来
- update修改的条件没设定好,你也不知道,当前哪些行被修改了,哪些没修改!!
- 所以修改和删库相比还是不逞多让的,甚至还犹有过之~
5. 删除(Delete)
delete from 表名 where 条件;
删除,是按照行来删除的,无法删除某些列~~(想要按照列删除,可以通过update,指定条件的韩的指定列,设为null) 。
delete from exam_result;
这是删除整个表里面的数据,表格还在。
drop table 删除后就是全都没了。
基础版的CURD就这些,稍微进阶点的在下一篇文章~~~