MySql筆記

一、數據庫基礎操做語句mysql

  連接數據庫:mysql -u root -p 123456;正則表達式

  選擇數據庫:USE database_name;算法

  顯示能夠數據庫:SHOW DATABASES;sql

  顯示數據庫全部表:SHOW TABLES;數據庫

  顯示錶的列:SHOW COLUMNS FROM table_name;安全

二、檢索數據服務器

  檢索單個列:SELECT prod_name FROM table_name;函數

  檢索多個列:SELECT prod_id,prod_name,prod_price FROM table_name;spa

  檢索全部列:SELECT * FROM table_name;orm

  檢索不一樣的行:SELECT DISTINCT prod_id FROM table_name;

  如今結果:SELECT prod_name FROM table_name LIMIT 5; 至多返回前5行

       SELECT prod_name FROM table_name LIMIT 5,5; 返回從5行開始的5行

  使用徹底限定的表面:SELECT products.prod_nam FROM products;

三、排序檢索數據

  排序數據:SELECT prod_name FROM products ORDER BY prod_name;

  按多個列排序:SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;

  指定排序方向:SELECT prod_name FROM products ORDER BY prod_name DESC; 默認升序排序,DESC降序排序

         SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC,prod_name;

四、過濾數據

  使用WHERE字句:SELECT prod_name FROM products WHERE prod_price = 2.5;

  WHERE字句操做符:=  <>(不等於) !=   <   >  <=  >=  BETWEEN

  範圍值檢查:SELECT prod_name FROM products WHERE prod_price BETWEEN 5 AND 10;

  空值檢查:SELECT prod_name FROM products WHERE prod_price IS NULL;

五、數據過濾

  AND操做符:SELECT prod_name FROM products WHERE prod_price < 10 AND prod_id = 100;

  OR操做符:SELECT prod_name FROM products WHERE prod_price = 10 OR prod_price = 20;

  IN操做符:SELECT prod_name FROM products WHERE prod_price IN (10,20,30);

  NOT操做符:SELECT prod_name FROM products WHERE prod_price NOT IN (10,20,30);

六、用通配符進行過濾

  百分號(%)通配符:SELECT prod_name FROM products WHERE prod_name LIKE '%jet%';  %匹配任何個數字符

  下滑先(_)通配符:SELECT prod_name FROM products WHERE prod_name LIKE '_ ton anvil';  _匹配一個字符

七、用正則表達式進行搜索

  基本字符匹配:SELECT prod_name FROM products WHERE prod_name REGEXP '1000';

  正則特殊字符:.(任意匹配一個字符) |(或) []   

八、計算字段

  拼接字段:SELECT Concat(ventor_name, '(',  ventor_country, ')') FROM ventors ORDER BY ventor_name;

  去掉有邊的全部空格:SELECT Concat(RTrim(ventor_name), '(',  RTirm(ventor_country), ')') FROM ventors ORDER BY ventor_name;  (LTrim去掉左邊空格,Trim去掉左右邊空格)

  使用別名:SELECT Concat(ventor_name, '(',  ventor_country, ')') AS ventor_title FROM ventors ORDER BY ventor_name;

  執行算數運算:SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;  (支持 + - * /

九、使用數據處理函數

  去除右邊列值右邊空格:RTirm()

  去除左邊列值右邊空格:LTirm()

  去除左右邊列值右邊空格:Tirm()

  將文本轉換爲大寫:Upper()

  將穩步轉換爲小寫:Lower()

  返回串的長度:Length()

  返回串左邊的字符:Left()

  返回串右邊的字符:Right()

  將任何文本串轉爲描述其語言表示的字母數字模式算法:Soundex()

  日期和時間處理函數

    增長一個日期(天、周等):AddDate()

    增長一個時間(時、分等):AddTime()

    返回當前日期:CurDate()

    返回當前時間:CurTime()

    返回日期時間的日期部分:Date()

    計算連個日期之差:DateDiff()

    高度靈活的日期運算函數:Date_Add()

    返回一個格式化的日期或時間串:Date_Format()

    返回一個日期的年數部分:Year()

    返回一個日期的月數部分:Month()

    返回一個日期的天數部分:Day()

    對於一個日期,返回對應的星期幾:DayOfWeek()

    返回一個時間的小時部分:Hour()

    返回一個時間的分鐘部分:Minute()

    返回一個時間的秒鐘部分:Second()

    返回一個日期時間的時間部分:Time()

    返回當前日期和時間:Now()

 十、彙總數據-彙集函數

  返回某列的平均值:AVG()

    SELECT AVG(prod_price) AS avg_price FROM products;

  返回某列的行數:COUNT()
    SELECT COUNT(*) AS prod_count FROM products;

  返回指定列的最大值:MAX()

    SELECT MAX(prod_price) AS max_price FROM products;

  返回指定列的最小值:MIN()

    SELECT MIN(prod_price) AS min_price FROM products;

  返回某列之和:SUM()

    SELECT SUM(prod_price) AS sum_price FROM products; 

  彙集不一樣值:DISTINCT

    SELECT AVG(DISTINCT prod_price) AS avg_price FROM products;

十一、分組數據

  建立分組:GROUP BY

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

  過濾分組:HAVING

    SELECT ventor_id,COUNT(*) AS num_prods FROM products GROUP BY ventor_id HAVING COUNT(*)>2;

  SELECT字句順序

    SELECT ... FROM  ...  WHERE  ...  GROUP BY  ...  HAVING  ...  ORDER BY  ...  LIMIT

十二、使用子查詢

  利用子查詢進行過濾

    SELECT cust_name FROM customers WHERE cust_id IN (

      SELECT cust_id FROM orders  WHERE order_num IN (

        SELECT order_num FROM orderitems WHERE order_id = 'TNT2'

      )

    );

  做爲計算字段使用子查詢

    SELECT cust_name,(

      SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id

    ) AS orders FROM customers ORDER BY cust_name;

1三、聯結表

  等值聯結

    SELECT ventor_name,prod_name,prod_price FROM ventors,products WHERE ventors.ventor_id = products.ventor_id ORDER BY ventor_name,prod_name;

    SELECT ventor_name,prod_name,prod_price FROM ventors INNER JOIN products ON ventors.ventor_id= products.ventor_id;

  自聯結

    SELECT prod_id,prod_name FROM products WHERE vend_id = (

      SELECT vend_id FROM products WHERE prod_id = 'DTNTR'

    );

    SELECT p1.prod_id,p1.prod_name FROM products AS p1,products AS p2 WHERE p1.vend_id=p2.vend_id AND p2.prod_id = 'DTNTR';

  外部聯結

    SELECT customers.cust_id,orders.order_num FROM customers RIGHT OUTER JOIN orders IN customers.cust_id=orders.cust_id;

    SELECT customers.cust_id,orders.order_num FROM customers LEFT OUTER JOIN orders IN customers.cust_id=orders.cust_id;

1四、組合查詢

  建立組合查詢

    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);    

