目录
一、数据库的数据类型
1.数值类型
2.字符串类型
3.日期类型
二、数据库基本操作
1.数据库操作
1.1创建数据库
1.2查看所有数据库
1.3使用指定数据库
1.4删除数据库(非常危险)
三、数据表的基本操作
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查询字段并指定别名
3.5去重查询
3.6排序
3.7条件查询
3.8分页查询
4. 修改
5.删除
使用MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此,MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。
分为整型和浮点型:
数据类型 | 大小 | 说明 | 对应Java类型 | 对应C类型 |
---|---|---|---|---|
BIT [ (M) ] | M指定位数,默认为1 | 二进制数,M范围从1到64,存储数值范围从0到2^M-1 | 常用Boolean对BIT,此时默认位数是1位,即只能存0和1 | char[ ] |
TINYINT | 1个字节 | 都是整型,但字节大小依次增大 | Byte | signed char |
SMALLINT | 2个字节 | Short | short int | |
INT | 4个字节 | Integer | int | |
BIGINT | 8个字节 | Long | long long | |
FLOAT(M,D) | 4个字节 | 单精度,M指定长度,D指定小数位数,会发生精度丢失 | Float | float |
DOUBLE(M,D) | 8个字节 | 双精度,M指定长度,D指定小数位数,会发生精度丢失 | Double | double |
DECIMAL(M,D) | M/D 最大值+2 | 双精度,M指定长度,D指定小数位数,精度数值 | BigDecimal | char[ ] |
NUMERIC(M,D) | M/D 最大值+2 | 双精度,M指定长度,D指定小数位数,精度数值 | BigDecimal | char[ ] |
对于整型类型的范围:
1. 有符号范围: -2 ^ (类型字节数*8-1) 到 2^ (类型字节数*8-1) -1,如 int 是4个字节,就是 -2^31到2^31-1
2.无符号范围: 0到 2^ (类型字节数*8-1) -1, 如 int 就是2^32-1
尽量不使用 unsigbed,对于int类型可能存放不了的数据, unsigned int 同样可能存放不了,与其如此,还不如设计的时候,将int类型提升为bigint类型
数据类型 | 大小 | 说明 | 对应Java类型 | 对应C类型 |
VARCHAR(SIZE) | 0-65,535字节 | 可变长度字符串 | String | char[ ] |
TEXT | 0-65,535字节 | 长文本数据 | String | char[ ] |
MEDIUMTEXT | 0-16,777,215字节 | 中等长度文本数据 | String | char[ ] |
BLOB | 0-65,535字节 | 二进制形式的长文本数据 | byte[ ] | char[ ] |
数据类型 | 大小 | 说明 | 对应Java类型 | 对应C类型 |
DATETIME | 8个字节 | 范围从1000年到9999年,不会进行时区的检索及转换 | java.util.Data、 java.sql.Timestamp |
MYSQL_TIME |
TIMESTAMP | 4个字节 | 范围从1970年到2038年,自动检索当前时区并进行转换 | java.util.Data、 java.sql.Timestamp |
MYSQL_TIME |
-- --单行注释 # --单行注释 /*...*/ --多行注释
在cmd中的复制粘贴:选中内容,Enter 键复制,鼠标右键 粘贴
create database [数据库名];
show databases;
use [数据库名];
drop database [数据库名];
create table [表名] (若干个列名);
show tables;
desc [表名];
drop table [表名];
insert into [表名] values(对应的列数据);
insert into [表名] (若干个指定列) values (对应的列数据);-- 没有被插入的列会被默认填充为NULL
--select * from 表示全列查找
insert into [表名] values (对应的列数据),(对应的列数据),(对应的列数据)....;
select * from [表名];
select [列名], [列名]... from [表名];
select [表达式] from [表名];
表达式计算得到的结果类型不一定和原来的列类型完全一致,会尽可能保证数据是正确的.
select [列名/表达式] as [别名] from [表名];--as可以省略
单列
select distinct [列名] from [表名];
多列
select distinct [列名], [列名] ... from [表名]; --指定的列完全相同才会被合并在一起
使用distinct的时候,必须把对应的列都放到distinct之后,
所有的select操作都不会对原来的表造成任何改变.基于原来的表,生成一个结果表
想要修改,得用insert,update,dalete....
单列
select [列名],[列名]... from [表名] order by [列名] asc;--升序
select [列名],[列名]... from [表名] order by [列名] desc;--降序
字段为表达式
select [表达式] from [表名] order by [表达式] desc;--降序
使用别名
select [表达式] as [别名] from [表名] order by [别名] desc;--降序
多个列
列越靠前,优先级越高
select * from [表名] order by [列名1] desc, [列名2] desc... ;
--先按[列名1]排序,如果相等,再按照[列名2]进行排序
如果有空值NULL,则NULL会被认为是最小的.
[特别重要]:WHERE
比较运算符:
运算符 | 说明 |
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于(不是赋值),NULL不安全,例如NULL = NULL的结果是NULL |
<=> | 等于,NULL安全,例如NULL <=> NULL的结果是TRUE(1) |
!=,<> | 不等于 |
BETWEEN x AND y | 表示当值在[x,y]闭区间之间,就返回TRUE(1) |
IN(若干个选项) | 当值与其中任意一个匹配,就返回TRUE(1) |
IS NULL | 是NUL |
IN NOT NULL | 不是NULL |
LIKE | 模糊匹配,%表示任意多个(包括0个)任意字符; _表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
AND | 逻辑与,多个条件必须都为TRUE(1),结果才是TRUE(1) |
OR | 逻辑或,任意一个条件为TRUE(1),结果就为TRUE(1) |
NOT | 逻辑取反,条件为TRUE(1),结果为FALSE(0) |
select * from [表名] where [语句];
1. where条件可以使用表达式,但不能使用别名。
2. and的优先级高于or,在同时使用时,需要使用小括号()包裹优先执行的部分
例:
a)查找chinese为NULL的同学信息
b) 查找英语成绩不及格的同学信息
c)查找数学成绩>语文的同学信息
d)查找总分在250以下的同学信息
e)查询语文成绩大于80 并且英语成绩也大于80 的同学信息
f)查询语文成绩在[80, 90]的同学信息
--不能把前后两个数字写反
g)查询语文成绩是84.8, 85.7或者72.3的同学信息
h)查询所有姓张的同学信息
--like 操作要搭配通配符来使用
--%:匹配多个任意字符
--_:匹配一个任意字符
i)查询所有同学中语文成绩为 7 开头的同学信息
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
select ... from [表名] [where ...] [order by ...] limit n;
-- 从 s 开始,筛选 n 条结果
select ... from [表名] [where ...] [order by ...] limit s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
select ... from [表名] [where ...] [order by ...] limit n offset s;
a)查找同学信息中总分最高的前3名.
b)查找同学信息中总分最高的 4 -> 6名
如果limit后面的数字太大,会超出记录的数目,但是返回结果不会有任何的错误
如果 offset后面的数字超出记录的数目,就会得到一个空值
update [表名] set [列名] = [修改的值],[列名] = [修改的值] ... [where...];
a)将ID为3的英语成绩改成90
update每次修改几行记录路是不确定的 ,具体取决于where中的条件怎么写,得看where过滤之后剩下多少记录
b)将张灵玉的语文改为60,数学改为70,英语改为80
c)将所有同学的语文成绩都减10
d)将总成绩倒数3名的同学的语文
修改完的值不能超过指定列的数据类型的范围
在MYSQL中,NULL做任何的运算之后,还是为NULL
delete from [表名] [where ...];
a)删除张之维同学的信息
b)删除所有信息