一、数据库的常见操作
1、数据库创建
语法格式
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
说明:
大写的表示关键字
[] 是可选项
CHARACTER SET: 指定数据库采用的字符集
COLLATE: 指定数据库字符集的校验规则
例子
创建数据库
create database db;
说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_
general_ ci
创建一个使用utf8的字符集的数据库
create database db charset=utf8;
创建一个使用utf8的字符集并使用 校验规则的数据库
create database db charset=utf8 collate utf8_general_ci;
删除数据库
drop database db;
2、字符集和字符规则
查看系统默认字符集以及校验规则
show variables like 'character_set_database';
show variables like 'collation_database';
查看数据库支持的字符集
show charset;
字符集主要是控制用什么语言。比如utf8就可以使用中文。
查看数据库支持的字符集校验规则
show collation;
校验规则对数据库的影响
创建一个数据库,校验规则使用utf8_ general_ ci
create database db2 collate utf8_general_ci;
使用数据库
use db2;
建表
create table test;
插入数据
insert into test(name) values("a");
insert into test(name) values("b");
insert into test(name) values("A");
insert into test(name) values("B");
查询
select *from test where name='a';
结果排序
创建一个数据库,校验规则使用utf8_ bin[区分大小写]
数据库
create database db4 collate utf8_bin;
建表
create table test(name varchar(3));
插入数据
insert into test(name) values ("a");
insert into test(name) values ("A");
查询结果
select *from test where name='a';
![在这里插入图片描述](https://img-blog.csdnimg.cn/9b10f67df54640159b05d1ac1e76796b.png)
3、数据库操作
显示创建的数据库
show databases;
显示数据库创建语言
show create database 数据库名;
说明:
MySQL 建议我们关键字使用大写,但是不是必须的。
数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字
/*!40100 default… */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话
4、修改数据库
语法
ALTER DATABASE db_name
[alter_spacification [,alter_spacification]...]
alter_spacification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
说明:
对数据库的修改主要指的是修改数据库的字符集,校验规则
将数据库db字符集修改为gbk;
alter database db charset=gbk;
![在这里插入图片描述](https://img-blog.csdnimg.cn/3868803619104d18a5642efb5a8318a4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
5、数据库删除
语法:
DROP DATABASE [IF EXISTS] db_ name;
数据库内部看不到对应的数据库
对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
![在这里插入图片描述](https://img-blog.csdnimg.cn/1efd38616caf4074a2e26b741a6384ba.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
二、数据库表的常见操作
1、创建表
语法
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
说明:
field 表示列名
datatype 表示列的类型
character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准
案例:
创建一个student表
create table student(id int,name varchar(32),gener varchar(4));
id int comment "编号"可以把id这行的换成编号
不同的存储引擎,创建表的文件不一样
users 表存储引擎是MyISAM ,在数据目中有三个不同的文件,分别是:
users.frm:表结构
users.MYD:表数据
users.MYI:表索引
查看表结构
desc student
Null表示是否为空,YES表示可以为空 defauil为默认值
3、修改表
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎
等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。
语法:
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column datatype]...);
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column datatype]...);
ALTER TABLE tablename DROP (column);
案例:
在表中插入一个字段,默认添加到最后
alter table student xuehao varchar(12);
在第一个id后边添加一个年龄字段
alter table student add age int after id;
修改表中字段的长度比如修改name字段长度为30
alter table student modify name varchar(30);
删除某一个字段,删除student的学号字段
alter table student drop xuehao;
修改表名 修改表名student为users
alter table student rename to users;
to:可以省掉
修改表中字段名字,将users表中gener字段改为sex`
alter table users change gener sex varchar(5);--新字段需要完整定义
删除表
drop table users;
添加数据
insert into users(id,name,sex) values(1,"lisan","男");
三、数据类型
数据类型分类
![在这里插入图片描述](https://img-blog.csdnimg.cn/1e415bb407e941b082ed92e20826ee8e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
1、数值类型
![在这里插入图片描述](https://img-blog.csdnimg.cn/c2ac530c12cc4d8fa8cc12f2c88e073a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
tinyint类型
数值越界测试:
创建一个表db1 表中数据num数据类型为tinyint
create table db(num tinyint);
当添加数据-128和172时显示添加成功,但是128显示超出范围数值越界
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
可以通过UNSIGNED来说明某个字段是无符号的
无符号案例:
创建一个表中含有无符号数据tinyint的表
create table db2(num tinyint unsigned);
显示-1和256不可插入
尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,
还不如设计时,将int类型提升为bigint类型。
bit类型
语法:
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
bit使用的注意事项:
bit字段在显示时,是按照ASCII码对应的值显示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/298b33ba009b472ab20174b9325daeff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。
![在这里插入图片描述](https://img-blog.csdnimg.cn/bf23327319a4476e822e53cccd959e09.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
2、小数类型
语法:
float类型
语法:
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
案例:
小数float(5,2)表示范围-999.99~999.99MySQL在保存值时会进行四舍五入。
create table db2(id int,a float(5,2));
结果显示-999.999插入失败
如果定义的是float(5,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 999.99
create table db6(id int,a float(5,2) unsigned);
![在这里插入图片描述](https://img-blog.csdnimg.cn/934c83e942144fcfae2eefe636ec5641.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/662cb28515134c4e859fc4fa9baeb0dc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ieq6aaW55qE5bCP5YG3,size_15,color_FFFFFF,t_70,g_se,x_16)
decimal类型
decimal更精确
语法
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal(5,2) 表示的范围是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范围 0 ~ 999.99
decimal和float很像,但是有区别:
float和decimal表示的精度不一样
create table dp1(id int,num float(5,8),a decimal(5,8));
发现decimal的精度更准确,因此如果我们希望某个数据表示高精度,选择decimal
float表示的精度大约是7位
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10
如果希望小数的精度高,推荐使用decimal
3、字符串类型
char类型
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
创建一个表
mysql> create table dp1(id int,name char(2));
超过2个字符就插入不来了。
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
varchar类型
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
案例
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是
65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字
节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
char和varchar比较
varchar指定的长度是字节长度
char指定长度是字符长度
如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
日期和时间类型
常用的日期有如下三个:
date :日期’yyyy-mm-dd’ ,占用三字节
datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从1000 到9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和datetime 完全一致,占用四字节
create table dp2(id date.id2 datetime,id3 timestamp);
update可以更新数据
enum和set
语法:
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。
enum
create table dp4(id int,name enum("lisan","lisi","wangwu","zhaoliu"),sex varchar(32));
insert into dp4 values(1,1,"nan");
set:
create table dp5(id int,name set("lisan","lisi","wangwu","zhaoliu"),sex varchar(32));
insert into dp5 values(1,"lisan,lisi,zhaoliu","nan");
insert into dp5 values(2,"lisan","nan");
insert into dp5 values(3,"lisan,lisi","nan");
有如下数据,想查找所有由lisan的组合:
但是有的组并没有查询出来
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果sub 在str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分
隔的字符串。
在所有人找到含有李三的组合。