MYSQL指令集

1、create database 数据库名; 创建数据库;

2、show databases; 查看所有库;

3、use +库名; 选择具体数据库;

4、show tables; 查看当前库中所有表;

5、drop database 数据库名;删除数据库;

6、mysql中表、列可以改名,database不能改名;rename table oldname to newname;

7、drop table 表名;删除表;

8、truncate 表名; 清空表数据;(相当于删除再重建,得到一张全新表)

9、delete 表名; 删除表数据; (相当于橡皮擦除数据,如果全部清空,truncate速度更快些)

10、set names +编码种类; 

11、tee 目录; 将SQL语句和查询的结果输出到文件;

12、insert into 表名 (列1,列2,...) values (值1,值2,...); 如果不声明列名,则顺序插入所有列;

13、insert into 表名 (列1,列2,...) values (值1,值2,...),(值3,值4,...),(值5,值6,...);一次插入多行数据;
    insert into 表名 select 列1,列2,... from 表名;

14,、update 表名 set 表达式1(列1=值/列1=列1+值/...),表达式2(列2=值/列2=列2+值/...)  where 表达式(and/or);不加where,所有行的相应列都会执行set;只要where后的表达式为真,就会执行,若多行为真,就执行多行;

15、delete from 表名 where 表达式;从相应表中删除where表达式为真的行;

15、delete from 表名; 表中的所有数据均被删除;(表结构还在)

16、select * from 表名;取出所有所有行所有列;

17、select 列1,列2,... from 表名 where 表达式; 取出符合条件相应的行和列;

18、MYSQL三大列类型:

    整型:(一般而言N字节,0~2^8N-1,-2^(8N-1)~+2(8N-1)-1)((M):补0宽度,和zerofill配合才有意义,unsigned:无符号,zerofill:补0,必为且默认unsigned类型)

        tinyint:占据空间:1字节;存储范围:-128~127,0~255;
        smallint:占据空间:2字节;存储范围:0~65535,-32768~32767;
        mediumint:占据空间:3字节;
        int:占据空间:4字节;
        bigint:占据空间:8字节;
        
    浮点型:(M:精度,代表总位数,符号不占位数;D:标度,代表小数点右边位数)
        float(M,D)10^38.10^-38;如果M<=24,则占4个字节,否则8个字节;float精度有时会损失精度;
        decimal(M,D)整数和小数分开存储,变长类型,比float精确;
        
    字符型:
        char(M):M在0~255,M指的是字符数;定长类型;查找记录时,如果都是定长,完全可以通过行数与行的长度计算出来文件指针的偏移量;不足部分用空格补齐,取出再把右侧空格删除,所以内容最后有空格,将会被删除;定长速度快些;
        varcahr(M):M在0~65535,M指的是字符数;变长类型;不用空格补齐,但列内容前有1~2个字节来标志该列的长度;
        text:文本类型,一般用来储存文章内容、新闻内容等;
        mediumtext:更大的文本类型;
            blob:二进制类型,用来存储图像、音频等二进制信息;意义:防止因为字符集的问题导致信息丢失;

    日期/时间类型:
        date型:存储年-月-日;范围1000-01-01~9999-12-31;
        time型:00:00:00;
        datatime型:yyyy-mm-dd hh:ii:ss;

19、修改表语法:
    
    alter table 表名 add 列名 列类型 列参数; 增加列语句;
    alter table 表名 add 列名 列类型 列参数 after 某列;在某列后增加新列;
    alter table 表名 add 列名 列类型 列参数 first; 在第一列位置增加新列;

    alter table 表名 drop 列名; 删除某列;

    alter table 表名 modify 列名 列新类型 列新参数; 修改列的类型及参数;
    alter table 表名 change 旧列名 新列名 列新类型 列新参数; 修改列名、列类型及列参数;

20、查询语句:(查询模型:把列看成变量,where后面看成if里面的表达式,where后表达式为真,则会被查询取出;where查询中是对表发生的作用,不能对查询结果发生作用;对结果发生作用使用having)

    select * from 表名 where 列名!=值;不等于;
    select * from 表名 where 列名<>值; 不等于;
    select * from 表名 where 列名 in(元素1,元素2,...); 在这个集合中的元素满足;
    select * from 表名 where 列名 in(select 列名 from 某表);in()适合集合元素个数比外层表数据个数少的情况;
    select * from 表名 where 列名 between 值1 and 值2;符合值1~值2之间的条件(包括边界值);
    select * from 表名 where 列名 not in (元素1,元素2,...); 不在这个集合中的元素满足;
    select * from 表名 where 列名 like ‘某字段%’;模糊查询,以某字段开头的符合条件,%匹配的是任意字符,包括空字符;
    select * from 表名 where 列名 like ‘某字段_’;每个下划线可以匹配任意单个字符;
    select 列1,列2,(列1-列2) as 列名 from 表名 where 表达式;

    update 表名 set 列名=floor(列名/10)*10 where 表达式; floor(x)返回不大于x的最大整数;

