一、SQL语句的基本操作
废话不多说上干货,请收下!
文件夹:库 增 create database db1 charset utf8; #会在我们的data文件夹下,创建出一个db1文件夹,编码方式如果不指定会以默认的为准 删 drop database db1; #指定要删除的数据库就可以直接将其删除 改 alter database db1 charset gbk; #改数据库一般也就是改其编码方式,指定要改的数据库和编码方式即可修改编码方式 查 show databases; #查看data文件夹下的所有的文件夹 show create database db1; #查看创建的数据库db1的数据结构,可以看到其指定的编码, 文件:表 切换文件夹 use db1; #创建表之前我们需要先切到具体的文件夹下进行创建表,否则创建的时候mysql不知道你要在哪个文件夹下创建文件就会报错,当然你也可以在创建的表前指定数据库名 select database(); 查看当前所在的库 #可以当前创建的表是在哪个表下进行创建的 增 create table t1(id int,name char); #创建表一定要指定字段的类型,而且字段不能为空,所有字段放在括号内,并用逗号隔开 create table db1.t1(id int,name char); #如果创建表时没有切换到指定的文件夹下,可以在表名前添加上库名即可 删 drop table t1; #删除表时直接指定删除的表名即可 改 alter table t1 add age int; #改是改变表的表结构,add是向表中添加新的字段,并指定字段的类型,不需要用括号 alter table t1 modify name char(15); #modify是修改表中字段的类型,但是不可以修改字段名 alter table t1 change name NAME char(15); #change和modify的区别是可以修改字段的名字,当然也可以修改字段的类型 alter table t1 drop age; #删除表中的某一个字段,一般没有删除字段的需求,因为这样会连同字段下的记录也会一同被删除
alter table department rename to dep; #对表名进行重新命名
查 show tables; #查看当前库下创建的所有表,查看出的表会显示在哪个库下的 show create table t1; #查看具体的某一个表的表机构但是该表结构看上去有点乱 desc t1; #也是查看表的表结构,但是比上面的方法查看的规整,当然我们也可以用describe t1;来进行查询表的表结构 文件内的一行行内容:记录 增 insert into t1(id,name) values #向表中插入记录,此时要指定要插入的表名,以及表的字段名,和要插入的字段对应的值,值用括号进行插入,每插入一组值用逗号隔开,最后一组用分号,表示此条语句的结束 (1,'egon'), (2,'lxx'), (3,'alex'); 删 delete from db1.t1 where id >= 2; #delete删除记录,要指定要删除哪个表下的记录,并指定条件,进行筛选出自己想要删除的记录,强调这种删除并不会变id值得结构,id并不会重新进行排序,因为如果表中的数据量很大,重新排序显然是不合理的 create table t2(id int primary key auto_incremnt,name char(15)); #创建表的时候一般我们将标的字段id设定成主键,主键的意思就是id不能为空且唯一,并将id设置成自增长,这样进行插入记录的时候就不需要在传入id的值了 insert into t2(name) values ('egon'), ('lxx'), ('wxx'), ('axx'); #向表中插入多条记录,要指定要插入记录的表,插入的多条记录要放在括号内,并且多条记录之间用逗号进行分隔开,最后一条记录以分号进行结束 清空表应该使用: truncate t2; #清空表不仅清空表中的内容,字段id下次再插入值是也是从1开始增长的,而不会像delete一样,下次插入会接着上次的id的值继续增长,当然字段名不会被删除的 改 update db1.t1 set name='lxx_dsb' where id=2; #update修改记录的值,set指定要修改字段名直接进行修改,后面可以跟要修改的约束条件,来修改我们想要修改具体的那条记录 查 select id from db1.t1; #指定要查看表中哪个字段下的记录 select id,name from t1; #我们也可以指定查看多个字段,查看多个字段下的内容 select name,id from t1; #查看多个字段我们可以调换字段的顺序,那么查看的结果也是按照我们查看字段的顺序进行排列,当然这种查看并不会改变我们原有存储时的顺序 select * from t1; #*代表的是查看所有的字段下的记录,会将指定的表下多有字段下的记录查询出来 select * from t1 where id >= 2; #当然我们还可以查询所有字段是加上约束条件,更精准的查询我们想要的记录
一、关于表的详细操作
一、创建表的完整语法
语法:
create table 库名.表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
); #当然如果我们切换到具体的库下,那么表名前面的库名就可以不用写了,但是创建表一定要指定表的字段名和字段的类型只是不可以省略的!
约束条件:是在数据类型之外对字段附加的额外的限制,当然这种约束条件就是可有可无的了,根据我们的需求而定
注意:
1、最后一个字段之后不能加逗号
2. 在同一张表中,字段名是不能相同
3. 宽度和约束条件可选,字段名和类型是必须的
二、MYSQL中的一些常用数据类型
1、整型:默认是有符号的(即插入的值可以是整数也可以是负数)
create table t3(x tinyint); #字段x的类型是tinyint,tinyint的存储宽的是1个字节,即8bit位,有符号存储范围是(-128,127),无符号存储范围是(0,256)
ps:修改sql_mode为严格模式,必须重启客户端才能生效
set global sql_mode="strict_trans_tables"; #将对表的操作修改成严格模式,这意味着之前有些操作之前不会报错,在严格模式下则会报错
select @@sql_mode; #将严格模式设置为全局模式
create table t4(x tinyint unsigned); #默认的是有符号的,我们加上unsigned,那么就是无符号的,即只能插入整数,如果我们插入的字段值为负数在严格模式下就会报错
强调:创建表时整型类型后面的宽度限制的根本不是存储宽度,限制的是显示宽度,如果我们存储的数字的宽度超过字段类型默认的宽度,不会报错,会以字典类型默认的最大值或最小值帮我们进行存储
create table t5(id int(1));
create table t6(id int(5));
验证:默认整型都是有符号的 create table t1(x tinyint); #默认是有符号的,不符合标准也能插进去,但是插入的是最大127,严格模式则会报错 insert into t1 values(128),(-129); create table t2(x tinyint unsigned); #改成无符号的即0---256 insert into t2 values(-1),(256); create table t3(x int unsigned); #4294967295 insert into t3 values(4294967296); #如果你存了一个超出字段类型允许的最大值,那么对不起我们可以接纳你,但是你只能按照我能允许的最大值进行存 create table t4(x int(12) unsigned); #整型类型限制的不是存储宽度,限制的是显示宽度,其他的数据类型限制的存储宽度 insert into t4 values(4294967296123); #对不起数大有什么用?不还得以我能存取的最大值为标准进行存
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok
2、浮点型:
float(255,30) #最多存255位整数,最多30位小数
double(255,30)
decimal(65,30) #最多65位整数,最多30位小数
那么他们三者的区别到底在哪呢?让我们一探究竟,其实他们的小数精度不一样,float----》double-----》decimal,存储时小数的精度是越来越高的,并不是像你想象的那样存的是什么样,查看的记过就是什么样子
create table t8(x float(255,30));
create table t9(x double(255,30));
create table t10(x decimal(65,30));
insert into t8 values(1.111111111111111111111111111111); #存储时小数进度最低
insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111); #存储时小数精度最高
当然在这笔者还要说一句,我们以后到底用哪一个呢?其实float已经够我们用了,毕竟我们不需去造核武器一类高精度的一些需求,老板发你工资你不会跟老板较劲说不行,发我的工资必须精确到小数点后30位,不是吗?
所以float已经够我们用的啦!
3、日期类型
在创建表时我们可以指定日期类型,一般有以下五种类型,我们可以根据需求选择用哪一种
year 1999
date 1999-11-11
time 08:30:00
datetime/timestamp 1999-11-11 08:30:00
用法其实也很简单,毕竟数据库的东西的都是死的,让我们一起来看看以下的演示实例吧
create table student( id int primary key auto_increment, name char(16), born_year year, birth date, class_time time, reg_time datetime ); #我创建了一个表把上面四种日期类型都用上了,让我们来看看插入记录后查看会是什么样的效果,当然效果就是我上面的格式了呀,哈哈哈 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing1',now(),now(),now(),now()); #看到没有我插入日期字段的值时,用的都是now(),那么我们查看就会按照我们创建表时指定的类型给我们显示出,当前的日期时间,这个很实用的,我想应用场景应该就不用我说了吧 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing1',2000,20001111,now(),now()); #当然我们还可以自己指定对应日期字段类型下的日期和时间,还可以和now()混用,是不是觉得用法很灵活,然而并没有什么乱用,难道就不能一心一意吗?嘿嘿不能 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing',2000,'2000-11-11',083000,now()); #我们还可以以加引号的形式按照我们之地当的形式进行存储,就是这么随意。下面两种类似我就不废话了 insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing',2000,'2000-11-11',"08:30:00",20171111111111); insert into student(name,born_year,birth,class_time,reg_time) values ('xingxing',2000,'2000-11-11',"08:30:00","2017-11-11 11:11:11"); create table t11(x timestamp); create table t12(x datetime not null default now());
4、字符类型
注意:宽度指限制的是字符个数,对是字符的个数,千万不要与整形混淆
char:定长
char(5)
varchar:变长
varchar(5)
相同点:宽度指的都是最大存储的字符个数,超过了都无法正常存储
不同点:
char(5):
'm'--->'m '5个字符 #看到没有存储的时候是以定长5个字符进行存储的,不够那不好意思,我用空格给你补齐5个,我还是要用5个字符进行存储
varchar(5)
'm'--->'m'1个字符 #对不起我不喜欢您,你来几个我就给你存几个,不够5个也休想让我帮你补全,谁让你可变的,对不起再见!
在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式即:
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
注意:mysql在查询时针对where 字段="值 "会忽略掉右面的空格,即where 字段="值"
如果时like模糊匹配就不会忽略右面的空格了
char(5)
egon |axx |lxx |fm |
varchar(5)
1bytes+egon|1bytes+axx|1bytes+lxx|1bytes+fm|
注意:
针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
但会在读出结果时自动去掉末尾的空格,因为末尾的空格在以下场景中是无用
mysql> select * from t14 where name="lxx"; # name字段明确地等于一个值,该值后填充空格是没有用
mysql> select * from t14 where name like "lxx"; # name字段模糊匹配一个值,该值后填充空格是有用的
mysql> select * from t14 where name like "lxx"; # name字段模糊匹配一个值,该值后填充空格是有用的
对比char与varchar,感兴趣的可以查看官网文档,在这我就不在赘述了
name char(5)
# 缺点:浪费空间
# 优点:存取速度都快
xing alex lxx wxx yx
name varchar(5)
# 缺点:存取速度都慢
# 优点:节省空间
(1bytes+xing)(1bytes+alex)(1bytes+lxx)
宽度相关练习
mysql> create table t13(x char(5)); Query OK, 0 rows affected (0.20 sec) mysql> create table t14(x varchar(5)); Query OK, 0 rows affected (0.27 sec) mysql> mysql> mysql> insert into t13 values('xxxxxx'); ERROR 1406 (22001): Data too long for column 'x' at row 1 mysql> insert into t14 values('xxxxxx'); ERROR 1406 (22001): Data too long for column 'x' at row 1
5、枚举与集合类型
枚举enum('a','b','c'):多选一
集合set('a','b','c'):多选多
create table emp( name varchar(15), sex enum('male','female','unkown'), #插入的值必须是其中的一个否则就会报错 hobbies set('read','music','yinshi','play') #可以同时给一个字段插入多个值,但是插入的值也必须钥匙我事先创建表时指定的,对就是这么娇气! ); insert into emp values ('zhangming','xxx','xxxx'); #不好意思此时的字段值不能随便插了,我已经指定了,那就请你按照我上面的规则来吧,谢谢啦,要不我就跟你急报错给你看,哼! mysql> insert into emp values('zhangming','female','read,play'); #看到了吧?这个人插入了我创建表时事先指定的值,哀家就允了他,哈哈! Query OK, 1 row affected (0.03 sec) mysql> select * from emp; +-----------+--------+-----------+ | name | sex | hobbies | +-----------+--------+-----------+ | zhangming | female | read,play | +-----------+--------+-----------+ 1 row in set (0.00 sec)
要完了,有点不舍,我在这还想说一句就是其实这个什么枚举呀,集合呀其实完全是可以被char或varchar替代的,无非就是我们在存之前在我们的程序中做一个判断而已,所以嘛想进后宫是有条件的不是每个人都可以呀,哈哈!