MySQL學習筆記

SELECT VERSION();   //顯示服務器版本
SELECT NOW();       //顯示當前時間
SELECT USER();      //顯示當前用戶

書寫規範:關鍵字與函數名稱全部大寫,數據庫表名稱、庫名稱、字段名稱全部小寫。

CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name; //創建數據庫 []爲可寫可不寫
SHOW {DATABASES|SCHEMAS} [LIKE 'pattern'|WHERE expr];    //查看服務器下數據表列表
SHOW CREATE DATABASE databasename;    //顯示數據庫編碼方式
ALTER {DATABASE|SCHEMA} [data_name] [DEFAULT] CHARACTER SET [=] charset_name;     //修改編碼方式
ALTER TABLE admin CONVERT TO CHARACTER SET utf8;   //設置整個表中所有字段的編碼方式爲utf8
DROP {DATABASE|SCHEMA} [IF EXISTS] db_name;     //刪除數據庫
mysql> CREATE TABLE tb1(
    -> username VARCHAR(20),
    -> age TINYINT UNSIGNED,//UNSIGNED 表示非負
    -> salary FLOAT(8,2) UNSIGNED  //FLOAT(8,2)一共8位,小數點後有2位  eg:9988.34
    -> );
Query OK, 0 rows affected (0.07 sec)
SHOW TABLES[FROM db_name][LIKE 'pattern'|WHERE expr];   //查看數據表列表
SHOW COLUMNS  FROM tb1;    //描述表tb1
INSERT tb1(username,salary) VALUES('John',4500.69);    //單獨給某些字段複製
mysql> CREATE TABLE tb2(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,   //主鍵約束,自增,主鍵                          
      -> username VARCHAR(20) NOT NULL                                              
      -> );

UNIQUE KEY

唯一約束

唯一約束可以保證記錄的唯一性

唯一約束的字段可以爲空值NULL

每張表可以存在多個唯一約束

mysql> CREATE TABLE tb3(
    -> id SMALLINT PRIMARY KEY AUTO_INCREMENT,                                      
      -> username VARCHAR(20) UNIQUE KEY                                              
 -> );

DEFAULT 規定默認值

mysql> CREATE TABLE tb4(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,
    -> sex ENUM('1','2','3') DEFAULT '3'   //ENUM() 1,2,3裏選一個值
    -> );

FOREIGN KEYp

外鍵約束

保持數據一致性,完整性。

實現一對多或一對一的關係。

FOREIGN KEY 物理外鍵約束如CASCADE,SET NULL,RESTRICT,NO ACTION只能在INNODB數據庫引擎中使用,在項目開發中多用邏輯約束。

(主鍵自動創建索引)

題外話:例如 SHOW CREATE TABLE table_name。展示的是表格形式若:SHOW CREATE TABLE table_name\G,則爲另一種形式展現信息(\G後面不能加;)。

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]    //修改表名稱 after是規定在哪個字段之後,若不寫則在所有字段最下面
ALTER TABLE tbl_name DROP[COLUMN]col_name  //刪除列
ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;   //舉個栗子(添加)
ALTER TABLE users1 ADD(col_name col_definition,...)     //添加多列
ALTER TABLE users1 ADD qq varchar(10),DROP password;   //同時添加和刪除,同時刪除、添加多個也同理
ALTER TABLE users2 ADD CONSTRAINT PK_users2_id PRIMARY KEY (id);   //添加主鍵約束 constraint用來給約束起名字
ALTER TABLE users2 ADD UNIQUE (username);             //添加唯一約束
ALTER TABLE users2 ADD FOREIGN KEY(pid) REFERENCES provinces (id);  //添加外鍵約束
ALTER TABLE users2 ALTER age SET DEFAULT 15;      //添加默認約束
ALTER TABLE users2 ALTER age DROP DEFAULT;        //刪除默認約束
ALTER TABLE users2 DROP PRIMARY KEY;        //刪除主鍵約束
ALTER TABLE users2 DROP INDEX username;     //刪除username的唯一約束  “INDEX”爲唯一約束的名字
ALTER TABLE users2 DROP FOREIGN KEY 外鍵名字;     //刪除外鍵約束  外鍵名字通過SHOW CREATE TABLE tbl_name裏面的constraint位置來查看
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST|AFTER col_name]   //紅字部分均可被修改
ALTER TABLE users2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;      //“CHANGE”修改,“CHANGE”功能範圍大於“MODIFY”

INSERT專題

第一種插入方法 當表裏的id爲自增主鍵時,插入要用這樣兩種方法插入

INSERT INTO tbl_name VALUES(NULL,'TOM',25);      //第一個字段爲自增,所以設置爲NULL讓其自增
INSERT INTO tbl_name VALUES(DEFAULT,'TOM',52);   //第一個字段爲自增,所以設置爲DEFAULT讓其自增
INSERT INTO tbl_name VALUES(DEFAULT,'TOM',DEFAULT);  //第三個字段設置表時存在默認值,故可以這樣直接插入
INSERT INTO tbname VALUES(DEFAULT,'TOM',10*5-2),(DEFAULT,'JACK',md5('123'));  //插入多個值;md5()爲php計算哈希值的函數

