zoukankan      html  css  js  c++  java
  • MySQL必知必会--学习笔记.txt

    #具体例子网页
    https://www.cnblogs.com/alex3714/articles/5950372.html
    http://www.cnblogs.com/wupeiqi/articles/5713323.html
    =======================================SHOW====================================================
    show columns from role;   
    desc role;

    SHOW STATUS,用于显示广泛的服务器状态信息;

    SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;

    SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;

    SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息。


    ==================================SELECT=============================================
    DISTINCT关键字(除重)
    SELECT DISTINCT role_id FROM role;

    LIMIT 5指示MySQL返回 不多于5行   (LIMIT 3,4 意思是从行3开始的4 行)
    SELECT DISTINCT role_id FROM role LIMIT 5;
    SELECT role_id,role_name,sex FROM role order by role_id DESC LIMIT 1;

    #排序
    SELECT role_id,role_name,sex FROM role order by role_id;

    #下面两条语句执行结果一样
    SELECT role_id,role_name,sex FROM role order by 1,2;
    SELECT role_id,role_name,sex FROM role order by role_id,role_name;

    #降序排序
    SELECT role_id,role_name,sex FROM role order by role_id DESC;

    SELECT role_id,role_name,sex FROM role order by role_id DESC, role_name;

    =============================WHERE=========================================================
    #使用WHERE子句
    SELECT role_id,role_name FROM role WHERE role_id = 9437185;
     
    操作符     说  明
     =          等于
     <>         不等于
     !=         不等于
     <          小于
     <=         小于等于
     >          大于
     >=         大于等于
     BETWEEN     在指定的两个值之间

    SELECT role_id,role_name FROM role WHERE role_id BETWEEN 9437185 AND 9437285;

    #空值检查
    SELECT role_id FROM role WHERE role_name IS NULL;

    SELECT role_id,role_name FROM role WHERE role_id = 9437185 AND role_name = "莉诺卡娜";

    SELECT role_id,role_name FROM role WHERE role_id = 9437185 or role_id = 9437285;

    SELECT role_id,role_name FROM role WHERE (role_id = 9437185 or role_id = 9437285)  AND role_name = "莉诺卡娜";

    #IN操作符
    SELECT role_id,role_name FROM role WHERE role_id IN (9437185,9437285) ORDER BY role_name;
     
    SELECT role_id,role_name FROM role WHERE role_id NOT IN (9437185,9437285) ORDER BY role_name;
     
     
    # LIKE操作符 (%通配符可以匹配任何东西,但有一个例 外,即NULL。)

    SELECT role_id,role_name FROM role WHERE role_id LIKE '%4371%';

    SELECT role_id,role_name FROM role WHERE role_id LIKE '9%5';
     
    #下划线(_)通配符  下划线的用途与%一样,但下划 线只匹配单个字符而不是多个字符。
    _ 总是匹配一个字符,不能多也不能少
     
     
    ==============================使用MySQL正则表达式============================================
    SELECT role_id,role_name FROM role WHERE role_id REGEXP '^000$';
    SELECT role_id,role_name FROM role WHERE role_id LIKE '000';
    #以上两条SQL语句,是等同的
     
    SELECT role_id,role_name FROM role WHERE role_id REGEXP '000';

    SELECT role_id,role_name FROM role WHERE role_id REGEXP '.000';

    SELECT role_id,role_name FROM role WHERE role_id REGEXP '1000|2000';

    SELECT role_id,role_name FROM role WHERE role_id REGEXP '[123] 000'  #[123]定义一组字符,它 的意思是匹配1或2或3

    #匹配1到5
    SELECT role_id,role_name FROM role WHERE role_id REGEXP '[1-5] 000'
     
    #为了匹配特殊字符,必须用\为前导。\-表示查找-,\.表示查找.
    SELECT role_id,role_name FROM role WHERE role_id REGEXP '\.' ORDER BY role_name;
     
    元字符    说明
    \f       换页
    \n       换行
    \r       回车
    \t       制表
    \v       纵向制表
     
    #匹配字符类
    类              说  明
    [:alnum:]       任意字母和数字(同[a-zA-Z0-9])
    [:alpha:]       任意字符(同[a-zA-Z])
    [:blank:]       空格和制表(同[\t])
    [:cntrl:]       ASCII控制字符(ASCII 0到31和127)
    [:digit:]       任意数字(同[0-9])
    [:graph:]       与[:print:]相同,但不包括空格
    [:lower:]       任意小写字母(同[a-z])
    [:print:]       任意可打印字符
    [:punct:]       既不在[:alnum:]又不在[:cntrl:]中的任意字符
    [:space:]       包括空格在内的任意空白字符(同[\f\n\r\t\v]) [:upper:] 任意大写字母(同[A-Z])
    [:xdigit:]      任意十六进制数字(同[a-fA-F0-9])
     

    #匹配多个实例

    元字符  说  明
    *       0个或多个匹配
    +       1个或多个匹配(等于{1,})
    ?       0个或1个匹配(等于{0,1})
    {n}     指定数目的匹配
    {n,}    不少于指定数目的匹配
    {n,m}   匹配数目的范围(m不超过255)
            
    #sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出 现)
    SELECT role_id,role_name FROM role WHERE role_id REGEXP '\([0-9] sticks?\)' ORDER BY role_name;
    +---------------+
    | role_id       |
    +---------------+
    | TNT (1 stick) |
    | TNT (1 sticks)|
    +---------------+

    #[[:digit:]]{4}匹配连在一起的任意4位数字
    SELECT role_id,role_name FROM role WHERE role_id REGEXP '[[:digit:]]{4}' ORDER BY role_name;


    #拼接(concatenate) 将值联结到一起构成单个值

    SELECT Concat(role_id,'(',role_name,')') FROM role ORDER BY role_id LIMIT 3;
    +-----------------------------------+
    | Concat(role_id,'(',role_name,')') |
    +-----------------------------------+
    | 9437185(莉诺卡娜)                 |
    | 9437186(安弗雷德)                 |
    | 9437187(镇哥)                     |
    +-----------------------------------+

    #Trim函数  MySQL除了支持RTrim()(正如刚才所见,它去掉 串右边的空格),还支持LTrim()(去掉串左边的空格)以及 Trim()(去掉串左右两边的空格)
    #别名用AS关键字赋予
    SELECT Concat(RTrim(role_id),'(',RTrim(role_name),')') AS id_name FROM role ORDER BY role_id LIMIT 3;
    +-----------------------+
    | id_name               |
    +-----------------------+
    | 9437185(莉诺卡娜)     |
    | 9437186(安弗雷德)     |
    | 9437187(镇哥)         |
    +-----------------------+


    #执行算术计算
    SELECT  prod_id,
            quantity,
            item_price,
            quantity*item_price AS expanded_price
    FROM orderitems
    WHERE order_num = 20005;    

    操作符  说明
    +       加
    -       减
    *       乘
    /       除



    ======================SQL聚集函数================

    函数       说明
    AVG()      返回某列的平均值
    COUNT()    返回某列的行数
    MAX()      返回某列的最大值
    MIN()      返回某列的最小值
    SUM()      返回某列值之和

    SELECT AVG(prod_price) AS avg_price FROM customers ;
    SELECT AVG(prod_price) AS avg_price FROM customers WHERE vend_id = 1003;
    SELECT Sum(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;


    SELECT COUNT(*) AS num_items,
        MIN(prod_price) AS price_min,
        MAX(prod_price) AS price_max,
        AVG(prod_price) AS price_avg,
    FROM products;

        

    #分 组 数 据

    SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;

    WHERE过滤行,而HAVING过滤分组
    SELECT cust_id,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;

    SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;

    SELECT order_num,SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >= 50;
     
    SELECT order_num,SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >= 50 ORDER BY ordertotal;



    #利用子查询进行过滤

    #一个子查询
    SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'INT2');
    #两个子查询
    SELECT  cust_name,cust_contact FROM  customers WHERE cust_id  IN  (SELECT  cust_id FROM orders WHERE  order_num  IN   (SELECT  order_num FROM orderitems WHERE  prod_id  ='TNT2'));

    SELECT cust_name,cust_state,(SELECT COUNT(*) FROM orders WHERE order.cust_id = customers,cust_id) AS orders FROM customers ORDER BY cust_name;
    语句告诉SQL比较orders表中的cust_id与当前正从customers表中检索的cust_id:        
    order.cust_id = customers,cust_id


    #联 结 表 (主键 和 外键)
    SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name,prod_name;



    #内部联结 ( INNER JOIN语法 )
    SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
        
    #联结多个表
    SELECT cust_name,cust_contact FROM customers
        WHERE cust_id IN (SELECT  cust_idFROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id ='TNT2'));
        
    #自联结
    SELECT prod_id,prod_name FROM products WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id = 'DTNTR');


    #外部联结
     


    ============================创建组合查询==========================================
    可用UNION操作符来组合数条SQL查询。利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集.

    #使用UNION(去重复)

    SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price <= 5
    UNION
    SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);

    #使用UNION(全部输出)
    SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price <= 5
    UNION ALL
    SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);
        
    #使用UNION后,排序    
    SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price <= 5
    UNION
    SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);
    ORDER BY vend_id,prod_price;    
        
        
        
    ====================================================理解全文本搜索=================================
    #创建一个表(MySQL根据子句FULLTEXT(note_text)的指示对它进行索引)
    CREATE TABLE productnotes
    (
        note_id int NOT NULL AUTO_INCREMENT,
        prod_id char(10) NOT NULL ,
        note_date datetime NOT NULL,
        note_text text NULL,
        PRIMARY KEY(note_id),
        FULLTEXT(note_text)
    ) ENGINE=MyISAM;    
        
        
    #进行全文本搜索    
    在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。    
    SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');    
        
    #事实是刚才的搜索可以简单地用LIKE子句完成
    SELECT note_text FROM productnotes WHERE note_text LIKE '%rabbit%';
        
    #布尔文本搜索    
    SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit' IN BOOLEAN MODE);
        
    布尔操作符     说明
    +           包含,词必须存在
    -           排除,词必须不出现
    >           包含,而且增加等级值
    <           包含,且减少等级值
    ()          把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
    ~           取消一个词的排序值
    *           词尾的通配符
    ""          定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)    
        
    如前所述,仅在MyISAM数据库引擎中支持全文本搜索。    
        
        
        
    ========================================插 入 数 据=================================================    
    CREATE TABLE productnotes
    (
        note_id int NOT NULL AUTO_INCREMENT,
        prod_id char(10) NOT NULL ,
        note_date datetime NOT NULL,
        note_text text NULL,
        PRIMARY KEY(note_id),
        FULLTEXT(note_text)
    ) ENGINE=MyISAM;

    INSERT INTO productnotes VALUES('1','0001','2018-01-02','HLS'),('2','0002','2018-01-01','HC');



    =====================================更新数据====================================================
    #不要省略WHERE子句 在使用UPDATE时一定要注意细心。因为稍不注意,就会更新表中所有行 (上天的节奏)
    UPDATE customers SET cust_email = 'hls@163.com' WHERE cust_id = 1005;

    #更新多个列数据
    UPDATE customers SET cust_name = 'hls',cust_email = 'hls@163.com' WHERE cust_id = 1005;

    #为了删除某个列的值,可设置它为NULL(假如表定义允许NULL值)。
    UPDATE customers SET cust_email = NULL WHERE cust_id = 1005;



    =======================================删除数据=================================================
    #(上天的节奏)  如果省略WHERE子句,它将删除表中每个客户。
    DELETE FROM customers WHERE cust_id = 10005;


    1、如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)
    2、在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确
    3、除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
    4、保证每个表都有主键




    主键自增:
    CREATE TABLE   test
    (
        id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(15) NOT NULL
    ) AUTO_INCREMENT = 100;

    可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

    #真实生成的建表
    Create Table: CREATE TABLE `role` (
      `role_inc_id` bigint(20) NOT NULL AUTO_INCREMENT,
      `role_id` int(11) NOT NULL DEFAULT '0',
      `role_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
      `avatar` tinyint(4) NOT NULL DEFAULT '0',
      `sex` tinyint(4) NOT NULL DEFAULT '0',
      `scene_id` int(11) NOT NULL DEFAULT '0',
      `last_scene_id` int(11) NOT NULL DEFAULT '0',
      `level` int(11) NOT NULL DEFAULT '0',
      `professional` int(11) NOT NULL DEFAULT '0',
      `create_time` bigint(20) NOT NULL DEFAULT '0',
      `online_time` int(11) NOT NULL DEFAULT '0',
      `is_online` tinyint(4) NOT NULL DEFAULT '0',
      `last_save_time` bigint(20) NOT NULL DEFAULT '0',
      `country` tinyint(4) NOT NULL DEFAULT '0',
      `is_chongzhi` tinyint(4) NOT NULL DEFAULT '0',
      `is_micro_pc` tinyint(4) NOT NULL DEFAULT '0',
      `plat_spid` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`role_inc_id`),
      KEY `role_name_INX` (`role_name`) USING BTREE,
      KEY `ROLE_ID_INX` (`role_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8

    #CHARACTER SET utf8 COLLATE utf8_bin
    (字符集(CHARACTER SET)和校对集(COLLATE))
    mysql>show collation;

    #USING BTREE  (索引结构)

    #如果你仅想在一个表不存在时创建它,应该在表名后给出IFNOT EXISTS


    ==================================修改表结构===========================
    为了使用ALTER TABLE更改表结构,必须给出下面的信息:
    1、在ALTER TABLE之后给出要更改的表名(该表必须存在,否则将出错)
    2、所做更改的列表

    #给表添加一个列
    ALTER TABLES vendors ADD vend_phone CHAR(20);

    #删除刚刚添加的列
    ALTER TABLES vendors DROP COLUMN vend_phone;

    MySQL修改字段类型的命令是:
    mysql> alter table 表名 modify column 字段名 类型;

    特别留意:
    小心使用ALTER TABLE 使用ALTER TABLE要极为小心,应该在进行改动前做一个完整的备份(模式和数据的备份)。数据
    库表的更改不能撤销,如果增加了不需要的列,可能不能删除它们。类似地,如果删除了不应该删除的列,可能会丢失
    该列中的所有数据



    ==============================删除表============================
    DROP TABLE customers2;


    ==============================重命名表============================
    #单表重命名
    RENAME TABLE customers2 TO customers;

    #对多个表重命名
    RENAME TABLE customers1 TO customers1_backup,
                 customers2 TO customers2_backup,
                 customers3 TO customers3_backup;        



    =================================使 用 视 图====================================
    1、视图用CREATE VIEW语句来创建。
    2、使用SHOW CREATE VIEW viewname;来查看创建视图的语句
    3、用DROP删除视图,其语法为DROP VIEW viewname;。
    4、更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创
    建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。




    ======================================使用存储过程======================================================
    简单、安全、高性能








    ===========================================字符集和校对顺序==============================================================
    show character set;
    show variables like 'character%';
    show variables like 'collation%';



    ======================================行数据库维护========================
    #ANALYZE TABLE,用来检查表键是否正确。
    mysql> check table role;
    +-------------+-------+----------+----------+
    | Table       | Op    | Msg_type | Msg_text |
    +-------------+-------+----------+----------+
    | xy7_s9.role | check | status   | OK       |
    +-------------+-------+----------+----------+

    #CHECK TABLE用来针对许多问题对表进行检查
    mysql> analyze table role;
    +-------------+---------+----------+----------+
    | Table       | Op      | Msg_type | Msg_text |
    +-------------+---------+----------+----------+
    | xy7_s9.role | analyze | status   | OK       |
    +-------------+---------+----------+----------+

  • 相关阅读:
    NYOJ458
    NYOJ67
    NYOJ105
    NYOJ1071
    NYOJ463
    C语言练字用小软件 — Practise_Calligraphy_1.0(ANSI)
    NYOJ276
    NYOJ455
    NYOJ74
    Jzoj4458 密钥破解——Pollard-rho
  • 原文地址:https://www.cnblogs.com/huanglinsheng/p/10030661.html
Copyright © 2011-2022 走看看