1. 程式人生 > >mysql常見語句總結

mysql常見語句總結

1.建立資料庫 CREATE DATABASE 資料庫名;

2.刪除資料庫 drop database 資料庫名;

3.選擇資料庫 mysql> use RUNOOB;

4.建立表

    mysql> CREATE TABLE runoob_tbl(
    -> runoob_id INT NOT NULL AUTO_INCREMENT,
    -> runoob_title VARCHAR(100) NOT NULL,
    -> runoob_author VARCHAR(40) NOT NULL,
    -> submission_date DATE
, -> PRIMARY KEY ( runoob_id ) -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;

5.刪除表

mysql> DROP TABLE runoob_tbl

6.插入資料

mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("學習 PHP", "菜鳥教程", NOW());
  • now()返回日期和時間

7.MySQL 的 WHERE 子句的字串比較是不區分大小寫的。
你可以使用 BINARY 關鍵字來設定 WHERE 子句的字串比較是區分大小寫的。

mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';

8.更新
將 id 為 5 的手機號改為預設的:

update students settel=default where id=5;

將手機號為 13288097888 的姓名改為 “小明”, 年齡改為 19:

update students setname="小明", age=19 wheretel="13288097888";

9.刪除

mysql> DELETE FROM runoob_tbl WHERE runoob_id=3
;

10.like子句

mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';

11.排序
你可以使用 ASC 或 DESC 關鍵字來設定查詢結果是按升序或降序排列。 預設情況下,它是按升序排列。

這是升序
mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC; 

order by code,name desc等同於order by code asc, name desc

這是降序
select * from a order by code desc, name desc;

12.常用聚合函式

 1  count    2   sum    3   avg    4   max    5   min 

13.多表查詢
- as關鍵字可用來做別名識別
- 預設連線的是內連線(也叫做等值連線)

select * from book b inner join category c 
on b.category_id = c.category_id;

相當於:

select * from book b ,category c 
where b.category_id  = c.category_id;

外連線有左右連線(如下):
- 左連線(以左邊為基準):
查詢出所有的書籍分類,及每個分類下的書籍資訊;

select * from category c leftouterjoin book b on c.category_id = b.category_id;
  • 右連線(以右邊為基準):
    查詢出所有的書籍分類,及每個分類下的書籍資訊;
select c.*,b.* from book b rightouterjoin category c on c.category_id = b.category_id;

14.NULL的處理
查詢資料表中 runoob_test_tbl 列是否為 NULL
- 必須使用 IS NULLIS NOT NULL

15.事務

mysql> use RUNOOB; 
Database changed 
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; 
Query OK, 0 rows affected (0.04 sec) 
mysql> select * from runoob_transaction_test; 
Empty set (0.01 sec)
mysql> begin; # 開始事務 
Query OK, 0 rows affected (0.00 sec) 
mysql> insert into runoob_transaction_test value(5); 
Query OK, 1 rows affected (0.01 sec) 
mysql> insert into runoob_transaction_test value(6); 
Query OK, 1 rows affected (0.00 sec) 
mysql> commit; # 提交事務 
Query OK, 0 rows affected (0.01 sec) 
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)

mysql> begin; # 開始事務
Query OK, 0 rows affected (0.00 sec) 
mysql> insert into runoob_transaction_test values(7); 
Query OK, 1 rows affected (0.00 sec) 
mysql> rollback; # 回滾 
Query OK, 0 rows affected (0.00 sec) 
mysql> select * from runoob_transaction_test; # 因為回滾所以資料沒有插入
+------+
| id |
+------+
| 5 | | 6 |
+------+ 
2 rows in set (0.01 sec) 

16.alter命令
刪除,新增表字段

ALTER TABLE testalter_tbl DROP i;               ---刪除i欄位
ALTER TABLE testalter_tbl ADD i INT FIRST;   ----增加i欄位,並放在第一位
ALTER TABLE testalter_tbl ADD i INT AFTER c;   ---增加i欄位,並放在c欄位後面

修改欄位型別及名稱(兩種方法 modify —修改欄位的型別和change —–修改名字)

mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT; ------把i欄位修改為新的欄位名
mysql > ALTER TABLE testalter_tbl MODIFY c CHAR(10); ----把c欄位的型別改為char(10

修改欄位預設值

mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; -----刪除預設值

修改表名

mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl; ----修改表名

修改結構增加索引

ALTER table tableName ADD INDEX indexName(columnName)

建立表時直接指定:

增加主鍵:primary key(field_name)                 
增加外來鍵:FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`)
增加索引: INDEX(year_publication)

修改表時:

增加主鍵: ALTER TABLE `book`DROP PRIMARY KEY,ADD PRIMARY KEY (`isbn`); 
增加外來鍵:ALTER TABLE `book` ADD FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`); 
增加索引:ALTER TABLE `book` ADD INDEX (`book_name`) ; 刪除:DROP INDEX [indexName] ON mytable;
更新外來鍵:  官方做法是先刪除原來的外來鍵後再新增更新後的外來鍵

17.分頁查詢
查詢第11到第15條資料

select * from table_name limit 10,5
  • limit關鍵字的用法:
LIMIT [offset,] rows
offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目。
初始行的偏移量是0(不是1)。

18.建立檢視

create view demo_view as select * from demo_table;
  • 好處1:減少資料的冗餘,方便對資料操作

    • 資料庫雖然可以儲存海量資料,但是在資料表設計上卻不可能每種關係建立資料表
    • 例如,對於學生表,儲存了學生資訊,學生的屬性包括學號、姓名、年齡、家庭地址等資訊;而學生成績表只儲存了學生學號、科目、成績等資訊。現獲得學生姓名和成績資訊,那麼就需要建立一個關係,該關係需要包含學生的姓名、科目、成績。但是為了該關係建立一個新的資料表,並利用實際資訊進行填充,以備查詢使用,是不合適的,這樣會造成了資料庫中資料的大量冗餘。
    • 檢視就是解決這個問題的最佳策略,因此檢視可以儲存查詢定義,一旦使用檢視儲存了查詢定義,就如同儲存了一個新的關係,使用者就可以直接對檢視中所儲存的關係進行各種操作,就如同面對的是真實的資料表。
  • 好處2:資料的安全和保密

    • 一個數據表可能包含很多列,但是這些列的資訊,對於不同的角色來說,肯定不是全部公開的,對於員工表來說吧,一個普通的員工只能看見這個員工表中的姓名和年齡這些資訊,但是對於高層來說,他們要看見員工表中更多資訊,不僅僅是上面的兩列還有其他的資訊,包括員工的住址和員工的薪資待遇,這個時候都是同一張表,怎麼辦?檢視可以解決呀,首先建立一個檢視只有員工的姓名和年齡,再建一個檢視包含地址和薪資待遇的資訊。這樣就可以根據不同的角色分配兩個檢視的查詢許可權,與實際表隔離開來。這樣就可以提高資料訪問的安全性了。

19.建立儲存過程

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

20.觸發器

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:觸發器的名稱
tirgger_time:觸發時機,為BEFORE或者AFTER
trigger_event:觸發事件,為INSERTDELETE或者UPDATE
tb_name:表示建立觸發器的表明,就是在哪張表上建立觸發器
trigger_stmt:觸發器的程式體,可以是一條SQL語句或者是用BEGINEND包含的多條語句

所以可以說MySQL建立以下六種觸發器:

BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE
  • tips:一般情況下,mysql預設是以 ; 作為結束執行語句,與觸發器中需要的分行起衝突為解決此問題可用DELIMITER,如:DELIMITER ||,可以將結束符號變成||當觸發器建立完成後,可以用DELIMITER ;來將結束符號變成;
mysql> DELIMITER ||
mysql> CREATE TRIGGER demo BEFORE DELETE
    -> ON users FOR EACH ROW
    -> BEGIN
    -> INSERT INTO logs VALUES(NOW());
    -> INSERT INTO logs VALUES(NOW());
    -> END
    -> ||
Query OK, 0 rows affected (0.06 sec)
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> delimiter $$
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
->   IF NEW.amount < 0 THEN
->     SET NEW.amount = 0;
->   ELSEIF NEW.amount > 100 THEN
->     SET NEW.amount = 100;
->   END IF;
-> END$$
mysql> delimiter;