MySql基础(二)

作者: Android那些事儿 | 来源:发表于2017-07-05 16:33 被阅读0次

    文章摘要:
    1、级联查询、联表查询
    2、批处理
    3、用户变量在查询中的应用
    4、AUTO_INCREMENT及其注意事项


    1、级联、联表查询

    mysql> select pet1.主人,pet1.名字,pet1.性别,pet2.主人,pet2.名字,pet2.性别,pet1.种类
        -> from 宠物 as pet1,宠物 as pet2
        -> where pet1.种类 = pet2.种类 AND pet1.性别 = 'f' AND pet2.性别 = 'm';
    
    +--------+--------+--------+-----------+--------+--------+--------+
    | 主人   | 名字   | 性别   | 主人      | 名字   | 性别   | 种类   |
    +--------+--------+--------+-----------+--------+--------+--------+
    | Gwen   | Slim   | f      | 高大胖    | 旺财   | m      | cat    |
    | Gwen   | Chirpy | f      | Harold    | Fang   | m      | bird   |
    +--------+--------+--------+-----------+--------+--------+--------+
    2 rows in set (0.00 sec)
    

    3、批处理

    3.1、批处理就像如下命令,将一系列的sql语句,封装在字符串“”内。

    mysql> mysql -uroot -p -e "select User,Host from mysql.user;"
    Enter password: 
    
    +-----------+-----------+
    | User      | Host      |
    +-----------+-----------+
    | mysql.sys | localhost |
    | root      | localhost |
    +-----------+-----------+
    

    3.2、将批处理sql语句封装在txt文件内,执行批处理文件。-t 格式化输出 -v显示执行的sql语句。

    mysql> mysql -uroot -p </Users/ifei/my/Android那些事儿/宠物批处理.txt -t -v
    Enter password: 
    
    --------------
    show databases
    --------------
    
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test               |
    +--------------------+
    --------------
    select pet.名字,pet_event.事件类型,pet_event.评论  from test.宠物 as pet,test.宠物日志 as pet_event  where pet.id = pet_event.事件id AND pet.名字 = pet_event.名字
    --------------
    
    +--------+--------------+-----------------------------------+
    | 名字   | 事件类型     | 评论                              |
    +--------+--------------+-----------------------------------+
    | 大虎   | 生崽         | 5个小狗,4公1母                   |
    | 老笨   | 治疗         | 打狂犬疫苗                        |
    | Fang   | 生日         | 吃了顿大餐:厦门小黑虫            |
    | Chirpy | 鸟笼         | 换了新鸟笼                        |
    | Buffy  | 生日         | 吃了顿大餐:深圳小黑虫            |
    +--------+--------------+-----------------------------------+
    

    3.3、进入到mysql环境中,使用source或者“.”来执行。

    mysql> source /Users/ifei/宠物批处理.txt;
    
    批处理文件内容:
    select User,Host from mysql.user;
    select pet.名字,pet_event.事件类型,pet_event.评论  from test.宠物 as pet,test.宠物日志 as pet_event  where pet.id = pet_event.事件id AND pet.名字 = pet_event.名字;
    

    二、常用查询案例

    1、创建查询案例数据库

    create table shop(
    id int(4) unsigned zerofill default 0000 not null,
    item char(20) default ' ',
    price double(16,2) default '0.00' not null,
    primary key(id,item)
    );
    
    insert into shop values
    (1,'面包',2),(2,'泡面',5),(2,'挂面',8.25),(5,'雪糕',6),
    (8,'蒸包',9),(9,'海鲜粥',99.99);
    1、查询最大的类别号。
    mysql> select max(id) as 类别 from shop;
    +--------+
    | 类别   |
    +--------+
    |      9 |
    +--------+
    1 row in set (0.00 sec)
    

    2、找出最贵的商品详情

    mysql> select * from shop where price = (select max(price) as 类别 from shop);
    

    等同于

    mysql> select * from shop order by price desc limit 1;
    
    +------+-----------+-------+
    | id   | item      | price |
    +------+-----------+-------+
    | 0009 | 海鲜粥    | 99.99 |
    +------+-----------+-------+
    1 row in set (0.00 sec)
    

    3、用户变量在查询中的使用

    mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
    
    +------------------------+------------------------+
    | @min_price:=MIN(price) | @max_price:=MAX(price) |
    +------------------------+------------------------+
    |                   2.00 |                  99.99 |
    +------------------------+------------------------+
    1 row in set (0.00 sec)
    

    使用用户变量:

    mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
    
    +------+-----------+-------+
    | id   | item      | price |
    +------+-----------+-------+
    | 0001 | 面包      |  2.00 |
    | 0009 | 海鲜粥    | 99.99 |
    +------+-----------+-------+
    2 rows in set (0.00 sec)
    

    4、使用AUTO_INCREMENT

    4.1、可以通过AUTO_INCREMENT属性为新的行产生唯一的标识:

    CREATE TABLE person (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
        name CHAR(60) NOT NULL,
        PRIMARY KEY (id)
    );
    
    insert into person(name) values("Hieron9");
    

    4.2、如果表不含有AUTO_INCREMENT,可以通过如下方式添加:

    ALTER TABLE person
    CHANGE COLUMN `id` `id` INT AUTO_INCREMENT;
    

    4.3、可通过LAST_INSERT_ID()函数来获得最后一次的插入ID。

    4.4、修改起始ID,可通过如下方式:

    ALTER TABLE tbl AUTO_INCREMENT = 100;
    

    4.5、如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;

    4.6、如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。

    如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
    如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。

    就是说如果表中原本有AUTO_INCREMENT属性值连续为78、100的值,但100这个数据被删除了,下此再添加数据的时候自增值为101,100被重用了。
    即使在你将整个表中的所有数据delete清空后,之前的自增序列最大值还是会被重用。

    4.7、全表删除时,MySQL AUTO_INCREMENT会从1重新开始编号。

    4.8、AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复(即是主键或者主键的一部分,必须具备NOT NULL属性)。

    4.9、AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束.

    如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。

    5、LAST_INSERT_ID

    自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值.
    ``
    SELECT LAST_INSERT_ID();

    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    | 10 |
    +------------------+
    1 row in set (0.00 sec)

    注意:如果是批量插入,则,返回第一个插入的ID。

    相关文章

      网友评论

        本文标题:MySql基础(二)

        本文链接:https://www.haomeiwen.com/subject/fzgfhxtx.html