21、select的5种子句之group与统计函数:max:最大值、min:最小值、sum:求和、avg:平均值、count:总行数;select-->where-->group by/列投影运算-->having-->order by-->limit;

    select max(列名/表达式) from 表名;
    select min(列名/表达式) from 表名;
    select sum(列名/表达式) from 表名;
    select avg(列名/表达式) from 表名;
    select count(*) from 表名; 查询输出共多少行,参数为*计算绝对行数,参数为列名计算该列不为null的行数;
    select sum(列名) from 表名 group by 某列名;以某列进行分组后,查询每组的结果;
    select 列名1,sum(列名2) from 表名; 对于SQL标准来说,这个语句是错误的,但是在MySQL中可以这么运行,列1是把第一次出现的值取出来;
    select 列名1,sum(列名2) from 表名 group by 列名1; 这个语句符合SQL标准,没有异议;    严格来讲,select后面的列只能在group by后面的列中选择,或者是统计函数;
    
    order by排序是针对最终结果集的;order by放在where/group by/having的后面;
    select 列名 from 表名 where 表达式 order by 某列名 desc/asc;按照某列进行降序/升序排列;默认升序排列;
    select 列名 from 表名 order by 列名1 asc,列名2 desc;首先按照列名1升序排列,其次按照列名2降序排列;

    limit [offset,]N:限制条目;(offset(可省略):偏移量,跳过的行数;N:条目,实际取出的行数)
    select 列名 from 表名 where 表达式 order by 某列名 asc/desc limit 偏移量,条目;

    子查询:
        where型子查询:指把内层查询结果作为外层查询的比较条件;
        如果where 列=(内层SQL),则内层SQL返回的必须是单行单列,单个值;
        如果where 列 in(内层SQL),则内层SQL返回单列,可以多行;

        from型子查询:把内层查询结果当成临时表,供外层SQL再次查询,子查询结果必须重命名;

        exists型子查询:把外层的查询结果拿到内层,看内层的查询是否成立,如果内层SQL成立,则将改行取出;
        select * from 表名1 where exists (select * from 表名2 where 表名1.列名1=表名2.列名2);exists()适合表名2比表名1数据大的情况;当表名1和表名2数据量一样大时,in与exists效率相近;
    为什么建表时,加not null default‘’/default 0;
    答:不想让表中出现null值;

     为什么不想要null值;
    答:不好比较,null是一种类型,比较时只能用专门的is null和is not null来比较;碰到运算符一律返回null;效率不要,影响提高索引效果;因此,我们往往在建表时not null default ‘’/0;

22、习题:
    问题:计算平均分低于60分科目在2科以上的学生平均分。
    建表语句:
        create table result (
        name varchar(20) default null,
        subject varchar(20) default null,
        score tinyint(40) default null
        )engine=myisam default charset=utf8;

        insert into result
        values
        ('张三','数学',90),
        ('张三','语文',50),
        ('张三','地理',40),
        ('李四','语文',55),
        ('李四','政治',45),
        ('王五','政治',30)
    表图:
    +--------+---------+-------+
     | name    | subject   | score  |
    +--------+---------+-------+
     | 张三      | 数学       |    90    |
     | 张三      | 语文       |    50    |
     | 张三      | 地理       |    40    |
     | 李四      | 语文       |    55    |
     | 李四      | 政治       |    45    |
     | 王五      | 政治       |    30    |
    +--------+---------+-------+

    答案:select name,avg(score),sum(score<60) as gk from result group by name having gk>=2;
    +--------+------------+------+
     | name    | avg(score)   | gk    |
    +--------+------------+------+
     | 张三      |    60.0000   |    2    |
     | 李四      |    50.0000   |    2    |
    +--------+------------+------+

