
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name说明:
例:创建名为 test 的数据库
CREATE DATABASE test;说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则 是:utf8_ general_ ci
如果系统没有 test 的数据库,则创建一个名叫 test 的数据库,如果有则不创建
CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8mb4;如果系统没有 test 的数据库,则创建一个使用utf8mb4字符集的 test 数据库,如果有则 不创建
CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8mb4;说明:MySQL的utf8编码不是真正的utf8,没有包含某些复杂的中文字符。MySQL真正的utf8是 使用utf8mb4,建议使用utf8mb4(mysql自己创建的,在别的数据库上不能用)

在数据库中如何让关键字成为数据库名?
比如创建一个数据库表示"订单"订单order order 也是sql 中的关键字. 此时就可以使用反引号来进行创建
create database `order`;
SHOW DATABASES;use 数据库名;DROP DATABASE [IF EXISTS] test;
说明: 数据库删除以后,内部看不到对应的数据库,里边的表和数据全部被删除

浮点数 :FLOAT(M,D) DOUBLE(M,D)

MySQL这里也是遵守IEEE754标准,表示浮点数.Mysql这里也是遵守IEEE 754标准,表示浮点数。
很多时候,小数是不能精确存储和表示的,这就导致在进行某些计算的时候,会出现误差.也严禁使用两个浮点数进行比较相等
如果针对浮点数,要比较相等,需要作差,看差值是否小于一定的误差范围.(小于一定的范围,就可以认为是近似相等)

双精度:DECIMAL(M,D) NUMERIC(M,D)

上述谈到的类型,都是有符号的类型.(有正负号,能表示负数) C语言,也有一个概念,无符号类型unsigned 其实mysql的类型中也提供了"无符号"类型. 在mysql 官方文档中,明确说明了,不建议使用无符号类型,甚至无符号类型,未来的更高版本的 mysql中可能会被删掉... 无符号类型,弊大于利. 最大的问题,是两个个无符号类型,做减法的时候,容易出现溢出~~=>得到很大的整数. Java中没有无符号类型

varchar (SIZE) 可变长度字符串
mysql中表示字符串,有很多种类型.
char(SIZE)固定长度 char(50) =>这个类型(这一列)固定就是50个字符
varchar(SIZE)可变长 varchar(50) =>这个类型就是可变长的,最大是50字符
强调: varchar (SIZE)的单位,是字符,不是字节!! 尤其是在utf8这样的编码方式下,一个字符=好几个字节
TEXT 长文本数据
TEXT也是可变长的字符串,不需要指定最大长度,完全根据你存储的数据自适应.
虽然TEXT和varchar都是可变长但是实际使用的时候,还是更倾向于varchar.
varchar 可以指定最大长度,TEXT没法指定.(TEXT 就可能会很大,大小难以预估) varchar由于指定了最大长度,程序猿很容易预估出,表里面的数据量有多少
BLOB 二进制形式的长文本数据
BLOB 存储的是二进制的数据. 前面几个都是存储文本数据


时间戳建议使用8字节版本

需要操作数据库中的表时,需要先使用该数据库:
use test;创建表,列名在前,类名在后
create table test (id int,name varchar(20),height decimal(3,1));desc test
说明: varchar(20)意思是最大长度是20个字符. 此处的11是"位宽" int在硬盘上存储,仍然是4个字节. 但是在控制台上显示的时候,最多显示11个字符这么宽
可以使用comment增加字段说明。

create table student(
name varchar(20) comment '这是姓名',
height decimal(4,1) comment '这是身高'
);
drop table test;
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...在SQL中可以使用“--空格+描述”来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
--基本语句:
insert into 表名 values (值,值...);SQL中,表示字符串可以使用 ' 也可以使用 "
C/C++/Java,'表示字符,”表示字符串.

注意: 在进行插入操作时,尽量保证插入值的顺序和创建表时的顺序一致

