SQL语句的基本操作

一、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替代的,无非就是我们在存之前在我们的程序中做一个判断而已,所以嘛想进后宫是有条件的不是每个人都可以呀,哈哈!















原文地址:https://www.cnblogs.com/sui776265233/p/9338373.html