23、笛卡尔积:
    
    两表做相乘,从行角度看,就是两表的每一行进行两两组合;从列的角度看,结果集中的列是两表的列名相加;
    select 列1,表1.列2,列3,表2.列4 ,... from 表1,表2; 表1和表2进行笛卡尔积运算的结果;结果集的行数是表1行数和表2行数的积,比价占内存;
    select 列1,表1.列2,列3,表2.列4 ,... from 表1,表2 where 表1.列2=表2.列4;

24、左连接的语法:

    假设A表在左不动,B表在A表右边滑动,A表与B表通过一个关系来筛选B表的行;
    A left join B on 条件; 条件为真,则B表对应的行取出; 形成的也是一个结果集,可以看成一张表,可以对其查询,A,B的列都可以查,自然where,group by, having,order by,limit可正常使用;
    (A left join B on 条件) left join D on条件;可以嵌套使用;
    select 列名1.列名2 from A left join B on 条件 where 条件; 
    
    左连接和右连接的区别:(左右连接是可以互换的,A right join B on 条件;等价于B left join A on 条件;)
    A left join B on 条件;A需要全部列出,B匹配到的才会列出;
    B right join A on 条件; A 需要全部列出,B匹配到的才会列出;

    内连接的特点:(交集)
        A inner join B on 条件;A和B同时满足条件的行列出;

    外连接:(并集)SQL server支持,但MySQL不支持;

25、union用法:
    合并2条或多条语句的结果,语法:SQL1 union SQL2;合并结果集;
    select 列名1 from 表名1 union select 列名2 as 列名1 from 表名1 order by 字段 asc/desc;类似于or作用;若列名不同,则以第一个SQL的为准;只要两个结果集的列的数量一致即可;order by可以对最终结果进行排序,最终影响结果集才会起作用;

    union对于重复行的处理(即某几行所有的列值相同):默认去重,若要保留重复行,则使用union all;

26、常用函数:

    length():计算字节数;
    char_length():计算字符数;
    reverse():反转字符串;
    position(‘substr’ in ‘string’):子串在字符串的位置;
    right(‘string’,length):截最右边的字符串;

    now():当前时间,返回datetime格式;
    curdate():返回日期,date格式;
    curtime():返回时间,time格式;
    dayofweek():某日是一周的第几天,dayofmonth()、dayofyear()同理;
    week(year):一年中的第几周;

    md5(‘string’):md5加密函数,不可逆的;

    select case 列名 when 某种可能值 then 返回值 when 另一种可能值 then 返回值 else 默认值 end from 表名;switch功能;
    if(表达式1,表达式2,表达式3):表达式1如果为真,则返回表达式2,否则取表达式3;
    ifnull(表达式1,表达式2,表达式3):表达式1如果为null,则返回表达式2,否则返回表达式3;
    
    user():返回用户及所在主机;
    database():返回正在操作的库名;
    version():返回数据库版本;

27、视图view:(1.视图可以简化我们的查询;2.更精细的权限控制;3.数据多,分表时可以用到)
    
    view可以看成是一张虚拟表,是表通过某种运算得到的一个投影;
    create view  视图名 as select 语句;
    视图的数据也是可以修改的,前提是视图的数据和表的数据一一对应,就像函数的映射;(表推出视图的数据,视图推出表的数据)
    视图并不是一个表,可以理解为SQL查询语句的存储复用;

    algorithm=merge:合并查询语句;
    algorithm=temptable:临时表;
    algorithm=undefined:未定义,由系统判断;
    create algorithm=merge 

28、声明字符集:

    set character_set_client=utf8/gbk;设置客户端字符集;
    set character_set_connection=utf8/gbk;设置连接器字符集;
    set character_set_result=utf8/gbk;设置返回的结果字符集;
    如果三者都是gbk,则可以set names gbk;
    server>=connection>=client;

29、MySQL引擎:(myisam:批量插入速率高,支持全文索引,表锁;innoDB:批量插入速率低,支持事务安全,行锁;BDB;memory;archive)

    engine 引擎就是mysql存储数据的不同方式;不变的是数据,变化的是存储格式;
    事务有4个属性:
        原子性:2步或n步操作逻辑上不可分割,要么都成功,要么都不成功;
        一致性:操作前后值得变化是一致的;
        隔离性:事务结束前,每一步的操作带来的影响别人看不见
        持久性:事务一旦完成,无法撤销;(只能再做一次补偿性事务)
    开启事务:start transaction SQL语句 commit(提交)/rolback(回滚);

猜你喜欢

转载自blog.csdn.net/weixin_44182586/article/details/100898735