mysql常見語句總結
阿新 • • 發佈:2019-01-05
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 left (outer) join book b on c.category_id = b.category_id;
- 右連線(以右邊為基準):
查詢出所有的書籍分類,及每個分類下的書籍資訊;
select c.*,b.* from book b right (outer) join category c on c.category_id = b.category_id;
14.NULL的處理
查詢資料表中 runoob_test_tbl 列是否為 NULL
- 必須使用 IS NULL 和 IS 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:觸發事件,為INSERT、DELETE或者UPDATE
tb_name:表示建立觸發器的表明,就是在哪張表上建立觸發器
trigger_stmt:觸發器的程式體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句
所以可以說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;