1五、插入數據

  插入完整的行

    INSERT INTO customers(cust_id,cust_name_cust_age) VALUES(10002,'xxx',28);

  插入多行

    INSERT INTO customers(cust_id,cust_name_cust_age) VALUES(10002,'xxx',28),(10003,'yyy',18);    

  插入檢索出的數據

    INSERT INTO customers(cust_id,cust_name_cust_age) SELECT cust_id,cust_name_cust_age FROM custnew;

1六、更新和刪除數據

  UPDATE customers SET cust_name='ddd',age='40 WHERE cust_id = 100001;

  DELETE FROM customers WHERE cust_id = 100001;

1七、建立和操縱表

  建立

  CREATE TABLE customers(

    cust_id  int  NOT NULL  AUTO_INCREMENT,

    cust_name  char(50)  NOT NULL,

    cust_age  int NOT NULL DEFAULT 10,

    PRIMARY KEY(cust_id)

  )ENGINE=InnoDB;

   更新

    給表插入一個列:ALTER TABLE vendors ADD vend_phone CHAR(20);

    刪除一個列:ALTER TABLE vendors DROP vend_phone;

  刪除表:DROP TABLE vendors;

  重命名錶:RENAME TABLE vendors TO vendors1;

1八、使用視圖

  利用視圖簡化複雜的聯結

    CREATE VIEW productcustomers AS

    SELECT cust_name,cust_contact,pro_id FROM customers, orders, orderitems WHERE customers.cust_id=orders.cust_id AND orders.order_num=orderitems.order_num;

    SELECT cust_name,cust_contact FROM productcustomers WHERE prod_id='100002';

