語句
DDL
MySQL的DDL(數(shù)據(jù)定義語言)是一組用于創(chuàng)建、修改和刪除數(shù)據(jù)庫、表、索引、視圖、存儲(chǔ)過程和觸發(fā)器等數(shù)據(jù)庫對(duì)象的語句。下面是一些常用的MySQL DDL語句和它們的詳細(xì)說明:
alter
在MySQL中,DDL(數(shù)據(jù)定義語言)用于定義和管理數(shù)據(jù)庫對(duì)象,例如表、索引、視圖等。其中,ALTER語句是DDL中的一種,用于修改已經(jīng)存在的數(shù)據(jù)庫對(duì)象的結(jié)構(gòu)或?qū)傩浴?/p>
ALTER語句的語法如下:
ALTER object_type object_name alter_type [alter_specification];
其中,object_type可以是TABLE、DATABASE、INDEX、VIEW等;object_name指定要修改的對(duì)象的名稱;alter_type可以是ADD、MODIFY、DROP、RENAME等;alter_specification指定要進(jìn)行的具體修改操作。
- 添加列
使用ALTER TABLE語句添加新列,可以使用ADD關(guān)鍵字,后面跟著要添加的列名和定義該列的數(shù)據(jù)類型。例如:
ALTER TABLE mytable ADD COLUMN new_column INT;
- 修改列
使用ALTER TABLE語句修改已存在的列,可以使用MODIFY關(guān)鍵字,后面跟著要修改的列名和定義該列的新數(shù)據(jù)類型。例如:
ALTER TABLE mytable MODIFY COLUMN old_column VARCHAR(50);
- 刪除列
使用ALTER TABLE語句刪除已存在的列,可以使用DROP關(guān)鍵字,后面跟著要?jiǎng)h除的列名。例如:
ALTER TABLE mytable DROP COLUMN old_column;
- 重命名表
使用ALTER TABLE語句重命名已存在的表,可以使用RENAME關(guān)鍵字,后面跟著要修改的表名和定義該表的新名稱。例如:
ALTER TABLE mytable RENAME TO newtable;
- 更改表的存儲(chǔ)引擎
使用ALTER TABLE語句更改已存在的表的存儲(chǔ)引擎,可以使用ENGINE關(guān)鍵字,后面跟著要修改的存儲(chǔ)引擎名稱。例如:
ALTER TABLE mytable ENGINE = InnoDB;
-
更改表名
ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition;
root@ydh 15:54 mysql>alter table t1 change id number int;
-
改用戶的登錄密碼
alter user 'root'@'localhost' identified by '123456';
-
修改表中的列名
root@ydh 20:10 mysql>ALTER TABLE grade CHANGE COLUMN socre score int;
create
在MySQL中,DDL(數(shù)據(jù)定義語言)用于定義和管理數(shù)據(jù)庫的結(jié)構(gòu),其中包括創(chuàng)建、修改和刪除數(shù)據(jù)庫、表、索引等對(duì)象。其中,CREATE語句是DDL中的一個(gè)重要命令,用于創(chuàng)建數(shù)據(jù)庫對(duì)象。
CREATE語句的語法格式如下:
-
創(chuàng)建數(shù)據(jù)庫:
CREATE DATABASE database_name;
這條語句用于創(chuàng)建一個(gè)新的數(shù)據(jù)庫。
database_name
是要?jiǎng)?chuàng)建的數(shù)據(jù)庫的名稱。 -
創(chuàng)建表:
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... );
這條語句用于創(chuàng)建一個(gè)新的表。
table_name
是要?jiǎng)?chuàng)建的表的名稱,column1
,column2
, …是表的列名和對(duì)應(yīng)的數(shù)據(jù)類型。通過列名和數(shù)據(jù)類型的定義,可以確定表的結(jié)構(gòu)。create table ydh.t2(id int,name varchar(10));
當(dāng)在別的庫時(shí),可以創(chuàng)建在ydh庫的表。
create table if not exists ydh.t2 (id int ,name varchar(20));
如果不存在就創(chuàng)建表,存在就不創(chuàng)建同時(shí)不會(huì)輸出錯(cuò)誤提示到屏幕上,但是會(huì)出提示。
show warnings;
查看警告消息
create table wang( id int not null primary key, name varchar(20) not null, sex char(1) )
創(chuàng)建表的時(shí)候給屬性值一些限制。
-
創(chuàng)建索引:
CREATE INDEX index_name ON table_name (column1, column2, ...);
這條語句用于在表中創(chuàng)建一個(gè)索引。
index_name
是索引的名稱,table_name
是要?jiǎng)?chuàng)建索引的表名,(column1, column2, ...)
指定了要在哪些列上創(chuàng)建索引。 -
創(chuàng)建視圖:
CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition;
這條語句用于創(chuàng)建一個(gè)新的視圖。
view_name
是視圖的名稱,table_name
是視圖所基于的表,column1, column2, ...
是要包含在視圖中的列,WHERE condition
是一個(gè)可選的過濾條件。 -
創(chuàng)建存儲(chǔ)過程:
CREATE PROCEDURE procedure_name() BEGIN -- 存儲(chǔ)過程的邏輯 END;
這條語句用于創(chuàng)建一個(gè)新的存儲(chǔ)過程。
procedure_name
是存儲(chǔ)過程的名稱,在BEGIN
和END
之間可以編寫存儲(chǔ)過程的邏輯。
drop
DROP語句可以用于刪除表、索引、視圖、存儲(chǔ)過程、觸發(fā)器等對(duì)象。下面是一些常見的DROP語句的用法和解釋:
-
DROP TABLE:用于刪除表。語法如下:
DROP TABLE [IF EXISTS] table_name;
-
table_name
是要?jiǎng)h除的表的名稱。 -
IF EXISTS
是可選的關(guān)鍵字,表示如果表不存在也不會(huì)拋出錯(cuò)誤。
-
-
DROP INDEX:用于刪除索引。語法如下:
DROP INDEX [IF EXISTS] index_name ON table_name;
-
index_name
是要?jiǎng)h除的索引的名稱。 -
table_name
是包含索引的表的名稱。 -
IF EXISTS
是可選的關(guān)鍵字,表示如果索引不存在也不會(huì)拋出錯(cuò)誤。
-
-
DROP VIEW:用于刪除視圖。語法如下:
DROP VIEW [IF EXISTS] view_name;
-
view_name
是要?jiǎng)h除的視圖的名稱。 -
IF EXISTS
是可選的關(guān)鍵字,表示如果視圖不存在也不會(huì)拋出錯(cuò)誤。
-
-
DROP PROCEDURE:用于刪除存儲(chǔ)過程。語法如下:
DROP PROCEDURE [IF EXISTS] procedure_name;
-
procedure_name
是要?jiǎng)h除的存儲(chǔ)過程的名稱。 -
IF EXISTS
是可選的關(guān)鍵字,表示如果存儲(chǔ)過程不存在也不會(huì)拋出錯(cuò)誤。
-
-
DROP TRIGGER:用于刪除觸發(fā)器。語法如下:
DROP TRIGGER [IF EXISTS] trigger_name;
-
trigger_name
是要?jiǎng)h除的觸發(fā)器的名稱。 -
IF EXISTS
是可選的關(guān)鍵字,表示如果觸發(fā)器不存在也不會(huì)拋出錯(cuò)誤。
-
-
drop database ydh
刪庫
rename
在MySQL中,DDL(數(shù)據(jù)定義語言)用于創(chuàng)建、修改和刪除數(shù)據(jù)庫和數(shù)據(jù)庫對(duì)象(如表、索引、視圖等)。RENAME
是DDL語句之一,用于重命名數(shù)據(jù)庫對(duì)象。
RENAME
語句用于重命名現(xiàn)有的數(shù)據(jù)庫對(duì)象,可以是表、列、索引、視圖、存儲(chǔ)過程、觸發(fā)器等。下面是RENAME
語句的語法:
RENAME [TO] new_name;
在這個(gè)語法中,new_name
是要為對(duì)象指定的新名稱。具體的使用方法取決于要重命名的對(duì)象類型。
下面是一些示例說明了如何使用RENAME
語句來重命名不同類型的對(duì)象:
-
重命名表:
RENAME TABLE table_name TO new_table_name;
這將把名為
table_name
的表重命名為new_table_name
。 -
重命名列:
ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name;
這將把名為
table_name
中的列column_name
重命名為new_column_name
。 -
重命名索引:
ALTER TABLE table_name RENAME INDEX index_name TO new_index_name;
這將把名為
table_name
中的索引index_name
重命名為new_index_name
。 -
重命名視圖:
RENAME VIEW view_name TO new_view_name;
這將把名為
view_name
的視圖重命名為new_view_name
。
DML
MySQL中的DML代表數(shù)據(jù)操縱語言(Data Manipulation Language),它用于管理數(shù)據(jù)庫中的數(shù)據(jù)。下面是一些常見的MySQL DML語句:
call
在MySQL中,DML(數(shù)據(jù)操作語言)是用于對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作的語句。其中,CALL
語句用于調(diào)用存儲(chǔ)過程或函數(shù)。存儲(chǔ)過程和函數(shù)是預(yù)先定義的一組SQL語句,它們可以接受參數(shù)并返回結(jié)果。
下面是CALL
語句的語法:
CALL procedure_name(arguments);
其中,procedure_name
是要調(diào)用的存儲(chǔ)過程或函數(shù)的名稱,arguments
是傳遞給存儲(chǔ)過程或函數(shù)的參數(shù)列表。
以下是一些關(guān)于CALL
語句的詳細(xì)解釋和示例:
-
調(diào)用存儲(chǔ)過程:
如果要調(diào)用存儲(chǔ)過程,可以使用CALL
語句,并提供所需的參數(shù)。例如,假設(shè)有一個(gè)名為GetCustomer
的存儲(chǔ)過程,它接受一個(gè)customer_id
參數(shù),并返回相應(yīng)的客戶信息:CALL GetCustomer(123);
上述語句將調(diào)用名為
GetCustomer
的存儲(chǔ)過程,并將參數(shù)值123
傳遞給它。 -
調(diào)用函數(shù):
如果要調(diào)用函數(shù),也可以使用CALL
語句。函數(shù)調(diào)用的語法與存儲(chǔ)過程類似。例如,假設(shè)有一個(gè)名為CalculateTotal
的函數(shù),它接受兩個(gè)參數(shù)并返回它們的總和:CALL CalculateTotal(10, 20);
上述語句將調(diào)用名為
CalculateTotal
的函數(shù),并將參數(shù)值10
和20
傳遞給它。 -
獲取存儲(chǔ)過程或函數(shù)的返回值:
存儲(chǔ)過程和函數(shù)可以返回一個(gè)或多個(gè)值。要獲取存儲(chǔ)過程或函數(shù)的返回值,可以使用CALL
語句并將其結(jié)果存儲(chǔ)到變量中。例如,假設(shè)存儲(chǔ)過程GetCustomer
返回客戶的姓名和地址,可以使用以下方式獲取返回值:CALL GetCustomer(123) INTO @name, @address;
上述語句將調(diào)用
GetCustomer
存儲(chǔ)過程,并將返回的姓名和地址存儲(chǔ)在變量@name
和@address
中。
總結(jié)來說,CALL
語句用于調(diào)用存儲(chǔ)過程或函數(shù),并提供所需的參數(shù)。它可以用于執(zhí)行一系列預(yù)定義的SQL語句,并且還可以獲取存儲(chǔ)過程或函數(shù)的返回值。
delete
在MySQL中,DML(Data Manipulation Language)的DELETE語句用于從數(shù)據(jù)庫表中刪除數(shù)據(jù)。DELETE語句允許你根據(jù)特定的條件刪除表中的行。
DELETE語法如下所示:
DELETE FROM table_name
WHERE condition;
-
DELETE FROM table_name
指定要從哪個(gè)表中刪除數(shù)據(jù)。 -
WHERE condition
是可選的,它允許你指定一個(gè)條件來限制刪除的行。如果省略WHERE子句,則將刪除表中的所有行。
以下是對(duì)DELETE語句的各個(gè)部分進(jìn)行詳細(xì)解釋:
-
DELETE FROM: 這是DELETE語句的關(guān)鍵字和子句。它告訴MySQL你要執(zhí)行刪除操作,并指定要?jiǎng)h除數(shù)據(jù)的表名。
-
table_name: 這是要?jiǎng)h除數(shù)據(jù)的表的名稱。你需要替換它為實(shí)際表名。
-
WHERE condition: 這是可選的部分,它允許你指定一個(gè)條件來限制刪除的行。只有滿足條件的行才會(huì)被刪除。條件可以使用比較運(yùn)算符(如
=
,<>
,<
,>
,<=
,>=
)和邏輯運(yùn)算符(如AND
,OR
,NOT
)進(jìn)行組合。
一些示例:
-- 刪除表中的所有行
DELETE FROM table_name;
-- 刪除符合條件的行
DELETE FROM table_name
WHERE condition;
-- 刪除特定ID的行
DELETE FROM table_name
WHERE id = 1;
-- 刪除符合多個(gè)條件的行
DELETE FROM table_name
WHERE condition1 AND condition2;
需要注意的是,DELETE語句執(zhí)行后將永久性地從表中刪除數(shù)據(jù),并且無法撤銷。因此,在執(zhí)行DELETE語句之前,請(qǐng)務(wù)必謹(jǐn)慎,并確保你真正需要?jiǎng)h除這些數(shù)據(jù)。在刪除數(shù)據(jù)之前,最好先創(chuàng)建數(shù)據(jù)的備份以防止意外刪除。
do
在MySQL中,DML代表數(shù)據(jù)操作語言(Data Manipulation Language),它是一組用于在數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)操作的語句。其中,DO
是MySQL的一個(gè)DML語句之一,它允許您執(zhí)行一些簡(jiǎn)單的操作或計(jì)算,而無需返回任何結(jié)果。
DO
語句的語法如下:
DO expr
在這里,expr
是一個(gè)表達(dá)式,可以是一個(gè)函數(shù)調(diào)用、賦值操作、條件語句等。DO
語句會(huì)按照給定的順序執(zhí)行expr
中的操作,并且不會(huì)返回任何結(jié)果集。
下面是一些DO
語句的示例:
- 執(zhí)行一個(gè)簡(jiǎn)單的計(jì)算并將結(jié)果存儲(chǔ)在變量中:
DO @result := 2 + 3;
在這個(gè)例子中,DO
語句執(zhí)行了一個(gè)加法操作,并將結(jié)果存儲(chǔ)在名為@result
的用戶變量中。
- 執(zhí)行一個(gè)函數(shù)調(diào)用:
DO SLEEP(5);
這個(gè)例子中的DO
語句調(diào)用了MySQL的SLEEP
函數(shù),它會(huì)使當(dāng)前線程休眠5秒鐘。
- 使用條件語句執(zhí)行不同的操作:
DO IF (@condition = 1) THEN
-- 執(zhí)行操作1
ELSE
-- 執(zhí)行操作2
END IF;
在這個(gè)例子中,DO
語句根據(jù)條件變量@condition
的值執(zhí)行不同的操作。
需要注意的是,DO
語句通常用于執(zhí)行一些簡(jiǎn)單的操作或計(jì)算,而不是用于處理復(fù)雜的查詢或數(shù)據(jù)修改。如果您需要執(zhí)行更復(fù)雜的操作,可能需要使用其他DML語句,如SELECT
、INSERT
、UPDATE
或DELETE
。
handler
Handler是MySQL的一個(gè)存儲(chǔ)引擎接口,它允許開發(fā)者以編程的方式直接訪問存儲(chǔ)引擎,并對(duì)表的行進(jìn)行操作。Handler提供了一組方法,可以用于遍歷、讀取、修改和刪除表中的行。
以下是一些常用的Handler方法:
- handler::open:打開一個(gè)表,并返回一個(gè)句柄,用于后續(xù)的操作。
- handler::read:讀取表中的下一行數(shù)據(jù)。
- handler::update:更新當(dāng)前行的數(shù)據(jù)。
- handler::delete:刪除當(dāng)前行。
- handler::insert:在表中插入一行新數(shù)據(jù)。
- handler::index_read:根據(jù)索引讀取表中的下一行數(shù)據(jù)。
- handler::index_next:將讀取指針移動(dòng)到索引中的下一行。
使用Handler進(jìn)行行級(jí)操作的一個(gè)典型場(chǎng)景是需要對(duì)大量數(shù)據(jù)進(jìn)行批量處理或者數(shù)據(jù)的逐行處理。通過使用Handler,可以避免一次性將所有數(shù)據(jù)加載到內(nèi)存中,而是可以按需讀取和處理數(shù)據(jù),節(jié)省內(nèi)存和提高效率。
需要注意的是,Handler的功能和方法在不同的存儲(chǔ)引擎中可能有所差異,因?yàn)槊總€(gè)存儲(chǔ)引擎對(duì)于數(shù)據(jù)的組織和存儲(chǔ)方式都有自己的實(shí)現(xiàn)。因此,在使用Handler之前,需要了解所使用的存儲(chǔ)引擎對(duì)Handler的支持情況以及具體的使用方法。
另外,MySQL也提供了其他的編程接口和工具,如MySQL Connector/NET、MySQL Connector/J等,可以更方便地與MySQL數(shù)據(jù)庫進(jìn)行交互和操作。這些工具提供了更高級(jí)的抽象和功能,可以更快速地實(shí)現(xiàn)常見的數(shù)據(jù)庫操作,而無需直接使用Handler接口。
insert
在MySQL中,DML代表數(shù)據(jù)操作語言(Data Manipulation Language),用于插入、更新和刪除數(shù)據(jù)庫中的數(shù)據(jù)。在DML中,INSERT語句用于將新的行插入到數(shù)據(jù)庫表中。下面是INSERT語句的詳細(xì)解釋:
語法:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
-
INSERT INTO
:指定要插入數(shù)據(jù)的表名。 -
table_name
:要插入數(shù)據(jù)的目標(biāo)表的名稱。 -
(column1, column2, column3, ...)
:指定要插入數(shù)據(jù)的列名。如果省略列名,那么將需要為所有表的列提供值。 -
VALUES
:用于指定要插入的值。 -
(value1, value2, value3, ...)
:指定要插入的實(shí)際值。它們必須與列名的順序相對(duì)應(yīng)。
示例:
INSERT INTO customers (id, name, email)
VALUES (1, 'John Doe', 'john.doe@example.com');
在上面的示例中,我們向"customers"表中插入了一行數(shù)據(jù)。我們指定了要插入的列(id、name和email),并提供了相應(yīng)的值。
還有其他一些INSERT語句的用法,例如:
- 插入多行數(shù)據(jù):
INSERT INTO customers (id, name, email)
VALUES (1, 'John Doe', 'john.doe@example.com'),
(2, 'Jane Smith', 'jane.smith@example.com'),
(3, 'Bob Johnson', 'bob.johnson@example.com');
使用逗號(hào)分隔的多個(gè)值集來一次性插入多行數(shù)據(jù)。
- 插入選擇查詢的結(jié)果:
INSERT INTO customers (name, email)
SELECT name, email FROM new_customers;
這將從"new_customers"表中選擇"name"和"email"列的值,并將它們插入到"customers"表中的相應(yīng)列中。
注意:
- 字符串和日期類型數(shù)據(jù)應(yīng)該包含在引號(hào)中
- 插入的數(shù)據(jù)大小應(yīng)該在字段的規(guī)定范圍內(nèi)
load
在MySQL中,DML(Data Manipulation Language)是用于操作數(shù)據(jù)庫中數(shù)據(jù)的一組語句。其中之一是LOAD
語句,它用于將數(shù)據(jù)從外部源(如文本文件)加載到MySQL表中。LOAD
語句可以非常有用,特別是當(dāng)需要將大量數(shù)據(jù)批量導(dǎo)入數(shù)據(jù)庫時(shí)。
LOAD
語句的語法如下:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[FIELDS
[TERMINATED BY 'string']
[ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name = expr
[, col_name = expr] ...]
下面是LOAD
語句中的各個(gè)組成部分的詳細(xì)解釋:
-
LOW_PRIORITY
:指定在數(shù)據(jù)加載期間使用低優(yōu)先級(jí)。如果同時(shí)有其他讀操作在進(jìn)行,LOW_PRIORITY
可以避免對(duì)讀操作的干擾。它在后臺(tái)運(yùn)行,但可能導(dǎo)致加載時(shí)間延長(zhǎng)。 -
CONCURRENT
:指定在數(shù)據(jù)加載期間允許并發(fā)插入。這對(duì)于在高負(fù)載環(huán)境下加載大量數(shù)據(jù)時(shí)非常有用。但需要注意,如果表上有觸發(fā)器或外鍵約束,可能會(huì)導(dǎo)致性能下降。 -
LOCAL
:指定從客戶端的本地文件系統(tǒng)加載數(shù)據(jù),而不是從服務(wù)器文件系統(tǒng)加載。 -
INFILE 'file_name'
:指定要加載的外部數(shù)據(jù)文件的路徑和文件名。 -
REPLACE
:如果指定了該選項(xiàng),則新數(shù)據(jù)將替換表中的現(xiàn)有數(shù)據(jù),如果存在相同的唯一鍵值。注意,這將刪除現(xiàn)有數(shù)據(jù),然后插入新數(shù)據(jù)。 -
IGNORE
:如果指定了該選項(xiàng),則在加載數(shù)據(jù)時(shí)將忽略遇到的重復(fù)行,而不會(huì)導(dǎo)致錯(cuò)誤。 -
INTO TABLE tbl_name
:指定要將數(shù)據(jù)加載到的目標(biāo)表的名稱。 -
PARTITION (partition_name [, partition_name] ...)
:如果目標(biāo)表是分區(qū)表,可以指定要加載數(shù)據(jù)的特定分區(qū)。 -
CHARACTER SET charset_name
:指定外部數(shù)據(jù)文件中的字符集編碼。 -
FIELDS
:用于定義字段分隔符、字段引用符和轉(zhuǎn)義符的選項(xiàng)。 -
LINES
:用于定義行起始標(biāo)識(shí)符和行終止標(biāo)識(shí)符的選項(xiàng)。 -
IGNORE number {LINES | ROWS}
:指定要忽略的行數(shù)。 -
col_name_or_user_var
:指定要加載數(shù)據(jù)的目標(biāo)表的列名或用戶變量。 -
SET col_name = expr
:在加載數(shù)據(jù)時(shí),可以使用表達(dá)式為目標(biāo)表的列賦值。
這些選項(xiàng)可以根據(jù)需要進(jìn)行組合使用,以滿足特定的數(shù)據(jù)加載需求。需要注意的是,LOAD
語句在加載數(shù)據(jù)時(shí)執(zhí)行的是原子操作,要么全部成功,要么全部失敗,不會(huì)部分成功部分失敗。如果在加載數(shù)據(jù)期間出現(xiàn)錯(cuò)誤,可以使用SHOW WARNINGS
語句查看警告信息,并根據(jù)需要進(jìn)行調(diào)整和處理。
replace
REPLACE語句用于插入或替換數(shù)據(jù),它的工作方式類似于INSERT語句,但具有以下不同之處:
-
如果要插入的行在表中不存在,則REPLACE語句將插入一條新記錄,就像INSERT一樣。
-
如果要插入的行在表中已經(jīng)存在(根據(jù)主鍵或唯一索引判斷),則REPLACE語句將刪除已存在的行,并插入一條新記錄來替換它。
因此,REPLACE語句在插入數(shù)據(jù)時(shí)具有更新的能力,如果存在沖突的記錄,則會(huì)覆蓋它們。
REPLACE語句的基本語法如下:
REPLACE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
其中,table_name
是要進(jìn)行操作的表名,column1, column2, ...
是要插入數(shù)據(jù)的列名,value1, value2, ...
是要插入的具體數(shù)值。
需要注意的是,REPLACE語句要求目標(biāo)表至少具有一個(gè)主鍵或唯一索引,這樣才能判斷行是否已經(jīng)存在。否則,REPLACE語句將按照普通的INSERT語句進(jìn)行操作,而不會(huì)執(zhí)行替換操作。
另外,當(dāng)使用REPLACE語句替換已存在的行時(shí),MySQL會(huì)進(jìn)行以下操作:
-
刪除已存在的行。
-
插入新行。
因此,如果有其他與已存在行相關(guān)聯(lián)的數(shù)據(jù),這些數(shù)據(jù)也會(huì)被刪除。這是REPLACE和UPDATE語句之間的一個(gè)重要區(qū)別。UPDATE語句只會(huì)更新已存在行的數(shù)據(jù),而不會(huì)刪除任何數(shù)據(jù)。
需要謹(jǐn)慎使用REPLACE語句,特別是在涉及與其他表關(guān)聯(lián)的數(shù)據(jù)時(shí)。如果需要保留已存在行的相關(guān)數(shù)據(jù),應(yīng)該使用UPDATE語句進(jìn)行更新操作。
select
SELECT語句是最常用的DML語句之一,用于從數(shù)據(jù)庫表中檢索數(shù)據(jù)。下面是SELECT語句的詳細(xì)解釋和一些常見用法:
-
基本語法:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 條件;
-
列名:表示要檢索的列的名稱??梢允褂猛ㄅ浞?*)來選擇所有列。
-
表名:表示要從中檢索數(shù)據(jù)的表的名稱。
-
WHERE條件:用于過濾數(shù)據(jù)的條件表達(dá)式??梢允褂帽容^操作符(如=、<>、<、>、<=、>=)、邏輯操作符(如AND、OR、NOT)以及通配符(如LIKE)進(jìn)行條件過濾。
-
示例:
-- 選擇所有列的數(shù)據(jù) SELECT * FROM 表名; -- 選擇特定列的數(shù)據(jù) SELECT 列名1, 列名2 FROM 表名; -- 選擇符合條件的數(shù)據(jù) SELECT * FROM 表名 WHERE 列名 = 值; -- 使用邏輯操作符 SELECT * FROM 表名 WHERE 列名1 = 值1 AND 列名2 <> 值2; -- 使用通配符進(jìn)行模糊匹配 SELECT * FROM 表名 WHERE 列名 LIKE '值%';
-
結(jié)果集排序:
SELECT * FROM 表名 ORDER BY 列名 [ASC|DESC];
可以使用ORDER BY子句對(duì)結(jié)果集進(jìn)行排序。默認(rèn)情況下,按升序(ASC)對(duì)數(shù)據(jù)進(jìn)行排序,也可以使用降序(DESC)進(jìn)行排序。
-
結(jié)果集限制:
SELECT * FROM 表名 LIMIT 行數(shù) OFFSET 偏移量;
使用LIMIT關(guān)鍵字可以限制返回的行數(shù)。OFFSET可選,用于指定從結(jié)果集中的哪個(gè)位置開始返回行。
-
聚合函數(shù):
SELECT 聚合函數(shù)(列名) FROM 表名;
可以使用聚合函數(shù)(如COUNT、SUM、AVG、MIN、MAX)對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)計(jì)算。
-
select database();
查詢當(dāng)前數(shù)據(jù)庫
subqueries
子查詢(subquery)是DML語句中的一個(gè)重要概念,它是嵌套在其他查詢語句中的查詢。
子查詢可以嵌套在SELECT、INSERT、UPDATE和DELETE語句中,用于提供更復(fù)雜的查詢和操作功能。下面詳細(xì)解釋MySQL中DML中的子查詢用法:
-
SELECT語句中的子查詢:
子查詢可以用作SELECT語句中的列子查詢或表子查詢。列子查詢返回一個(gè)單一的值,作為SELECT語句中的一列數(shù)據(jù)。表子查詢返回一個(gè)結(jié)果集,作為SELECT語句中的一個(gè)表。示例1:列子查詢
SELECT column1, (SELECT column2 FROM table2 WHERE condition) AS column3 FROM table1;
示例2:表子查詢
SELECT column1, column2 FROM (SELECT column3, column4 FROM table2) AS subquery_table WHERE condition;
-
INSERT語句中的子查詢:
子查詢可以用作INSERT語句中的值來源,可以從其他表中檢索數(shù)據(jù)并插入到目標(biāo)表中。示例:
INSERT INTO table1 (column1, column2) SELECT column3, column4 FROM table2 WHERE condition;
-
UPDATE語句中的子查詢:
子查詢可以用作UPDATE語句中的條件或更新的值來源。示例1:作為條件
UPDATE table1 SET column1 = value WHERE column2 IN (SELECT column3 FROM table2 WHERE condition);
示例2:作為更新的值來源
UPDATE table1 SET column1 = (SELECT column2 FROM table2 WHERE condition) WHERE condition2;
-
DELETE語句中的子查詢:
子查詢可以用作DELETE語句中的條件,用于指定要?jiǎng)h除的行。示例:
DELETE FROM table1 WHERE column1 IN (SELECT column2 FROM table2 WHERE condition);
子查詢的優(yōu)點(diǎn)是可以使查詢更具靈活性和復(fù)雜性,可以嵌套多個(gè)子查詢以實(shí)現(xiàn)更復(fù)雜的操作。然而,過多的子查詢可能會(huì)影響查詢性能,因此在使用子查詢時(shí)應(yīng)注意優(yōu)化查詢語句,避免性能問題。
upadte
UPDATE是DML的一種操作,用于修改數(shù)據(jù)庫表中的現(xiàn)有數(shù)據(jù)。下面是對(duì)MySQL中UPDATE語句的詳細(xì)解釋:
語法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
-
table_name
:指定要更新數(shù)據(jù)的表名。 -
SET
:指定要更新的列和對(duì)應(yīng)的新值。 -
column1 = value1, column2 = value2, ...
:指定要更新的列和它們的新值。可以更新多個(gè)列,每個(gè)列和值之間使用等號(hào)(=)分隔,不同列之間使用逗號(hào)(,)分隔。 -
WHERE
:可選的,用于指定更新數(shù)據(jù)的條件。只有滿足條件的行才會(huì)被更新。如果沒有指定WHERE子句,將更新表中的所有行。
示例:
假設(shè)有一個(gè)名為users
的表,包含id
、name
和age
列。我們可以使用UPDATE語句來更新表中的數(shù)據(jù):
UPDATE users
SET name = 'John', age = 30
WHERE id = 1;
上述示例將表users
中id
為1的行的name
列更新為’John’,age
列更新為30。
注意事項(xiàng):
- 如果不提供
WHERE
子句,將會(huì)更新表中的所有行,這可能導(dǎo)致意外修改大量數(shù)據(jù)。 - 使用
WHERE
子句可以精確指定要更新的行,避免對(duì)整個(gè)表進(jìn)行更新。 - 在
SET
子句中,可以使用表達(dá)式、函數(shù)或者其他列的值來計(jì)算新值。 - 可以一次性更新多個(gè)列,每個(gè)列和新值之間使用等號(hào)(=)進(jìn)行分隔。
- 更新操作會(huì)直接修改數(shù)據(jù)庫中的數(shù)據(jù),請(qǐng)謹(jǐn)慎使用,并確保在執(zhí)行之前備份重要數(shù)據(jù)。
truncate
在MySQL中,DDL(數(shù)據(jù)定義語言)用于定義和管理數(shù)據(jù)庫對(duì)象,如表、索引、視圖等。其中,TRUNCATE語句是DDL語句之一,用于刪除表中的所有數(shù)據(jù)。
TRUNCATE TABLE語句的作用是快速清空表中的數(shù)據(jù),但保留表的結(jié)構(gòu)、索引和約束等定義。與DELETE語句不同,TRUNCATE TABLE語句不會(huì)記錄每一行刪除的操作日志,因此執(zhí)行速度更快。這使得TRUNCATE TABLE語句在需要?jiǎng)h除表中所有數(shù)據(jù)時(shí)是一種高效的選擇。
下面是TRUNCATE TABLE語句的語法:
TRUNCATE TABLE table_name;
其中,table_name
是要清空數(shù)據(jù)的表名。
需要注意以下幾點(diǎn):
-
TRUNCATE TABLE語句將刪除表中的所有行,而不是僅刪除部分行。因此,在執(zhí)行此語句之前,應(yīng)謹(jǐn)慎備份或確認(rèn)數(shù)據(jù)不再需要。
-
TRUNCATE TABLE語句將重置自增列(如果有的話),使下一次插入的數(shù)據(jù)從起始值開始。
-
TRUNCATE TABLE語句不會(huì)觸發(fā)與表相關(guān)聯(lián)的觸發(fā)器(Trigger)。
-
TRUNCATE TABLE語句的執(zhí)行權(quán)限要求與DELETE語句相同。
-
TRUNCATE TABLE語句不能用于視圖,只能用于表。
總之,TRUNCATE TABLE語句是一種快速清空表數(shù)據(jù)的方法,適用于需要?jiǎng)h除表中所有數(shù)據(jù)而不關(guān)心逐行刪除的情況。但請(qǐng)務(wù)必在執(zhí)行此語句之前進(jìn)行數(shù)據(jù)備份或確認(rèn)數(shù)據(jù)不再需要。
truncate和delete區(qū)別
MySQL的delete和truncate有以下主要區(qū)別:
- delete刪除指定的記錄, truncate清空整個(gè)表。
- delete影響行數(shù),可以返回刪除的記錄數(shù)量。truncate不返回影響的行數(shù)。
- delete支持where條件,可以 selectively刪除記錄。truncate清空整張表。
- delete可以被回滾(會(huì)產(chǎn)生二進(jìn)制日志),支持事務(wù)。truncate是一個(gè)非事務(wù)性操作, committed后無法回滾(不會(huì)產(chǎn)生二進(jìn)制日志)。
- truncate效率更高,對(duì)于大表速度比delete快很多。
- truncate清空表后,自動(dòng)重新設(shè)置自增列。delete不會(huì)影響auto_increment的值。
- 使用truncate后,需要重新創(chuàng)建表的約束(constraints)和觸發(fā)器(triggers)。
用法:
- delete刪除指定記錄:
delete from table_name where condition;
- truncate清空整張表:
truncate table table_name;
一般來說:
- 如果要選擇性的刪除表中的某些記錄,使用delete。
- 如果要清空一張大表的數(shù)據(jù)(不刪除表結(jié)構(gòu)),使用truncate。 truncate效率更高。
insert和replace區(qū)別
insert 和replace的區(qū)別主要有:
- insert用于向表中插入新記錄。replace用于替換表中的已存在記錄。
- insert不會(huì)替換已存在的記錄,如果有重復(fù)的主鍵或唯一索引,則插入失敗。replace會(huì)先刪除已存在的記錄,然后插入新記錄。
- insert可以插入多條記錄,使用值列表。replace只能替換一條記錄。
- insert不影響其他非重復(fù)唯一索引。replace會(huì)刪除已存在的記錄,然后插入新記錄,會(huì)影響其他索引。
- insert默認(rèn)不更新自動(dòng)增長(zhǎng)編號(hào),replace會(huì)重新設(shè)定自動(dòng)增長(zhǎng)編號(hào)。
用法:
- insert插入:
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
- replace替換:
REPLACE INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
一般來說:
- 如果要向表中插入全新記錄,使用insert。
- 如果要替換已存在的記錄(根據(jù)主鍵或唯一索引),使用replace。 replace相當(dāng)于先delete該條記錄,然后再insert一條相同的記錄。
所以:
- 如果只是更新記錄內(nèi)容,而不是完全替換一條記錄,最好使用update語句。
- 如果要批量插入記錄,使用insert更高效。
DQL
MySQL的DQL(Data Query Language)是指用于執(zhí)行數(shù)據(jù)查詢操作的語言,主要用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。
DQL包括了一系列的關(guān)鍵字、子句和函數(shù),用于指定查詢的邏輯和條件。以下是MySQL中常用的DQL關(guān)鍵字和子句的詳細(xì)介紹:
-
SELECT:用于指定要查詢的字段列表??梢赃x擇查詢所有字段(使用星號(hào) *)或指定具體的字段名。
-
FROM:用于指定要查詢的表名或表的聯(lián)接。可以查詢單個(gè)表或多個(gè)表的聯(lián)接結(jié)果。
-
WHERE:用于指定查詢的篩選條件。可以使用各種條件操作符(例如等于、大于、小于等)來篩選滿足特定條件的數(shù)據(jù)。
-
GROUP BY:用于按照指定的字段進(jìn)行分組??梢詫?shù)據(jù)按照某個(gè)或多個(gè)字段的值進(jìn)行分組,通常用于配合聚合函數(shù)進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。
-
HAVING:對(duì)分組后的結(jié)果進(jìn)行篩選??梢允褂脳l件表達(dá)式篩選滿足特定條件的分組數(shù)據(jù)。
-
ORDER BY:用于指定查詢結(jié)果的排序方式??梢园凑找粋€(gè)或多個(gè)字段進(jìn)行升序(ASC)或降序(DESC)排序。
-
LIMIT:用于限制返回結(jié)果的數(shù)量,用于分頁或限制返回行數(shù)??梢灾付◤牟樵兘Y(jié)果中的哪一行開始,以及返回的行數(shù)。
除了關(guān)鍵字和子句,MySQL的DQL還支持各種內(nèi)置函數(shù)和運(yùn)算符,用于處理查詢結(jié)果、轉(zhuǎn)換數(shù)據(jù)類型、進(jìn)行數(shù)學(xué)計(jì)算等。
通過組合使用這些關(guān)鍵字、子句和函數(shù),你可以構(gòu)建復(fù)雜的查詢語句,從數(shù)據(jù)庫中獲取特定條件下的數(shù)據(jù)、進(jìn)行數(shù)據(jù)統(tǒng)計(jì)和分組、排序結(jié)果等。
SELECT
WHERE
在MySQL中,WHERE
子句是用于在查詢語句中指定篩選條件的關(guān)鍵字。它用于從表中選擇滿足特定條件的數(shù)據(jù)行,并將其包含在結(jié)果集中。
語法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
WHERE condition;
-
SELECT
:指定要查詢的列名或使用通配符*
查詢所有列。 -
FROM
:指定要查詢的表名。 -
WHERE
:用于指定篩選條件。
在 WHERE
子句中,可以使用各種比較操作符和邏輯操作符來構(gòu)建條件表達(dá)式。這些操作符用于比較列與值之間的關(guān)系,或比較列與列之間的關(guān)系,以確定是否滿足特定的條件。
條件:
比較運(yùn)算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN … AND … | 在某個(gè)范圍內(nèi)(含最小、最大值) |
IN(…) | 在in之后的列表中的值,多選一 |
LIKE 占位符 | 模糊匹配(_匹配單個(gè)字符,%匹配任意個(gè)字符) |
IS NULL | 是NULL |
邏輯運(yùn)算符 | 功能 |
---|---|
AND 或 && | 并且(多個(gè)條件同時(shí)成立) |
OR 或 || | 或者(多個(gè)條件任意一個(gè)成立) |
NOT 或 ! | 非,不是 |
xor | 異或 |
還可以使用正則
例子
SELECT *
FROM employees
WHERE age > 25 AND salary > 50000;
上述查詢使用了兩個(gè)條件,篩選出年齡大于25且薪資大于50000的員工數(shù)據(jù)。
between…and使用
SELECT PLAYERNO,BIRTH_DATE
FROM PLAYERS
WHERE YEAR(BIRTH_DATE) BETWEEN 1962 AND 1964;
in、not in
SELECT PLAYERNO,BIRTH_DATE
FROM PLAYERS
WHERE YEAR(BIRTH_DATE) IN(1965,1963,1970);
SELECT PLAYERNO,BIRTH_DATE
FROM PLAYERS
WHERE YEAR(BIRTH_DATE) NOT IN(1965,1963,1970);
like
在MySQL中,
LIKE
是一種用于模式匹配的操作符,常用于在查詢中比較字符串。
LIKE
操作符通常與通配符一起使用,以確定一個(gè)字符串是否與給定的模式相匹配。以下是常用的通配符:
- 百分號(hào)(%):表示任意字符序列(包括零個(gè)字符或多個(gè)字符)。
- 例如:
'abc%'
匹配以 “abc” 開頭的任意字符序列。
- 下劃線(_):表示單個(gè)字符的任意位置。
- 例如:
'a_c'
匹配以 “a” 開頭、以 “c” 結(jié)尾的三個(gè)字符的序列。在某些情況下,如果要在模式中使用通配符字符
%
或_
本身,而不是作為通配符,需要進(jìn)行轉(zhuǎn)義。在MySQL中,可以使用\
進(jìn)行轉(zhuǎn)義。在使用
LIKE
操作符時(shí),可以在查詢中將通配符放置在待匹配的字符串中,以進(jìn)行模式匹配。以下是幾個(gè)示例:
- 匹配以特定字符串開頭的值:
SELECT column_name FROM table_name WHERE column_name LIKE 'abc%';
- 匹配以特定字符串結(jié)尾的值:
SELECT column_name FROM table_name WHERE column_name LIKE '%xyz';
- 匹配包含特定字符串的值:
SELECT column_name FROM table_name WHERE column_name LIKE '%def%';
- 使用下劃線進(jìn)行單個(gè)字符匹配:
SELECT column_name FROM table_name WHERE column_name LIKE 'a_c';
需要注意的是,
LIKE
操作符默認(rèn)是不區(qū)分大小寫的,如果要進(jìn)行大小寫敏感的匹配,可以使用COLLATE
子句指定區(qū)分大小寫的字符集。
regexp
在MySQL中,REGEXP
是一種用于執(zhí)行正則表達(dá)式匹配的操作符。它用于比較一個(gè)字符串是否與指定的正則表達(dá)式模式匹配。
REGEXP
操作符的語法如下:
SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP pattern;
其中,column_name
是要比較的列名,table_name
是要查詢的表名,pattern
是要匹配的正則表達(dá)式模式。
正則表達(dá)式是一種用于模式匹配和搜索的強(qiáng)大工具,可以使用各種元字符和模式修飾符來定義匹配規(guī)則。在 MySQL 中,使用基于 POSIX 擴(kuò)展的正則表達(dá)式語法。
以下是一些常見的正則表達(dá)式元字符和模式修飾符的示例:
-
.
:匹配任意單個(gè)字符。 -
*
:匹配前一個(gè)元素零次或多次。 -
+
:匹配前一個(gè)元素一次或多次。 -
?
:匹配前一個(gè)元素零次或一次。 -
^
:匹配輸入字符串的開始位置。 -
$
:匹配輸入字符串的結(jié)束位置。 -
[...]
:匹配方括號(hào)內(nèi)的任意一個(gè)字符。 -
(a|b)
:匹配a
或b
。
例如,以下是幾個(gè)使用 REGEXP
進(jìn)行正則表達(dá)式匹配的示例:
-
匹配以數(shù)字開頭的字符串:
SELECT column_name FROM table_name WHERE column_name REGEXP '^[0-9]';
-
匹配包含指定單詞的字符串:
SELECT column_name FROM table_name WHERE column_name REGEXP '[[:<:]]word[[:>:]]';
-
匹配以特定模式結(jié)尾的字符串:
SELECT column_name FROM table_name WHERE column_name REGEXP 'pattern$';
需要注意的是,正則表達(dá)式模式區(qū)分大小寫。如果希望進(jìn)行不區(qū)分大小寫的匹配,可以在 REGEXP
前面添加 BINARY
關(guān)鍵字。
FROM
GROUP BY
在MySQL中,分組查詢(Group By)用于將結(jié)果集按照一個(gè)或多個(gè)列的值進(jìn)行分組,并對(duì)每個(gè)組應(yīng)用聚合函數(shù),如求和、計(jì)數(shù)、平均值等。分組查詢常用于統(tǒng)計(jì)和匯總數(shù)據(jù)。
下面是分組查詢的基本語法:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
WHERE conditions
GROUP BY column1, column2, ...
其中,column1, column2, ...
是你要選擇的列名,aggregate_function(column)
是對(duì)某一列應(yīng)用的聚合函數(shù)(如SUM、COUNT、AVG等),table_name
是要查詢的表名,conditions
是可選的篩選條件。
以下是一個(gè)示例,演示如何使用分組查詢計(jì)算每個(gè)部門的平均工資:
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
上述查詢從名為 employees
的表中選擇了 department
列和 salary
列,并對(duì) salary
列應(yīng)用了聚合函數(shù) AVG
。然后,根據(jù) department
列對(duì)結(jié)果進(jìn)行分組,最后得到每個(gè)部門的平均工資。
注意事項(xiàng):
- 分組查詢中可以同時(shí)使用多個(gè)列進(jìn)行分組,只需在
GROUP BY
子句中指定相應(yīng)的列名即可。 - 除了聚合函數(shù)之外,SELECT 子句中列名必須是分組列或聚合函數(shù)的結(jié)果列。
- 可以使用 HAVING 子句對(duì)分組后的結(jié)果進(jìn)行進(jìn)一步篩選。
例如,以下查詢演示了如何篩選出平均工資大于 5000 的部門:
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING average_salary > 5000;
SELECT playerno,SUM(amount) FROM PENALTIES GROUP BY playerno ORDER BY SUM(amount) DESC
HAVING
在MySQL中,HAVING
子句用于在查詢結(jié)果上應(yīng)用篩選條件,對(duì)分組后的數(shù)據(jù)進(jìn)行篩選。它通常與 GROUP BY
子句一起使用,用于對(duì)聚合函數(shù)的結(jié)果進(jìn)行過濾。
以下是 HAVING
子句的詳細(xì)解釋:
語法:
SELECT column1, column2, ...
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;
-
SELECT
:指定要查詢的列名或使用通配符*
查詢所有列。 -
FROM
:指定要查詢的表名。 -
GROUP BY
:用于對(duì)結(jié)果進(jìn)行分組的列或表達(dá)式。 -
HAVING
:用于指定篩選條件。
HAVING
子句類似于 WHERE
子句,但它是在分組后應(yīng)用于分組結(jié)果的。它允許你對(duì)分組的結(jié)果使用聚合函數(shù),并篩選滿足特定條件的分組。
例如,以下是一個(gè)使用 HAVING
子句的示例:
SELECT category, COUNT(*) as count
FROM products
GROUP BY category
HAVING count > 5;
上述示例中,查詢了 products
表中的不同產(chǎn)品類別,并使用 GROUP BY
對(duì)它們進(jìn)行分組。然后使用 HAVING
子句篩選出產(chǎn)品數(shù)超過5個(gè)的分組。
需要注意的是,HAVING
子句只能在使用 GROUP BY
進(jìn)行分組操作時(shí)使用。它對(duì)分組結(jié)果進(jìn)行篩選,而不是對(duì)原始數(shù)據(jù)行進(jìn)行篩選。如果不使用 GROUP BY
子句,HAVING
子句將不起作用。
使用 HAVING
子句可以對(duì)聚合函數(shù)的結(jié)果進(jìn)行進(jìn)一步篩選,以滿足特定的條件。它允許對(duì)分組后的數(shù)據(jù)進(jìn)行篩選,并從中選擇滿足條件的分組結(jié)果。
例子
有多少球員住在Stratford并且性別是男性的,輸出數(shù)量和名字?
SELECT town,COUNT(*) ,GROUP_CONCAT(NAME) FROM PLAYERS
GROUP BY TOWN
HAVING TOWN = "Stratford"
ORDER BY
在MySQL中,ORDER BY
子句用于對(duì)查詢結(jié)果進(jìn)行排序,按照指定的列或表達(dá)式的值進(jìn)行升序或降序排列。ORDER BY
子句通常緊跟在 SELECT
語句的最后。
以下是 ORDER BY
子句的詳細(xì)介紹:
語法:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
-
SELECT
:指定要查詢的列名或使用通配符*
查詢所有列。 -
FROM
:指定要查詢的表名。 -
ORDER BY
:用于指定排序的列或表達(dá)式,以及排序的順序。
在 ORDER BY
子句中,可以指定一個(gè)或多個(gè)列作為排序的依據(jù)。每個(gè)列可以單獨(dú)指定升序(ASC,默認(rèn))或降序(DESC)排序方式。如果沒有指定排序方式,默認(rèn)為升序排序。
例如,以下是幾個(gè)使用 ORDER BY
進(jìn)行排序的示例:
-
按照單個(gè)列進(jìn)行排序:
SELECT name, age, city FROM customers ORDER BY age DESC;
上述示例將按照
age
列的降序?qū)Y(jié)果進(jìn)行排序。 -
按照多個(gè)列進(jìn)行排序:
SELECT name, age, city FROM customers ORDER BY city ASC, age DESC;
上述示例將首先按照
city
列的升序排序,然后在相同的city
值下按照age
列的降序排序。
需要注意的是,可以根據(jù)具體需求在 ORDER BY
子句中指定任意數(shù)量的列。排序的順序是從左到右依次應(yīng)用的,即先按照第一個(gè)列排序,再按照第二個(gè)列排序,以此類推。
注意
只有在group by出現(xiàn)的字段才能在select選擇,其他的需要聚合函數(shù)
例子
查詢每個(gè)城市的名稱和球員的數(shù)量
SELECT town,COUNT(*) FROM PLAYERS GROUP BY town
LIMIT
在MySQL中,LIMIT
子句用于限制查詢結(jié)果返回的行數(shù)。它通常與 SELECT
語句一起使用,用于分頁或限制結(jié)果集大小。
以下是 LIMIT
子句的詳細(xì)介紹:
語法:
SELECT column1, column2, ...
FROM table_name
LIMIT offset, count;
-
SELECT
:指定要查詢的列名或使用通配符*
查詢所有列。 -
FROM
:指定要查詢的表名。 -
LIMIT
:用于指定限制條件。
LIMIT
子句中有兩個(gè)參數(shù):
-
offset
:指定從結(jié)果集中的哪一行開始返回?cái)?shù)據(jù)(偏移量),默認(rèn)從第一行開始。 -
count
:指定要返回的行數(shù)。
例如,以下是幾個(gè)使用 LIMIT
進(jìn)行結(jié)果集限制的示例:
-
返回前 n 行:
SELECT * FROM table_name LIMIT n;
上述示例將返回查詢結(jié)果中的前 n 行數(shù)據(jù)。
-
返回從 m 行開始的 n 行數(shù)據(jù):
SELECT * FROM table_name LIMIT m, n;
上述示例將返回從第 m+1 行開始的 n 行數(shù)據(jù)。
LIMIT
子句對(duì)于分頁查詢非常有用,可以將大的結(jié)果集劃分為多個(gè)頁面顯示。通過指定偏移量和行數(shù),可以選擇要返回的特定數(shù)據(jù)范圍。
需要注意的是,LIMIT
子句在排序之前應(yīng)用。因此,如果沒有指定排序規(guī)則,結(jié)果集的順序可能是不確定的。
總結(jié)來說,LIMIT
子句用于限制查詢結(jié)果返回的行數(shù)。它通過指定偏移量和行數(shù)來選擇要返回的特定數(shù)據(jù)范圍。在分頁查詢和結(jié)果集限制方面,LIMIT
子句是一個(gè)非常有用的工具。
例子
得到球員編號(hào)最低的5個(gè)球員的編號(hào)和名字,從第4個(gè)球員開始
SELECT playerno,NAME FROM PLAYERS
ORDER BY playerno
LIMIT 3,5
該查詢語句將從
PLAYERS
表中選擇playerno
和NAME
兩列的數(shù)據(jù),并按照playerno
列的升序進(jìn)行排序。然后,從排序后的結(jié)果中跳過前 3 行,返回接下來的 5 行數(shù)據(jù)作為最終的結(jié)果集。
和子查詢連用
4個(gè)最低的罰款額的平均值是多少?
SELECT AVG(amount) FROM
(SELECT DISTINCT amount FROM PENALTIES
ORDER BY amount
LIMIT 4) result;
該查詢語句首先從
PENALTIES
表中選擇不重復(fù)的amount
列值,并按照升序進(jìn)行排序,然后僅返回前 4 行數(shù)據(jù)。接下來,針對(duì)這個(gè)結(jié)果集進(jìn)行平均值計(jì)算,并將平均值作為最終結(jié)果返回。
為什么一定要有別名的原因
在該查詢語句中,將子查詢
(SELECT DISTINCT amount FROM PENALTIES ORDER BY amount LIMIT 4)
命名為result
是為了將其作為一個(gè)臨時(shí)表或視圖,并為其創(chuàng)建一個(gè)可引用的別名。這樣可以在外部查詢中引用該子查詢的結(jié)果。
where和having區(qū)別
MySQL中的WHERE
和HAVING
都是用于在查詢中過濾數(shù)據(jù)的子句,但它們?cè)谑褂煤瓦m用范圍上有一些區(qū)別。
-
WHERE
子句:-
WHERE
子句用于在查詢中過濾行數(shù)據(jù),它出現(xiàn)在SELECT
語句中的FROM
子句之后和GROUP BY
子句之前。 -
WHERE
子句可以包含條件表達(dá)式,用于篩選滿足特定條件的行。 -
WHERE
子句中使用的條件表達(dá)式可以包含列名、運(yùn)算符(如=
、<>
、<
、>
、LIKE
等)和常量值。 -
WHERE
子句可以使用邏輯運(yùn)算符(如AND
、OR
、NOT
)將多個(gè)條件組合起來。
-
-
HAVING
子句:-
HAVING
子句用于在查詢中過濾分組后的數(shù)據(jù),它出現(xiàn)在GROUP BY
子句之后和ORDER BY
子句之前。 -
HAVING
子句可以包含條件表達(dá)式,用于篩選滿足特定條件的分組。 -
HAVING
子句中使用的條件表達(dá)式可以包含聚合函數(shù)(如SUM
、AVG
、COUNT
等)、列名、運(yùn)算符和常量值。 -
HAVING
子句可以使用邏輯運(yùn)算符將多個(gè)條件組合起來。
-
主要區(qū)別:
-
WHERE
子句在查詢執(zhí)行之前進(jìn)行過濾,它作用于原始數(shù)據(jù)表中的行,排除不符合條件的行。而HAVING
子句在數(shù)據(jù)分組之后進(jìn)行過濾,它作用于分組后的結(jié)果集,排除不符合條件的分組。 -
WHERE
子句可以在任何查詢中使用,無論是否有分組操作。而HAVING
子句只能在包含GROUP BY
子句的查詢中使用。 -
WHERE
子句中的條件可以包含任何列,包括聚合函數(shù)的參數(shù)列。而HAVING
子句中的條件只能使用聚合函數(shù)和分組后的列。
簡(jiǎn)而言之,WHERE
用于篩選行數(shù)據(jù),HAVING
用于篩選分組后的數(shù)據(jù)。如果沒有分組操作,通常使用WHERE
子句;如果有分組操作,需要對(duì)分組進(jìn)行過濾時(shí),使用HAVING
子句。
- 執(zhí)行順序:where > 聚合函數(shù) > having
- 分組之后,查詢的字段一般為聚合函數(shù)和分組字段,查詢其他字段無任何意義
其他
show
下面是SHOW語句的幾種常見用法和它們的詳解:
-
SHOW DATABASES;
這個(gè)語句用于顯示所有可用的數(shù)據(jù)庫。它返回一個(gè)結(jié)果集,其中包含數(shù)據(jù)庫的名稱列表。 -
SHOW TABLES;
這個(gè)語句用于顯示當(dāng)前數(shù)據(jù)庫中的所有表。它返回一個(gè)結(jié)果集,其中包含表的名稱列表。 -
SHOW COLUMNS FROM table_name;
這個(gè)語句用于顯示指定表的列信息。它返回一個(gè)結(jié)果集,其中包含列的名稱、數(shù)據(jù)類型、長(zhǎng)度、是否允許NULL值等信息。 -
SHOW INDEX FROM table_name;
這個(gè)語句用于顯示指定表的索引信息。它返回一個(gè)結(jié)果集,其中包含索引的名稱、所屬表、列名等信息。 -
SHOW CREATE TABLE table_name;
這個(gè)語句用于顯示創(chuàng)建指定表的DDL語句。它返回一個(gè)結(jié)果集,其中包含創(chuàng)建表的完整DDL語句。 -
SHOW PROCESSLIST;
這個(gè)語句用于顯示當(dāng)前數(shù)據(jù)庫服務(wù)器上的所有活動(dòng)連接和它們的相關(guān)信息。它返回一個(gè)結(jié)果集,其中包含連接ID、用戶、執(zhí)行的查詢等信息。 -
SHOW VARIABLES;
這個(gè)語句用于顯示當(dāng)前數(shù)據(jù)庫服務(wù)器的配置變量信息。它返回一個(gè)結(jié)果集,其中包含變量的名稱和值。 -
show create database ydh;
MySQL將返回一個(gè)包含名為"ydh"的數(shù)據(jù)庫創(chuàng)建語句的結(jié)果集。
desc
在MySQL中,DESC(Describe)是一種DDL(數(shù)據(jù)定義語言)命令,用于顯示表結(jié)構(gòu)的詳細(xì)信息。DESC命令用于顯示表的列名、數(shù)據(jù)類型、默認(rèn)值、是否為NULL、鍵信息等,以便更好地了解表的結(jié)構(gòu)和內(nèi)容。
以下是DESC命令的常見用法和示例:
- 顯示表結(jié)構(gòu)
使用DESC語句可以顯示指定表的結(jié)構(gòu)。例如:
DESC mytable;
上述語句將顯示mytable表的結(jié)構(gòu),包括列名、數(shù)據(jù)類型、默認(rèn)值、是否為NULL、鍵信息等。
- 顯示視圖結(jié)構(gòu)
使用DESC語句也可以顯示指定視圖的結(jié)構(gòu)。例如:
DESC myview;
上述語句將顯示myview視圖的結(jié)構(gòu),包括列名、數(shù)據(jù)類型、默認(rèn)值、是否為NULL等。
需要注意的是,DESC命令用于顯示表或視圖的結(jié)構(gòu)信息,但并不執(zhí)行任何實(shí)際的操作。在使用DESC命令時(shí),應(yīng)該確保指定正確的表或視圖名稱,并注意表或視圖的大小寫、引號(hào)等細(xì)節(jié)。
use
USE
是一種特殊的 DML 語句,用于選擇當(dāng)前要操作的數(shù)據(jù)庫。
USE
語句的語法如下:
USE database_name;
其中,database_name
是要選擇的數(shù)據(jù)庫的名稱。
USE
語句的作用是將當(dāng)前會(huì)話的默認(rèn)數(shù)據(jù)庫更改為指定的數(shù)據(jù)庫。一旦執(zhí)行了 USE
語句,后續(xù)的 DML 語句將在指定的數(shù)據(jù)庫上執(zhí)行,除非另外指定了數(shù)據(jù)庫的名稱。
例如,假設(shè)我們有兩個(gè)數(shù)據(jù)庫:db1
和 db2
。如果我們想在 db1
中執(zhí)行操作,我們可以使用以下語句:
USE db1;
現(xiàn)在,任何后續(xù)的 DML 語句(如 SELECT
、INSERT
、UPDATE
、DELETE
等)將默認(rèn)在 db1
數(shù)據(jù)庫上執(zhí)行。如果我們希望在 db2
數(shù)據(jù)庫上執(zhí)行操作,我們可以再次使用 USE
語句切換到 db2
:
USE db2;
需要注意的是,USE
語句只影響當(dāng)前會(huì)話中的默認(rèn)數(shù)據(jù)庫,對(duì)其他會(huì)話沒有影響。當(dāng)會(huì)話結(jié)束時(shí),默認(rèn)數(shù)據(jù)庫將重置為連接時(shí)的默認(rèn)數(shù)據(jù)庫。
使用 USE
語句可以方便地切換數(shù)據(jù)庫,避免在每個(gè) DML 語句中都指定數(shù)據(jù)庫名稱。
comment
在MySQL中,COMMENT
是一種用于給數(shù)據(jù)庫對(duì)象(如表、列、索引等)添加注釋或描述的功能。注釋對(duì)于理解數(shù)據(jù)庫結(jié)構(gòu)、目的和用途非常有幫助,特別是在多人協(xié)作或維護(hù)大型數(shù)據(jù)庫時(shí)。
在MySQL中,可以使用COMMENT
關(guān)鍵字來添加注釋。下面是一些常見的用法和示例:
-
表注釋:可以在創(chuàng)建表時(shí)或者修改表時(shí)為表添加注釋。
-
創(chuàng)建表時(shí)添加注釋:
CREATE TABLE my_table ( id INT, name VARCHAR(50) ) COMMENT 'This is my table';
-
修改表時(shí)添加注釋:
ALTER TABLE my_table COMMENT 'This is my table';
-
-
列注釋:可以在創(chuàng)建表時(shí)或者修改表時(shí)為表中的列添加注釋。
-
創(chuàng)建表時(shí)添加注釋:
CREATE TABLE my_table ( id INT COMMENT 'Unique identifier', name VARCHAR(50) COMMENT 'Name of the entity' );
-
修改表時(shí)添加注釋:
ALTER TABLE my_table MODIFY COLUMN id INT COMMENT 'Unique identifier';
-
-
索引注釋:可以為索引添加注釋,幫助理解索引的作用或用途。
-
創(chuàng)建索引時(shí)添加注釋:
CREATE INDEX index_name ON my_table (column_name) COMMENT 'Index for efficient searching';
-
-
視圖注釋:可以為視圖添加注釋,描述視圖的目的和功能。
-
創(chuàng)建視圖時(shí)添加注釋:
CREATE VIEW my_view AS SELECT * FROM my_table COMMENT 'This is my view';
-
-
存儲(chǔ)過程和函數(shù)注釋:可以為存儲(chǔ)過程和函數(shù)添加注釋,提供說明和使用方法。
-
創(chuàng)建存儲(chǔ)過程時(shí)添加注釋:
CREATE PROCEDURE my_procedure() COMMENT 'This is my stored procedure' BEGIN -- Procedure logic goes here END;
-
創(chuàng)建函數(shù)時(shí)添加注釋:
CREATE FUNCTION my_function() RETURNS INT COMMENT 'This is my function' BEGIN -- Function logic goes here END;
-
可以使用SHOW CREATE TABLE
語句或查詢INFORMATION_SCHEMA
數(shù)據(jù)庫中的相應(yīng)表來查看數(shù)據(jù)庫對(duì)象的注釋信息。例如,要查看表注釋,可以運(yùn)行以下查詢:
SELECT TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'your_table_name';
注釋對(duì)于文檔化數(shù)據(jù)庫結(jié)構(gòu)、提高代碼可讀性和協(xié)作非常有用。它們可以幫助開發(fā)人員更好地理解數(shù)據(jù)庫對(duì)象的用途和設(shè)計(jì)意圖。
engine
MySQL是一種流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它提供了多種存儲(chǔ)引擎(Engine)供用戶選擇。存儲(chǔ)引擎是MySQL用于存儲(chǔ)、檢索和管理數(shù)據(jù)的組件。每個(gè)存儲(chǔ)引擎都有其特定的功能、優(yōu)勢(shì)和限制,允許用戶根據(jù)應(yīng)用程序的需求選擇最適合的引擎。
以下是MySQL中一些常見的存儲(chǔ)引擎:
-
MyISAM:這是MySQL的默認(rèn)存儲(chǔ)引擎,在早期版本中使用較為廣泛。它使用表級(jí)鎖定(table-level locking)來控制并發(fā)訪問,適用于讀密集型應(yīng)用。MyISAM不支持事務(wù)處理和崩潰恢復(fù),但具有較高的性能和較小的存儲(chǔ)空間需求。
- 使用myisam
root@ydh 20:36 mysql>create table test(id int,name varchar(10)) engine=myisam; Query OK, 0 rows affected (0.01 sec)
[root@mysql ydh]# ls db.opt student_info.frm student_info.ibd test.frm test.MYD test.MYI
- test.frm: 表結(jié)構(gòu)文件,frame框架
- test.MYD :存放數(shù)據(jù)
- test.MYI:存儲(chǔ)索引
索引
索引在數(shù)據(jù)庫中起到了重要的作用,它們提供了一種快速訪問數(shù)據(jù)庫表中數(shù)據(jù)的方式。索引是特殊的數(shù)據(jù)結(jié)構(gòu),用于加快數(shù)據(jù)庫查詢的速度和性能。當(dāng)你執(zhí)行查詢時(shí),數(shù)據(jù)庫可以利用索引來快速定位和檢索符合查詢條件的數(shù)據(jù),而不需要逐行掃描整個(gè)表
-
InnoDB:這是MySQL的另一個(gè)常用存儲(chǔ)引擎,也是默認(rèn)的事務(wù)性存儲(chǔ)引擎。InnoDB支持行級(jí)鎖定(row-level locking),提供了高度的并發(fā)性能和事務(wù)支持。它具有較好的崩潰恢復(fù)機(jī)制和數(shù)據(jù)完整性保護(hù),并支持外鍵約束。
-
MEMORY:(基于hash)也稱為HEAP,它將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,以提供快速的讀寫訪問。MEMORY存儲(chǔ)引擎適用于臨時(shí)表、緩存和其他需要快速訪問的數(shù)據(jù)。但是,由于數(shù)據(jù)存儲(chǔ)在內(nèi)存中,它對(duì)于大量數(shù)據(jù)的存儲(chǔ)有限制。
-
csv: 是一個(gè)文本文件,里面的字段以逗號(hào)作為分割符號(hào) --》文件存儲(chǔ)的文件 --》數(shù)據(jù)分析
-
[root@mysql ~]# awk -F: 'OFS=","{print $1,$2,$3,$5}' /etc/passwd >test_csv.csv
-
指定引擎
-
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... ) ENGINE = engine_name;
-
要在MySQL中選擇存儲(chǔ)引擎,你可以在創(chuàng)建表時(shí)使用ENGINE關(guān)鍵字指定引擎類型,或者在配置文件中設(shè)置默認(rèn)引擎。此外,你還可以使用ALTER TABLE語句更改現(xiàn)有表的存儲(chǔ)引擎。
別名
在MySQL中,別名(Alias)是一種給表名、列名或表達(dá)式指定臨時(shí)名稱的方法。使用別名可以簡(jiǎn)化查詢語句、提高可讀性,并允許對(duì)結(jié)果集中的列進(jìn)行重命名(可以不接as)。
別名可以在SELECT語句和FROM子句中使用,如下所示:
-
列別名:
- 列別名用于給查詢結(jié)果中的列指定一個(gè)臨時(shí)名稱。使用別名可以更改列名,使其更具描述性或可讀性。
例如,在SELECT語句中,可以使用AS關(guān)鍵字或直接使用空格來為列指定別名:
SELECT column_name AS alias_name FROM table_name; -- 或者 SELECT column_name alias_name FROM table_name;
-
表別名:
- 表別名用于為查詢語句中的表指定一個(gè)臨時(shí)名稱,以便在查詢中更簡(jiǎn)潔地引用表。
例如,在FROM子句中,可以使用AS關(guān)鍵字或直接使用空格來為表指定別名:
SELECT column_name FROM table_name AS alias_name; -- 或者 SELECT column_name FROM table_name alias_name;
使用表別名后,可以在查詢中使用別名來引用表,而不是完整的表名。
-
列表達(dá)式別名:
- 除了給列和表指定別名外,還可以給列表達(dá)式(如計(jì)算表達(dá)式或函數(shù)表達(dá)式)指定別名。
例如,使用計(jì)算表達(dá)式:
SELECT column1 + column2 AS result FROM table_name;
在上述示例中,通過計(jì)算表達(dá)式將column1和column2相加,并將結(jié)果命名為result作為查詢結(jié)果的列名。文章來源:http://www.zghlxwxcb.cn/news/detail-597578.html
使用別名可以使查詢結(jié)果更易讀,同時(shí)在復(fù)雜的查詢語句中可以簡(jiǎn)化引用和處理列和表。別名的作用僅限于查詢語句的執(zhí)行期間,不會(huì)對(duì)數(shù)據(jù)庫中的實(shí)際結(jié)構(gòu)和數(shù)據(jù)產(chǎn)生影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-597578.html
到了這里,關(guān)于MySQL常用語句大全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!