第二種插入方法 與第一種的區別在於此方法可以使用子查詢(SubQuery)

INSERT [INTO] tbl_name SET col_name={expr|DEFAULT},...

第三種插入方法 此方法可直接將查詢結果插入到指定數據表

INSERT [INTO] tbl_name [(col_name,...)] SELECT...

UPDATE

eg:UPDATE users SET age=age+1 WHERE id%2=0;   //id爲偶數的年齡加1歲 

DELETE

DELETE FROM tbl_name [WHERE where_condition]

SELECT的簡單介紹

多表鏈接後具有相同的字段,就這樣用

SELECT users.name,users.id FROM users;
SELECT id AS userId,username AS uname FROM users;//起別名

SELECT查詢的順序將影響結果集的順序;SELECT的別名將影響結果集的別名

GROUP BY分組

SELECT sex FROM users BROUP BY sex; //對性別進行分組  會分成男/女/NULL
SELECT age FROM users GROUP BY 1 HAVING age>20;  //設定了條件後進行分組
SELECT COUNT(age) FROM users GROUP BY age HAVING age=20;   //查找有多少個年齡=20歲的
//HAVING後面必須是:1.一個聚合函數(cout(),min(),max(),sum(),avg(),round(obj,2)[對obj的值四捨五入小數點後兩位]等。如:SELECT avg(age) FROM users;2.規定條件的字段必須出現在select後面查找的字段中
//補充:聚合函數count()的用法
SELECT count(*) FROM users;//查詢users表中的行數 包括NULL值
SELECT count(sex) FROM users;//查詢users表中sex的行數,不包括NULL值,NULL值不算在行數內

ORDER BY排序

SELECT *FROM users ORDER BY id DESC;  //DESC爲降序排列,ASC爲升序(默認)
SELECT *FROM users ORDER BY age,id DESC //age升序排列同時id降序排列

LIMT 限制

SELECT *FROM users LIMIT 2; //顯示數據表的前兩行數據
SELECT *FROM users LIMIT 2,2 //顯示數據表的第三四行數據,因爲第一個2是控制從哪一行開始,第二個2是控制顯示幾行,又因爲數據表是從0開始計算的,所以2代表第三行
select emp_no, salary from salaries where salary = (select salary from salaries group by salary order by salary desc limit 1,1)//order by 後接 limit要注意重複數據的問題,所以最好用這種方式而不是直接order by a limit 1,1

子查詢

SELECT AVG(goods_price) FROM tdb_goods;  //計算平均值得出5636.36
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=5636.36;//條件下計算
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);  //這就是子查詢,將兩個語句整合在一起。

當子查詢返回多個值的時候需要條件判斷(any,some,all)寫在判斷符號後面

如果一張表裏面相同字段有相同名稱的內容,容易造成查詢時間長,所以需要用到外鍵(實施外鍵,比物理外鍵常用)

由於tdb_goods中的貨物類型重複較多,且漢字字符串較長,會導致查詢變慢,所以將其變成數字來加快查詢速度,而這就需要使用另外一張貨物類型表的cate_id來進行比對參照,就需要將兩張表進行連接

創建tdb_goods_cate後:當需要將查詢的結果輸入到另一張表時,若得到結果過多,需要使用INSERT...SELECT將查詢結果寫入數據表,如下

INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
UPDATE tdb_goods INNER JOIN tdb_goods_cate ON goods_cate=cate_name SET goods_cate=cate_id;

實現以上目的可用如下方法進行,僅需兩步就可以執行

mysql> CREATE TABLE tdb_goods_brands(
    -> brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> brand_name VARCHAR(40) NOT NULL)
    -> SELECT brand_name FROM tdb_goods GROUP BY brand_name;//通過SELECT實現在建表時直接插入數據
UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS q ON g.brand_name=q.brand_name SET g.brand_name=q.brand_id;//兩個表中出現同名字段,故用AS起別名後再進行。

內連接 只顯示符合條件的部分

SELECT goods_id,goods_name,cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id=tdb_goods_cates.cate_id;  //好好分析這段代碼

左外連接 顯示左表全部和右表符合條件的

SELECT goods_id,goods_name,cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id=tdb_goods_cates.cate_id;  //好好分析這段代碼

連接三張表

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g  INNER JOIN tdb_goods_cates AS c ON g.cate_id=c.cate_id INNER JOIN tdb_goods_brands AS q ON g.brand_id=q.brand_id;

無限級分類表設計 有時功能往往需求多級分類,但寫很多表會很麻煩 就需要自身連接 想象成兩個相同的表,一個父表一個子表

SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id=p.parent_id;  //通過這段代碼將更好展示出所屬關係  (結合課程截圖)

今天在做題的時候遇到了個小問題,就是date類型的數據,在插入的時候要加單引號

WHERE後面不能用聚合函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章