一.数据库的操作
1.创建数据库
create database (if not exists) 数据库名称 (character set/charset 字符集名称);
SQL中有特定含义的单词(create database)也就是关键字 在创建数据库名 表名 列名的时候都可以和关键字重复 。
if not exists:使用if not exists 是为了处理在创建数据库的时候会有重复的问题,使用if not exists 可以避免sql报错(实际工作中很多时候是把一系列sql写到文件中,批量执行的,很少会一条一条的执行,在批量执行的情况下,如果一条sql报错了,后面的sql就无法继续执行了)。
character set/charset 字符集名称:MySQL的默认字符集是拉丁文,是不支持中文的,所以想要使数据库支持中文就需要在创建数据的时候指定数据库的字符集。
在计算机中,不同的字符集中,不同的编码方式下,一个汉字占几个字节是不同的。
字符集一般是使用UTF8,在这个字符集中汉字是占3个字节的。UTF8是从Unicode字符集中衍生过来的。
Unicode是给一个字符进行编码的,但是如果是字符串就不可以了,UTF8也可以被称为Unicode的字符串版本。
在Java中,char数据类型是使用Unicode来进行编码的,string类型是使用UTF8来进行编码的(在使用时Java内部会自动进行转换)。
MySQL中的UTF8并不是完整的,因为它并不支持emoj! UTF8mb4是MySQL独有的是完整的UTF8。
2.查看数据库
show databases;
这些都是MySQL数据库中自带的数据库,修改MySQL的配置可以通过mysql这个数据库。
3.选中数据库
use 数据库名;
数据库中最关键的操作就是针对数据库中的表的增删改查,表是从属与数据库中的,所以操作表的前提需要限定含有这张表的数据库。
4.删除数据库
drop database 数据库名;
删除数据库中的所有数据。
二.数据库的分类
数据库一般分为线上数据库和线下数据库。
线上数据库:生产环境的数据库和用户直接对接。线上数据库一般都是有报警的,如果一个线上MySQL服务器程序挂了,会有专门的报警程序检测到给管理数据库的工作人员发送报警的,但是在工作人员发布新版本的时候,就会重启服务器,此时就会会产生误报,所以在发布新版本的时候需要先关闭报警,然后发布新版本,然后在打开报警。
线下数据库:用于开发/测试,里面的数据都是自己构造的假的数据。
三.数据中表的操作
1.创建表
create table 表名(列名 列的类型,列名 列的类型,...);
一般情况下是比建议表名和列名同数据库的关键字相同的,但是在特殊的情况下如果一定需要相同,可以使用``将表名和列名反引起来。
一个表包含很多行,每一行也成为一个记录,一行的每一个列成为一个字段,每一个列都有一个自己的类型。
数值类型:
float(m,d):()是用来描述精度的,m表示小数一共有多少位,1.23有三位,d是用来藐视小数点后面有多少位的。
decimal相对于double来说,运算更慢,占用的空间也更多。
扩展资料
数值类型可以指定为无符号(unsigned),表示不取负数。1字节(bytes)= 8bit。上面的数据类型都是有符号的,MySQL官方并不建议使用无符合,并且表示后面会将无符号删除。
SIZE是表示的是可以存储几个字符(不是字节).如果SZIE = 10系统并不会马上为其分配存储10个字符的空间,而是先分配给它一部分,如果不足后面会自动扩展,但是最大的存储字符的数量不会超过10。
二进制形式的文本数据:通常指的是图片,音乐,视频,但是又因为BLOB的存储空间小,所以一般不使用这个数据类型来存储这些数据(一般很少会在数据库中的某一列中存储特别大的数据(几兆或者几百兆),因为这样做会影响数据库的增删改查的效率),实际上一般在存储这样的数据的时候会先将这些数据放到单独的目录中,然后数据库中只保存这些目录的地址。
日期类型:
时间戳:1970年1月1日 0:0:0到现在的毫秒数。
2.查看表
show tables;
3.查看指定表的结构
desc 表名;
4.删除表
drop table 表名;
四.MySQL的表的增删改查(CRUD)
1.增(C)
增加一行的所有列:
insert into 表名 values(值,值...);
这里新增的值需要和表中的列的数量和类型一致。
使用''或""来表示字符串,SQL中没有字符这个类型。
指定一行的某一列:
insert into 表名 (列名,列名...) values(值,值...);
此时这一行中的没有复制的列,会自动被赋值为默认值。
一次插入多行记录:
insert into 表名 (列名,列名...) values(值,值...),(值,值...);
在插入datatime类型数据时可以使用一个固定的字符串来插入:
如果想让时间为当前时刻,可以使用now()函数:
2.查(R)
全列查询:
select * from 表名;
将表中所有行和列都查询出来,这里查询出来后,服务器通过网络把这些数据返回给客户端,并且以表格的形式打印出来。
select * 是一个非常危险的操作,因为MySQL是一个“客户端-服务器”结构的程序,客户端中进行的操作,都是以请求的方式发送给服务器的,服务器被动接收这些请求处理完后,将响应返回给客户端,这个中间的过程都在在网络的环境中实现的,所以当一个表中有很多的数据的时候使用select *就会产生问题,导致服务器挂了。
指定列查询:
select (列名,列名...) from 表名;
查询字段为表达式:
select (列名,列名表达式 as 别名) from 表名;
这样操作并不会修改数据库服务器中的原始数据只是在最终响应时发生的临时计算,用于临时展示。
distinct:去除掉同一列中的相同值,如果distinct去修饰多个列,那么列中的数据出现整行都一样的情况才会去除。
在查询的时候进行排序(临时):
select 列名 from 表名 order by 列名 asc(升序)/desc(降序);
前面的列名可以不包含后面的列名。
如果不手动指定asc还是desc的话默认是asc。
如果一个sql语句不加order by那么所查出来的数据的顺序是得不到保证的,前面的查询操作所查出来的数据看似顺序是一定的,如果做一些复杂操作后数据的顺序就有可能发生变化,如果不加order by代码就不应该依赖上述的顺序,尤其是在代码中,就不能依靠上述的顺序来展开逻辑。(因为数据库并没有承诺过你这个数据是有序的)
order by也可以根据表达式来排序 也可以使用表达式别名。
同时也可以根据多个列来排序,多个列先按照前面的列进行排序,在按照后面的列排序。
条件查询(where):
select 列名 from 表名 where 条件;
分页查询:LIMIT
3.修改(U)
update 表名 set 列名 = 值 where条件/order by/limit;
可以一次修改多个列用,隔开。
如果没有条件限制就是对整列的内容都就行修改。
查询出总成绩倒数前三的同学并且将其的数学成绩加30。
update exam_result set math = math + 30 order by chinese + math + english limit 3;
注意,这里的成绩加完30后有可能超过成绩的类型限制。
不可以math += 30。
4.删除 (D)
delete 表名 where条件/order by/limit;
delete和update的操作都是很危险的操作,因为对于表中的数据都是永久性的改变,所以在操作前最好先对数据进行备份。
数据备份:
将数据的文件进行全量备份。
mysqldump工具(mysql自带的程序)会将mysql中的数据导出成一系列的insert语句,再把这些insert语句,放到另一个mysql中进行执行。
mysql还有一个binlog功能(将mysql中的各种操作都通过日志的形式记录下来),借助binlog(让另一个数据库按照binlog的内容执行,就能得到一样的数据)。