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















  • 相关阅读:
    MQ 2035(MQRC_NOT_AUTHORIZED)
    C# 构造函数中调用虚方法的问题
    Oracle bug 使用max或min函数into到一个char类型报字符缓冲区太小的错误
    windows2003 64位 iis6.0 运行32位web应用程序
    .NET安装和配置Oracle数据访问组件(ODAC)
    WMS函数组:10.创建采购订单
    报表:BOM展开程序
    WMS函数组:9.交货单过帐3(BDC)
    WMS函数组: 7.交货单行项目除
    WMS函数组:1.检查ZPB2是否存在
  • 原文地址:https://www.cnblogs.com/sui776265233/p/9338373.html
Copyright © 2020-2023  润新知