1九、使用存儲過程

  執行存儲過程

    CALL productpricing(@pricelow,@prichigh,@priceaverage);

  建立存儲過程

    DELIMITER //

    CREATE PROCEDURE productpricing()

    BEGIN

      SELECT AVG(prod_price) AS priceaverage FROM products;

    END //

    DELIMITER ;

  刪除存儲過程:DROP PROCEDURE productpricing;

  傳入返回參數

    DELIMITER //

    CREATE PROCEDURE productpricing(OUT p1 DECIMAL(8,2),OUT p2 DECIMAL(8,2),OUT p3 DECIMAL(8,2))

    BEGIN

      SELECT MIN(prod_price)

      INTO p1

      FROM products;

      SELECT MAX(prod_price)

      INTO p2

      FROM products;

      SELECT AVG(prod_price)

      INTO p3

      FROM products;

    END//

    DELIMITER ;

    CALL productpricing(@max,@min,@avg);

    SELECT @max,@min,@avg;

  傳入使用參數

    DELIMITER //

    CREATE PROCEDURE ordertotal(IN onmuber INT, OUT ototal DECIMAL(8,2))

    BEGIN

      SELECT SUM(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO ototal;

    END//

    DELIMITER ;

    CALL ordertotal(2005,@ototal);

  檢測存儲過程:SHO CREATE PROCEDURE ordertotal;

20、使用觸發器

  只支持DELETE/INSERT/UPDATE語句,BEFORE和AFTER事件

  建立觸發器:CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'prodcuct add';

  刪除觸發器:DROP TRIGGER newproduct;

  INSERT觸發器:可引用一個名爲NEW的虛擬表,訪問被插入的值,在BEFORE INSERT 觸發器中,NEW中的值也能夠被更新,對於AUTO_INCREMENT列,NEW在INSERT執行以前包含0,在INSERT執行以後包含新的自動生成值

    CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;

  DELETE觸發器:可引用一個名爲OLD的虛擬表,訪問被刪除的行,OLD中的值全都是隻讀的,不能更新

    CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW

    BEGIN

      INSERT INTO archive_order(order_num,order_date,cust_id) VALUE (OLD.order_num,OLD.order_date,OLD.cust_id);

    END;

    因爲某種緣由,BEGIN END 內執行失敗,DELETE自己將被放棄。

  UPDATE觸發器:可引用一個名爲OLD的虛擬表訪問之前的值,引用一個名爲NEW的虛擬表訪問更新的值;在BEFORE UPDATE觸發器中,NEW中的值容許被修改;OLD中的值全都是隻讀

    CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state = UPPER(NEW.vend_state);

2一、管理事務處理

  關鍵詞:

    事務(transaction)指一組SQL語句

    回退(rollback)指撤銷指定SQL語句的過程

    提交(commit)指將未存儲的SQL語句結果寫入數據庫

    保留點(savepoint)指事務處理中設置的臨時佔位符,你能夠對它發佈回退(與回退整個事務處理不一樣)

  事務的開始:START TRANSACTION 

  事務的回退:ROLLBACK

    START TRANSACTION;

    DELETE FROM orders;

    ROLLBACK;

  事務的提交:COMMIT

    START TRANSACTION;

    DELETE FROM orders;

    COMMIT;

  設置保留點:SAVEPOINT delete1;

        ROLLBACK TO delete1;

2二、安全管理

  MySQL用戶帳號和信息存儲在名爲mysql的數據庫中

    USE mysql;

    SELECT user FROM user;

  建立用戶帳號

    CREATE USER ben IDENTIFIED BY 'xxxxx';

  重命名用戶名

    RENAME USER ben TO bforta;

  刪除用戶帳號

    DROP USER bforta;

  設置訪問權限

    查看用戶權限:SHOW GRANTS FOR bforta;

    設置權限:GRANT SELECT ON crashcourse.* TO bforta;

    撤銷權限:REVOKE SELECT ON crashcourse.* FROM bforta;

    GRANT和REVOKE可在幾個層次上控制訪問權限:

      整個服務器,使用GRANT ALL和REVOKE ALL

      整個數據庫:使用ON database.*

      特定的表:使用ON database.table

    權限:

    ALL:除GRANT OPTION外全部權限

    ALTER:使用ALTER TABLE

    ALTER ROUTINE:使用ALTER PROCEDURE和DROP PROCEDURE

    CREATE:使用CREATE TABLE

    CREATE ROUTINE:使用CREATE PROCEDURE

    CREATE TEMPORARY:使用CREATE TEMPORARY TABLE

    CREATE USER:使用CREATE USER/DROP USER/RENAME USER/REVOKE ALL PRIVILEGES

    CREATE VIEW:使用CREATE VIEW

    DELETE:使用DELETE

    DROP:使用DROP TABLE

    EXECUTE:使用CALL和存儲過程

    FILE:使用SELECT INTO OUTFILE和LOAD DATA INFILE

    GRANT OPITION:使用GRANT和REVOKE

    INDEX:使用CREATE INDEX和DROP INDEX

    INSERT:使用INSERT

    LOCK TABLES:使用LOCK TABLES

    PROCESS:使用SHOW FULL PROCESSLIST

    RELOAD:使用FLUSH

    REPLICATION CLIENT:服務器位置的訪問

    REPLICATION SLAVE:由複製從屬使用

    SELECT:使用SELECT

    SHOW DATABASES:使用SHOW DATABASES

    SHOW VIEW:使用SHOW CREATE VIEW

    SHUTDOWN:使用mysqladmin shutdown(用來關閉MySQL)

    SUPER:使用CHANGE MASTER/KILL/LOGS/PURGE/MASTER/SET GLOBAL,

    UPDATE:使用UPDATE

    USAGE:無訪問權限     

相關文章
相關標籤/搜索