1. 程式人生 > 其它 >MySQL關鍵字與語句

MySQL關鍵字與語句

-- 建立資料庫
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 KEYREFERENCES中指定的子表和父表中的列數必須相同。
  • ON DELETE子句允許定義當父表中的記錄被刪除時,子表的記錄怎樣執行操作。如果省略ON DELETE子句並刪除父表中的記錄,則MySQL將拒絕刪除子表中相關聯的資料。此外,MySQL還提供了一些操作,以便您可以使用其他選項,例如ON DELETE CASCADE,當刪除父表中的記錄時,MySQL可以刪除子表中引用父表中記錄的記錄。 如果您不希望刪除子表中的相關記錄,請改用ON DELETE SET NULL操作。當父表中的記錄被刪除時,MySQL會將子表中的外來鍵列值設定為NULL,條件是子表中的外來鍵列必須接受NULL值。 請注意,如果使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL將拒絕刪除。
  • ON UPDATE子句允許指定在父表中的行更新時,子表中的行會怎樣執行操作。當父表中的行被更新時,可以省略ON UPDATE子句讓MySQL拒絕對子表中的行的任何更新。 ON UPDATE CASCADE操作允許您執行交叉表更新,並且當更新父表中的行時,ON UPDATE SET NULL操作會將子表中行中的值重置為NULL值。 ON UPDATE NO ACTIONUPDATE 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';

參考

https://blog.csdn.net/BabyFish13/article/details/51819426