这里失败的原因是将'张三'转换成decimal(4,1)类型失败了。 但是在SQL中是支持隐式类型转换的,上面的177.5,就可以成功插入,因为发生了隐式的自动转换
--基本语句:
insert into表名(列名,列名...)values(值,值....);
对应的id就是NULL,因为没有设定

可以进行指定列插入多个数据
insert into student(name) values ('王五'),('赵六');
--基本语句:
insert into表名values(值,值...),(值,值...),(值,值...); insert into student values('lucy',166.5),('jack',177.5),('mack',180.0);
-- 时间书写的固定形式
insert into test values( '2024-05-14 16:46:00' );
--now() ->获取到当前的时间日期
insert into test values(now());--基本语句:
--*称为"通配符",可以指代所有的列.
select * from表名;--基本语句:
`select列名,列名..... from表名;
简单地说就是列与列之间进行加减乘除运算
--身高加5
select height + 5 from student;
说明: 执行select就会遍历每一行,取出需要的列,把列代入到表达式中. 这样的结果,只是数据库查询过程中生成的"临时表",数据库本体(数据库服务器硬盘上的数据)是没有任何改变的~

select height + 5 as height from student;
这里的去重都是针对"临时表"硬盘上的数据没有任何影响.
--基本语法:
select distinct列名from表名;
多个条件去重时,必须都重复才会触发 去重
select distinct name,height from student;
排序查询针对查询结果进行排序 查询的时候,指定按照某个列进行排序.也可以指定是升序还是降序
--默认是升序排序
select * from order by height;
注意!!!数据库,不会对于查询得到的结果集的顺序,做出任何承诺,除非sql中包含order by (如果不写order,得到的结果的顺序,是不可预期的.....写代码就不能依赖这样的顺序) asc显式表示升序,asc可以省略~~ 排序,也是只是针对临时表结果进行排序,不会影响到硬盘上原始的数据
--降序排序
select * from student order by height desc;
此处desc是descend的缩写之前desc表名, describe 如果身高相同, 这几个记录的顺序,都是不可预期的
多个列之间,使用,分割 先按照第一列来排序.如果第一列相同,再按照第二列排序...
查询过程中,指定筛选条件,满足条件的记录就保留,不满足条件的就跳过.....
--基本语法:
select列名from表名where条件;

SQL中=表示相等,没有==运算符 <=>也是比较相等 能够针对NULL和NULL进行比较的. NULL <=>NULL=> true
--身高<170的
select * from student where height < 170;
注意:这里的null不包含在内

--身高>170,名字叫mack的
select * from student where height > 170 and name = 'mack';
--身高>170,或者名字叫mack的
select * from student where height > 170 or name = 'mack';
--身高在170~180之间的
select * from student where height between 170 and 180;
--满足身高是165.0或177.5的
select * from student where height in (165.0,177.5);
不要求完全相等,只要满足一定的条件就可以了. 此处,还是需要搭配通配符,描述这样的条件.
%在右边,表示查找以m开头的内容,m后可以有任意个字符
select * from student where name like 'm%';
查询中间包含a的,两边可以有任意个字符
select * from student where name like '%a%';
%在左边,表示k的前面有任意字符,k的后面就没有东西了
select * from student where name like '%k'
select * from student where name like 'm_';
--基本语法:
select 列名 from 表名 limit N;指定limit的时候,还可以搭配 offset来使用. offset表示是从下标为几这样的记录开始算limit

-- 查询 qq_mail 已知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NOT NULL;
-- 查询 qq_mail 未知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NULL;--基本语法:
update表名set列名=值,列名=值...upset的修改是真正在改变硬盘,这样的修改是持久有效的 where,order by,limit在此处也适用 指定update的时候,如果当前不指定任何条件,就会针对所有的行都能生效!!(把整个表都给改了)
--将姓名叫王五的身高改为155.5
update student set height = 155.5 where name = '王五';
--基本语句:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]把筛选出来的行删除掉. 这里的匹配,是匹配到几个就删除几个!!! 修改的是硬盘!!一旦删掉了,数据就无了!!!
delete from student where name = '123';