zoukankan      html  css  js  c++  java
  • mysql命令具体解释

    首先创建一个简单的user表
    CREATE TABLE `user` (
    `id`  int NOT NULL AUTO_INCREMENT ,
    `name`  varchar(255) NULL ,
    `sex`  varchar(255) NULL ,
    `age`  int NULL ,
    `address`  varchar(255) NULL ,
    PRIMARY KEY (`id`)
    )
    ;
    然后插入数据
    insert into `user`(`name`,`sex`,`age`,`address`) values('张三','男',22,'北京') ;
    insert into `user`(`name`,`sex`,`age`,`address`) values('李四','男',12,'河北') ;
    insert into `user`(`name`,`sex`,`age`,`address`) values('王五','女',23,'江苏') ;
    insert into `user`(`name`,`sex`,`age`,`address`) values('赵六','男',21,'北京') ;


    1.改动某一个字段的名称(比如改动地址)
    alter table user modify address varchar(50) ;
    2.把user表中某些字段的值复制出来,变成另外一个表
    create table user2 as select id,name from user ;
    3.删除user表
    drop table user [restrict|cascade] ;
    4.创建表的时候加上外键约束
    constraint ID_FK  foreign key(id) references user2(id) ;
    改动表的外键关系
    alter table user add constraint ID_FK  foreign key(id) references user2(id) ;
    5.加入表的检查约束
    alter table user add constraint CHK_SEX check(sex = '男') ;
    alter table user add constraint CHK_SEX check(sex in ('男','女')) ;
    6.从还有一个表插入数据
    insert into user (name) select name from user2 ;


    事务是对数据库运行的一个操作单位。它是以逻辑顺序完毕的工作单元或工作序列,不管是用户手工操作,还是由程序进行的自己主动操作。
    控制事务的命令有3个
    COMMIT  ROLLBACK  SAVEPOINT
    首先把数据库默认的提交模式改变
    set autocommit=0 禁止自己主动提交
    set autocommit=1 开启自己主动提交


    我们要从表user里删除剩余的数据,在进行每次删除之前都使用savepoint命令,这样就能够在不论什么时候利用rollback命令
    回退到随意一个保存点,从而把适当的数据回复到原始状态。
    以下是一个事务处理的完整样例:
    **********************************
    mysql> set autocommit=
    0 ;
    Query OK, 0 rows affected


    mysql> delete from user where id=3 ;
    Query OK, 1 row affected
    mysql> select * from user ;
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  1 | 张三 | 男  |  22 | 北京    |
    |  2 | 李四 | 男  |  12 | 河北    |
    +----+------+-----+-----+---------+
    2 rows in set


    mysql> rollback ;
    Query OK, 0 rows affected


    mysql> select * from user ;
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  1 | 张三 | 男  |  22 | 北京    |
    |  2 | 李四 | 男  |  12 | 河北    |
    |  3 | 王五 | 女  |  23 | 江苏    |
    +----+------+-----+-----+---------+
    3 rows in set


    mysql> savepoint sp1 ;
    Query OK, 0 rows affected


    mysql> delete from user where id=2 ;
    Query OK, 1 row affected
    mysql> savepoint sp2 ;
    Query OK, 0 rows affected


    mysql> delete from user where id=3 ;
    Query OK, 1 row affected
    mysql> savepoint sp3 ;
    Query OK, 0 rows affected


    mysql> delete from user where id=1 ;
    Query OK, 0 rows affected
    mysql> select * from user ;
    Empty set


    mysql> rollback to sp1 ;
    Query OK, 0 rows affected


    mysql> select * from user ;
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  1 | 张三 | 男  |  22 | 北京    |
    |  2 | 李四 | 男  |  12 | 河北    |
    |  3 | 王五 | 女  |  23 | 江苏    |
    +----+------+-----+-----+---------+
    3 rows in set
    ************************************


    mysql> release savepoint sp1 ;
    Query OK, 0 rows affected
    这个命令用于删除创建的保存点。在某个保存点被释放之后,就不能再利用rollback命令来撤销这个保存点之后的
    事务操作了。利用这个命令能够避免意外的回退到某个不再须要的保存点。


    总结:commit用于把事务保存到数据库,rollback用于撤销已经运行了的事务,而savepoint用于把事务划分成组,
    让我们能够回退到事务过程中特定的逻辑位置。在执行大规模事务操作时,应该常常使用commit和rollback命令来保证
    数据库具有足够的剩余空间。另外还要记住,这些事务命令仅仅用于3个DML命令:insert、update和delete。


    查询语句
    select all name from user 和 select name from user 使用方法一样,都是从表里查询出字段名为name的全部值


    mysql> select distinct sex from user ;
    +-----+
    | sex |
    +-----+
    | 男  |
    | 女  |
    +-----+
    2 rows in set
    查询出不反复的字段值distinct。


    对查询出来的内容进行排序order by,默认是asc也就是升序。
    mysql> select * from user order by age
     ; 
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  2 | 李四 | 男  |  12 | 河北    |
    |  1 | 张三 | 男  |  22 | 北京    |
    |  3 | 王五 | 女  |  23 | 江苏    |
    +----+------+-----+-----+---------+
    3 rows in set


    mysql> select * from user order by age asc

    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  2 | 李四 | 男  |  12 | 河北    |
    |  1 | 张三 | 男  |  22 | 北京    |
    |  3 | 王五 | 女  |  23 | 江苏    |
    +----+------+-----+-----+---------+
    3 rows in set


    mysql> select * from user order by age de
    sc; 
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  3 | 王五 | 女  |  23 | 江苏    |
    |  1 | 张三 | 男  |  22 | 北京    |
    |  2 | 李四 | 男  |  12 | 河北    |
    +----+------+-----+-----+---------+
    3 rows in set


    排序还能够针对多个字段,也就是第一个指定的排序字段假设相等的话,比較第二个字段的值。以此类推。
    mysql> select * from user order by age ;
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  2 | 李四    | 男  |  12 | hebei   |
    |  1 | 张三    | 男  |  22 | beijing |
    |  3 | 王五    | 女  |  23 | jiangsu |
    |  4 | wuhaixu | nan |  23 | hunan   |
    +----+---------+-----+-----+---------+
    4 rows in set


    mysql> select * from user order by age,address ;
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  2 | 李四    | 男  |  12 | hebei   |
    |  1 | 张三    | 男  |  22 | beijing |
    |  4 | wuhaixu | nan |  23 | hunan   |
    |  3 | 王五    | 女  |  23 | jiangsu |
    +----+---------+-----+-----+---------+
    4 rows in set


    当然我们还能够用数字取代字段名,例如以下所看到的:整数1代表id,2代表name...


    mysql> select * from user order by 4
     ;
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  2 | 李四    | 男  |  12 | hebei   |
    |  1 | 张三    | 男  |  22 | beijing |
    |  3 | 王五    | 女  |  23 | jiangsu |
    |  4 | wuhaixu | nan |  23 | hunan   |
    +----+---------+-----+-----+---------+
    4 rows in set


    mysql> select * from user order by 4,5 ;
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  2 | 李四    | 男  |  12 | hebei   |
    |  1 | 张三    | 男  |  22 | beijing |
    |  4 | wuhaixu | nan |  23 | hunan   |
    |  3 | 王五    | 女  |  23 | jiangsu |
    +----+---------+-----+-----+---------+


    count函数的使用方法:
    mysql> select count(*) as '总数' from user ;
    +------+
    | 总数 |
    +------+
    |    4 |
    +------+
    1 row in set


    mysql> select count(distinct sex) as `总数` from user ;
    +------+
    | 总数 |
    +------+
    |    3 |
    +------+
    1 row in set


    逻辑操作符:is null、between、in、like、exists、unique、all和any
    mysql> select * from user where sex is null ;
    Empty set


    mysql> select * from user where age between 20 and 22;
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  1 | 张三 | 男  |  22 | beijing |
    +----+------+-----+-----+---------+
    1 row in set


    mysql> select * from user where age in(22,23);
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  1 | 张三    | 男  |  22 | beijing |
    |  3 | 王五    | 女  |  23 | jiangsu |
    |  4 | wuhaixu | nan |  23 | hunan   |
    +----+---------+-----+-----+---------+
    3 rows in set


    操作符like利用通配符把一个值与类似的值进行比較,下划线代表一个数字或字符,这些符号能够复合使用。
    百分号%代表零个、一个或多个字符,下划线代表一个数字或字符。这些符号能够复合使用。
    mysql> select * from user where address like '%i%';
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  1 | 张三 | 男  |  22 | beijing |
    |  2 | 李四 | 男  |  12 | hebei   |
    |  3 | 王五 | 女  |  23 | jiangsu |
    +----+------+-----+-----+---------+
    3 rows in set


    mysql> select * from user where address like '__i%';
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  1 | 张三 | 男  |  22 | beijing |
    +----+------+-----+-----+---------+
    1 row in set


    mysql> select * from user where exists (select id from user where age <40) ;
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  1 | 张三    | 男  |  22 | beijing |
    |  2 | 李四    | 男  |  12 | hebei   |
    |  3 | 王五    | 女  |  23 | jiangsu |
    |  4 | wuhaixu | nan |  23 | hunan   |
    +----+---------+-----+-----+---------+
    4 rows in set


    汇总函数:count、sun、max、min、avg
    mysql> select count(*
    ) from user ;
    +----------+
    | count(*) |
    +----------+
    |        5 |
    +----------+
    1 row in set
    count函数配合all使用时,不包括为空的字段。address有一条为空,所以count为4
    mysql> select count(all address) from user ;
    +--------------------+
    | count(all address) |
    +--------------------+
    |                  4 |
    +--------------------+
    1 row in set


    mysql> select count(distinct address) from user ;
    +-------------------------+
    | count(distinct address) |
    +-------------------------+
    |                       4 |
    +-------------------------+
    1 row in set


    mysql> select sum(age) from user ;
    +----------+
    | sum(age) |
    +----------+
    | 102      |
    +----------+
    1 row in set


    假设数据不能隐含地转化为数值类型,其结果就是0.以name为例:
    mysql> select sum(name) from user ;
    +-----------+
    | sum(name) |
    +-----------+
    |         0 |
    +-----------+
    1 row in set


    mysql> select avg(name) from user ;
    +-----------+
    | avg(name) |
    +-----------+
    |         0 |
    +-----------+
    1 row in set


    mysql> select avg(age) from user ;
    +----------+
    | avg(age) |
    +----------+
    | 20.4000  |
    +----------+
    1 row in set


    mysql> select max(age) from user ;
    +----------+
    | max(age) |
    +----------+
    |       23 |
    +----------+
    1 row in set


    mysql> select min(age) from user ;
    +----------+
    | min(age) |
    +----------+
    |       12 |
    +----------+
    1 row in set


    数据的排序与分组:
    mysql> select * from user group by age;
    +----+------+-----+-----+---------+
    | id | name | sex | age | address |
    +----+------+-----+-----+---------+
    |  2 | 李四 | 男  |  12 | hebei   |
    |  1 | 张三 | 男  |  22 | beijing |
    |  3 | 王五 | 女  |  23 | jiangsu |
    +----+------+-----+-----+---------+
    3 rows in set


    mysql> select * from user group by age,address;
    +----+---------+-----+-----+---------+
    | id | name    | sex | age | address |
    +----+---------+-----+-----+---------+
    |  2 | 李四    | 男  |  12 | hebei   |
    |  5 | aa      | nv  |  22 | NULL    |
    |  1 | 张三    | 男  |  22 | beijing |
    |  4 | wuhaixu | nan |  23 | hunan   |
    |  3 | 王五    | 女  |  23 | jiangsu |
    +----+---------+-----+-----+---------+
    5 rows in set
    上面的是先依据age进行分组,再对单个分组里的address内容进行分组。


    replace函数用于把某个字符或某个字符串替换为指定的一个字符(或多个字符)


    mysql> select address,replace(address,'ei','ab') from user ;
    +---------+----------------------------+
    | address | replace(address,'ei','ab') |
    +---------+----------------------------+
    | beijing | babjing                    |
    | hebei   | hebab                      |
    | jiangsu | jiangsu                    |
    | hunan   | hunan                      |
    | NULL    | NULL                       |
    +---------+----------------------------+
    5 rows in set


    upper函数能够把字符串里的小写字母转化为大写


    mysql> select upper(address) from user ;


    +----------------+
    | upper(address) |
    +----------------+
    | BEIJING        |
    | HEBEI          |
    | JIANGSU        |
    | HUNAN          |
    | NULL           |
    +----------------+
    5 rows in set


    lower把字符串里的大写字符转化为小写


    mysql> select lower
    (address) from user ;
    +----------------+
    | lower(address) |
    +----------------+
    | beijing        |
    | hebei          |
    | jiangsu        |
    | hunan          |
    | NULL           |
    +----------------+
    5 rows in set


    substr用来获取字符串子串的函数


    mysql> select address,substr(address,1,2) from user ;


    +---------+---------------------+
    | address | substr(address,1,2) |
    +---------+---------------------+
    | beijing | be                  |
    | hebei   | he                  |
    | jiangsu | ji                  |
    | hunan   | hu                  |
    | NULL    | NULL                |
    +---------+---------------------+
    5 rows in set


    选择函数,相当与oracle里的decode()
    mysql> select case address when 'beijing' then '北京' else '其它' end as '地址' from user ;
    +------+
    | 地址 |
    +------+
    | 北京 |
    | 其它 |
    | 其它 |
    | 其它 |
    | 其它 |
    +------+
    5 rows in set


    length函数用于得到字符串。数字、日期或表达式的长度,单位是字节。
    mysql> select address,length(address) as '长度' from user ;
    +---------+------+
    | address | 长度 |
    +---------+------+
    | beijing |    7 |
    | hebei   |    5 |
    | jiangsu |    7 |
    | hunan   |    5 |
    | NULL    | NULL |
    +---------+------+
    5 rows in set


    lpad函数用于在字符串左側加入字符或空格。


    mysql> select address,lpad(address,30,'.') from user ;


    +---------+--------------------------------+
    | address | lpad(address,30,'.')           |
    +---------+--------------------------------+
    | beijing | .......................beijing |
    | hebei   | .........................hebei |
    | jiangsu | .......................jiangsu |
    | hunan   | .........................hunan |
    | NULL    | NULL                           |
    +---------+--------------------------------+
    5 rows in set


    rpad函数在字符串右側加入字符或空格


    mysql> select address,rpad(address,30,'.') from user ;
    +---------+--------------------------------+
    | address | rpad(address,30,'.')           |
    +---------+--------------------------------+
    | beijing | beijing....................... |
    | hebei   | hebei......................... |
    | jiangsu | jiangsu....................... |
    | hunan   | hunan......................... |
    | NULL    | NULL                           |
    +---------+--------------------------------+
    5 rows in set


    ASCII函数返回字符串最左側的‘美国信息交换标准码’。


    mysql> select ascii('a') ;
    +------------+
    | ascii('a') |
    +------------+
    |         97 |
    +------------+
    1 row in set


    mysql> select ascii('A') ;
    +------------+
    | ascii('A') |
    +------------+
    |         65 |
    +------------+
    1 row in set


    最常见的算数函数有:绝对值(ABS)、舍入(ROUND)、平方根(SQRT)、符号(SIGN)、幂(POWER)、上限和下限(CEIL、FLOOR)、指数(EXP)、SIN、COS、TAN


    日期和时间存储的标准SQL数据类型有3种:
    date:直接存储日期。date的格式是YYYY-MM-DD,范围是从0001-01-01到9999-12-31
    time:直接存储时间。time的格式是HH:MI:SS.nn...,范围是从00:00:00...到23:59:61.999...
    timestamp:直接存储日期和时间。timestamp的格式是YYYY-MM-DD HH:Mi:SS.nn...,范围是从0001-01-01 00:00:00...到9999-12-31 23:59:61.999...


    mysql中使用now()来获取当前时间


    mysql> select now() ;
    +---------------------+
    | now()               |
    +---------------------+
    | 2014-07-07 14:51:56 |
    +---------------------+

    1 row in set


    首先创建一个简单的user表
    CREATE TABLE `user` (
    `id`  int NOT NULL AUTO_INCREMENT ,
    `name`  varchar(255) NULL ,
    `sex`  varchar(255) NULL ,
    `age`  int NULL ,
    `address`  varchar(255) NULL ,
    PRIMARY KEY (`id`)
    )
    ;
    然后插入数据
    insert into `user`(`name`,`sex`,`age`,`address`) values('张三','男',22,'北京') ;
    insert into `user`(`name`,`sex`,`age`,`address`) values('李四','男',12,'河北') ;
    insert into `user`(`name`,`sex`,`age`,`address`) values('王五','女',23,'江苏') ;
    insert into `user`(`name`,`sex`,`age`,`address`) values('赵六','男',21,'北京') ;


    创建一张与user表关联的表
    CREATE TABLE `teacher` (
    `id`  int NOT NULL AUTO_INCREMENT ,
    `name`  varchar(255) NULL ,
    `stu_id` int NOT NULL ,
    PRIMARY KEY (`id`),
    constraint ID_FK foreign key(stu_id) references user(id)
    )
    ;
    insert into `teacher`(name,stu_id) values('张老师',1) ;
    insert into `teacher`(name,stu_id) values('王老师',4) ;
    insert into `teacher`(name,stu_id) values('吴老师',2) ;
    insert into `teacher`(name,stu_id) values('方老师',2) ;
    insert into `teacher`(name,stu_id) values('林老师',3) ;


    等值结合:
    mysql> select t.name,u.name from user u,teacher t where u.id=t.stu_id ;
    +--------+---------+
    | name   | name    |
    +--------+---------+
    | 张老师 | 张三    |
    | 吴老师 | 李四    |
    | 方老师 | 李四    |
    | 林老师 | 王五    |
    | 王老师 | wuhaixu |
    +--------+---------+
    5 rows in set


    mysql> select t.name,u.name from teacher t inner join user u on t.stu_id = u.id ;
    +--------+---------+
    | name   | name    |
    +--------+---------+
    | 张老师 | 张三    |
    | 吴老师 | 李四    |
    | 方老师 | 李四    |
    | 林老师 | 王五    |
    | 王老师 | wuhaixu |
    +--------+---------+
    5 rows in set
    在这样的方式里,where子句里的结合操作符被去掉了,取而代之的是keywordinner join。要被结合的表位于join之后,而结合操作符位于keywordon之后。
    上面还使用了表的别名


    union操作符能够组合两个或多个select语句的结果,不包括反复的记录。假设某行的输出存在于一个查询结果里,那么其它查询结果同一行的记录就不会
    再输出了。在使用union操作符时,每一个select语句里必须选择相同数量的字段、相同数量的字段表达式、相同的数据类型、相同的次序--但长须不必一样。



    mysql> select id from user 
        -> union
        -> select id from teacher ;
    +----+
    | id |
    +----+
    |  1 |
    |  2 |
    |  3 |
    |  4 |
    |  5 |
    +----+
    5 rows in set


    union all操作符能够组合两个select语句的结果,而且包涵反复的结果。其使用规则与union一样,它与union基本上是一样的,仅仅是一个返回反复的结果,一个不返回。


    mysql> select id from user 
        -> union all
        -> select id from teacher ;
    +----+
    | id |
    +----+
    |  1 |
    |  2 |
    |  3 |
    |  4 |
    |  1 |
    |  3 |
    |  4 |
    |  5 |
    |  2 |
    +----+
    9 rows in set


    索引是怎样工作的呢?索引在创建之后,用于记录与杯索引字段相关联的位置值。当表里加入新数据时,索引里也会加入新项,当数据库运行查询,并且where条件里指定的字段已经设置了
    索引时,数据库会首先在索引里搜索where子句里指定的值。假设在索引里找到了这个值,索引就能够返回被搜索数据在表里的实际位置。


    创建单字段索引:
    create index index_id on user(id) ;
    创建唯一索引:
    create unique index index_id on user(id) ;
    组合索引是基于一个表里两个或多个字段的索引。在创建组合索引时,我们要考虑性能的问题,由于字段在索引里的次序对数据检索速度有非常大的影响。一般来说,最具有限制的值应该排在前面,
    从而得到最好的性能。可是,总是会在查询里指定的字段应该放在首位。
    create index index_name on table_name (column1,column2) ;
    隐含索引是数据库服务程序在创建对象时自己主动创建的。比方,数据库会为主键约束和唯一性约束自己主动创建索引。
    什么时候选择用索引呢?唯一索引隐含地与主键共同实现主键的功能。外键经经常使用于与父表的结合,所以也适合设置索引。一般来说,大多数用于表结合的字段都应该设置索引。
    常常在order by和group by里引用的字段也应该考虑设置索引。
    何时应该避免使用索引?1、索引不应该用于小规模的表。2、当字段用于where子句做为过滤器会返回表里的大部分记录时,该字段就不适合设置索引。举例来说,图书里的索引不会
    包含像the或and这种单词。3、常常会被批量更新的表能够具有索引,但批量操作的性能会因为索引而减少。对于常常会被载入或批量操作的表来说,能够在运行批量操作之前去掉索引,
    在完毕操作之后再又一次创建索引,这是由于当表里插入数据时,索引也会杯更新,从而添加了额外的开销。4、不应该对包涵大量null值的字段设置索引。索引对在不同记录中包涵不同数据
    的字段特别有效,字段中过多的null值会严重影响索引的执行效率。5、常常被操作的字段不应该设置索引,由于对索引的维护会变得非常繁重。


    改动索引alter index INDEX_NAME
    删除索引drop index index_name on table_name


    我们应该对仅仅包括非常少不同值的字段创建索引,比方性别、州名等。
    在读取大规模的表时,应该避免进行全表扫描。举例来说,当读取没有索引的表时,就会发生全表扫描,这一般会须要较长的时间才干返回数据。对于大多数大型表来说,应该考虑设置索引。
    以下是应该被索引的数据;
      1、做为主键的字段
      2、做为外键的字段
      3、在结合表里常常使用的字段
      4、常常在查询里做为条件的字段
      5、大部分是唯一值的字段
    在调整sql语句里还有其它一些性能考虑:
      1、使用like操作符和通配符
      2、避免or操作符
      3、避免having子句。
      4、避免大规模排序操作
      5、使用存储过程
      6、在批载入时关闭索引


    1、使用like操作符


    mysql> select address from user where address like '%jing' ;
    +---------+
    | address |
    +---------+
    | beijing |
    +---------+
    1 row in set


    mysql> select address from user where address like '___
    jing' ;
    +---------+
    | address |
    +---------+
    | beijing |
    +---------+
    1 row in set


  • 相关阅读:
    Python mutilprocessing Processing 父子进程共享文件对象?
    BZOJ4836: [Lydsy1704月赛]二元运算
    博弈论刷题记录
    manacher(无讲解)
    UOJ_407_【IOI2018】狼人
    BZOJ_3935_Rbtree
    dsu on tree(无讲解)
    BZOJ_3744_Gty的妹子序列
    后缀数组(无讲解)
    虚树(无讲解)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4031479.html
Copyright © 2011-2022 走看看