MySQL關鍵字與語句
阿新 • • 發佈:2021-07-01
增
-- 建立資料庫 CREATE DATABASE [IF NOT EXISTS] database_name; -- 建立表 CREATE TABLE IF NOT EXISTS `et_catalogmetadata` -- 建立表 CREATE TABLE test(id int,body varchar(100)); -- 新建本地使用者 CREATE USER 'test'@'localhost' IDENTIFIED BY '123456'; -- 新建遠端使用者 CREATE USER 'test'@'%' IDENTIFIED BY '123456'; -- 增加列 ALTER TABLE tasks ADD COLUMN complete DECIMAL(2,1) NULL AFTER description; -- 資料庫名所對應的資料庫不存在的情況下建立.如果已經存在則不建立 CREATE DATABASE IF NOT EXISTS mydatabase
IF NOT EXISTS
是語句的可選子句。IF NOT EXISTS
子句可防止建立資料庫伺服器中已存在的新資料庫的錯誤。不能在MySQL資料庫伺服器中具有相同名稱的資料庫。該語句也可用於建立表
刪
-- 刪除使用者 DROP USER 'test'@'localhost'; -- IF EXISTS是該語句的可選部分,以防止您刪除資料庫伺服器中不存在的資料庫。 DROP DATABASE [IF EXISTS] database_name; -- 刪除表 DROP TABLE table_name ; -- 刪除索引 drop index index_user_id on table_name; -- 刪除PRIMARY KEY索引時使用 ALTER TABLE table_name DROP PRIMARY KEY
改
-- 賦予insert,select,update許可權和全部許可權,test01=資料庫,dev=使用者: GRANT INSERT, SELECT, UPDATE ON test01.* TO 'dev' @'%'; -- 不允許這個使用者給其他使用者授權 GRANT ALL PRIVILEGES ON test01.* TO 'dev' @'%'; -- 允許這個使用者給其他使用者授權 GRANT ALL PRIVILEGES ON.TO ‘ wangxiang’ @’ %’ WITH GRANT OPTION; -- 重新整理許可權 FLUSH PRIVILEGES; -- 收回許可權 REVOKE ALL PRIVILEGES ON *.* FROM 'test'@'%'; -- 修改Root密碼 ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; -- 指定密碼認證外掛 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPassowrd'; -- 修改使用者密碼,兩種方式 ALTER USER user IDENTIFIED BY 'auth_string'; update mysql.user set password='hiveuser' where user='hiveuser'; -- 修改密碼驗證外掛 ALTER USER ‘nextcloud‘@‘%‘ IDENTIFIED WITH mysql_native_password BY ‘new_password‘; #開啟遠端訪問 use mysql; update user set host='%' where user ='root'; # -- 重命名錶 ALTER TABLE tasks RENAME TO work_items; -- 更新表資料,將email列的1056行修改為 [email protected] UPDATE employees SET email = '[email protected]' WHERE employeeNumber = 1056; -- update配合select語句 UPDATE customers SET sales = (SELECT employee FROM employees WHERE jobtitle = 'Sales Rep' LIMIT 1) WHERE sales IS NULL;
查
-- 檢視所有資料庫
SHOW DATABASES;
-- 檢視許可權
SHOW GRANTS FOR 'test'@'%';
-- 檢視所有表
SHOW TABLES;
-- 查詢所有使用者
USE db_name;
SELECT HOST, USER,PASSWORD FROM mysql.USER;
-- 查看錶結構
DESC table_name;
-- 檢視日誌開啟狀態
SHOW VARIABLES LIKE 'log_%';
-- 檢視所有binlog日誌列表
SHOW MASTER LOGS;
-- 檢視所有庫的大小,務必先執行use
use information_schema;
SELECT concat( round( sum( DATA_LENGTH / 1024 / 1024 ), 2 ), 'MB' ) AS DATA FROM TABLES;
-- 檢視指定庫的指定表的大小
SELECT concat( round( sum( DATA_LENGTH / 1024 / 1024 ), 2 ), 'MB' ) AS DATA FROM TABLES WHERE table_schema = 'jishi' AND table_name = 'a_ya';
-- 檢視指定庫的指定表的索引大小
SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Index_Size' FROM TABLES--WHERE table_schema = 'test' and table_name='a_yuser';
-- 檢視索引
show index from tblname;
show keys from tblname;
引數 | 說明 |
---|---|
Non_unique | 如果索引不能包括重複詞,則為0。如果可以,則為1。 |
Key_name | 索引的名稱。 |
Seq_in_index | 索引中的列序列號,從1開始。 |
Column_name | 列名稱。 |
Collation | 列以什麼方式儲存在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。 |
Cardinality | 索引中唯一值的數目的估計值。基數越大,當進行聯合時,使用該索引的機會就越大。 |
Sub_part | 如果列只是被部分地編入索引,則為被編入索引的字元的數目。如果整列被編入索引,則為NULL。 |
Packed | 指示關鍵字如何被壓縮。如果沒有被壓縮,則為NULL。 |
Null | 如果列含有NULL,則含有YES。如果沒有,則該列含有NO。 |
Index_type | 用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 |
Comment | 計算某列某個字元出現的次數: |
外來鍵
以下語法說明了如何在CREATE TABLE語句中的子表中定義外來鍵。
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
SQL
詳細分析:
CONSTRAINT
子句允許您為外來鍵約束定義約束名稱。如果省略它,MySQL將自動生成一個名稱。FOREIGN KEY
子句指定子表中引用父表中主鍵列的列。您可以在FOREIGN KEY
子句後放置一個外來鍵名稱,或者讓MySQL為您建立一個名稱。 請注意,MySQL會自動建立一個具有foreign_key_name
名稱的索引。REFERENCES
子句指定父表及其子表中列的引用。 在FOREIGN KEY
和REFERENCES
中指定的子表和父表中的列數必須相同。ON DELETE
子句允許定義當父表中的記錄被刪除時,子表的記錄怎樣執行操作。如果省略ON DELETE
子句並刪除父表中的記錄,則MySQL將拒絕刪除子表中相關聯的資料。此外,MySQL還提供了一些操作,以便您可以使用其他選項,例如ON DELETE CASCADE,當刪除父表中的記錄時,MySQL可以刪除子表中引用父表中記錄的記錄。 如果您不希望刪除子表中的相關記錄,請改用ON DELETE SET NULL
操作。當父表中的記錄被刪除時,MySQL會將子表中的外來鍵列值設定為NULL
,條件是子表中的外來鍵列必須接受NULL
值。 請注意,如果使用ON DELETE NO ACTION
或ON DELETE RESTRICT
操作,MySQL將拒絕刪除。ON UPDATE
子句允許指定在父表中的行更新時,子表中的行會怎樣執行操作。當父表中的行被更新時,可以省略ON UPDATE
子句讓MySQL拒絕對子表中的行的任何更新。ON UPDATE CASCADE
操作允許您執行交叉表更新,並且當更新父表中的行時,ON UPDATE SET NULL
操作會將子表中行中的值重置為NULL
值。ON UPDATE NO ACTION
或UPDATE RESTRICT
操作拒絕任何更新。
新增外來鍵
MySQL新增外來鍵語法
要將外來鍵新增到現有表中,請使用ALTER TABLE語句與上述外來鍵定義語法:
ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;
刪除外來鍵
使用ALTER TABLE
語句將外來鍵刪除,如下語句:
ALTER TABLE table_name
DROP FOREIGN KEY constraint_name;
在上面的宣告中:
- 首先,指定要從中刪除外來鍵的表名稱。
- 其次,將約束名稱放在
DROP FOREIGN KEY
子句之後。
SELECT
KEYY AS '0',
count(*) AS KEYY
FROM
t_dict
GROUP BY
KEYY
LIMIT 0,1
與其他表的某個字元進行對比,如果沒找到,則輸出該行:
SELECT NAME AS
Customers
FROM
Customers
LEFT JOIN Orders ON Orders.CustomerId = Customers.Id
WHERE
Orders.CustomerId IS NULL
兩表比對,返回不相同資料
-- 方法1
SELECT * FROM t2 WHERE id NOT IN (SELECT id FROM t1);
-- 方法2
SELECT * FROM t2 WHERE NOT EXISTS(SELECT * FROM t1 WHERE t1.id=t2.id);
-- 方法3
SELECT t2.* FROM t2 LEFT JOIN t1 ON t2.id=t1.id WHERE t1.id IS NULL;
模糊查詢統計
SELECT COUNT(1) AS create_time FROM vote_record_memory WHERE create_time LIKE '1980-02%';
建表語句
CREATE TABLE massage (
id INT AUTO_INCREMENT COMMENT "主鍵",
NAME VARCHAR ( 10 ) NOT NULL,
ge INT ( 3 ) NOT NULL,
pos VARCHAR ( 10 ),
phone INT ( 11 ),
PRIMARY KEY ( id )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
找到不為空的記錄
SELECT * FROM customers WHERE addressLine2 IS NOT NULL;
mysql中檢視各表的大小
這裡用到一個表, information_schema.tables
;對應主要欄位含義如下:
ABLE_SCHEMA : 資料庫名
TABLE_NAME:表名
ENGINE:所使用的儲存引擎
TABLES_ROWS:記錄數
DATA_LENGTH:資料大小
INDEX_LENGTH:索引大小
按記錄資料統計:
SELECT
table_schema,
table_name,
table_rows
FROM
TABLES
ORDER BY
table_rows DESC;
查詢所有資料庫佔用磁碟空間大小的SQL語句
SELECT
TABLE_SCHEMA,
concat( TRUNCATE ( sum( data_length )/ 1024 / 1024, 2 ), ' MB' ) AS data_size,
concat( TRUNCATE ( sum( index_length )/ 1024 / 1024, 2 ), ' MB' ) AS index_size
FROM
information_schema.TABLES
GROUP BY
TABLE_SCHEMA
ORDER BY
data_length DESC;
查詢單個庫中所有表磁碟佔用大小的SQL語句
SELECT
TABLE_NAME,
concat( TRUNCATE ( data_length / 1024 / 1024, 2 ), ' MB' ) AS data_size,
concat( TRUNCATE ( index_length / 1024 / 1024, 2 ), ' MB' ) AS index_size
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = 'sor'
GROUP BY
TABLE_NAME
ORDER BY
data_length DESC;
檢視一個庫中的使用情況
SELECT
CONCAT( table_schema, '.', table_name ) AS 'Table Name',
CONCAT( ROUND( table_rows / 1000000, 4 ), 'M' ) AS 'Number of Rows',
CONCAT( ROUND( data_length /( 1024 * 1024 * 1024 ), 4 ), 'G' ) AS 'Data Size',
CONCAT( ROUND( index_length /( 1024 * 1024 * 1024 ), 4 ), 'G' ) AS 'Index Size',
CONCAT( ROUND(( data_length + index_length )/( 1024 * 1024 * 1024 ), 4 ), 'G' ) AS 'Total'
FROM
information_schema.TABLES
WHERE
table_schema LIKE 'src';
生成測試資料
CREATE TABLE `vote_record` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR ( 20 ) NOT NULL,
`vote_id` INT ( 11 ) NOT NULL,
`group_id` INT ( 11 ) NOT NULL,
`create_time` date NOT NULL,
PRIMARY KEY ( `id` ),
KEY `index_user_id` ( `user_id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
CREATE TABLE `vote_record_memory` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR ( 20 ) NOT NULL,
`vote_id` INT ( 11 ) NOT NULL,
`group_id` INT ( 11 ) NOT NULL,
`create_time` date NOT NULL,
PRIMARY KEY ( `id` ),
KEY `index_user_id` ( `user_id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `rand_date`(sd DATE,ed DATE) RETURNS date
DETERMINISTIC
BEGIN
DECLARE sub INT DEFAULT 0;
DECLARE ret DATE;
SET sub = ABS(UNIX_TIMESTAMP(ed)-UNIX_TIMESTAMP(sd));
SET ret = DATE_ADD(sd,INTERVAL FLOOR(1+RAND()*(sub-1)) SECOND);
RETURN ret;
END $$
DELIMITER $$
CREATE DEFINER = `root` @`%` FUNCTION `rand_string` ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC BEGIN
DECLARE
chars_str VARCHAR ( 100 ) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str VARCHAR ( 255 ) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat( return_str, substring( chars_str, FLOOR( 1 + RAND( ) * 62 ), 1 ) );
SET i = i + 1;
END WHILE;
RETURN return_str;
END $$
DELIMITER $$
CREATE DEFINER = `root` @`%` PROCEDURE `add_vote_memory` ( IN n INT ) BEGIN
DECLARE
i INT DEFAULT 1;
WHILE ( i <= n ) DO
INSERT INTO vote_record_memory ( user_id, vote_id, group_id, create_time )
VALUES
(
rand_string ( 20 ), FLOOR( RAND( ) * 1000 ), FLOOR( RAND( ) * 100 ), rand_date('1980-1-1','2000-01-01')
);
SET i = i + 1;
END WHILE;
END $$
CALL add_vote_memory (1000);
SHOW PROCEDURE STATUS LIKE 'add_vote_memory';
SHOW CREATE PROCEDURE add_vote_memory;
DROP PROCEDURE add_vote_memory;
SELECT * FROM information_schema.routines WHERE routine_name='add_vote_memory';
參考