MySQL是關系型數據庫的一種,基于二維表實現數據的存儲與讀取,通過索引實現快速查詢,而實現數據庫、表、索引的操作則是由SQL語句來完成的。
1、MySQL中字符大小寫
(1)、SQL關鍵字以及函數名不區分大小寫,但為增加緩存命中率,建議使用統一風格。
(2)、數據庫、表、索引視圖名稱等是否區分大小寫取決與底層的OS以及文件系統(FS)。
(3)、存儲過程、存儲函數以及事件調度器不區分大小寫;但觸發器區分字符大小寫。
(4)、表別名不區分大小寫。
(5)、字段中的數據類型為BINARY,BLOB,VARBINARY時區分大小寫,其它不區分大小寫。
2、MySQL中引用對象規則
MySQL使用單引號或者雙引號引用字符串;使用反引號引用字段、表、視圖等名稱。
DDL語句操作
3、數據庫
(1)、創建數據庫
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] …
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name //指定字符集
| [DEFAULT] COLLATE [=] collation_name //指定校驗類型
例:
(2)、修改數據庫
ALTER {DATABASE | SCHEMA} [db_name] //修改數據庫屬性
alter_specification …
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME //修改數據庫datadir名稱
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
(3)、刪除數據庫
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
4、表
(1)、創建表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,…)
[table_options]
[partition_options]
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,…)]
[table_options]
[partition_options]
select_statement
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
定義字段約束
create_definition:
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,…)
[index_option] …
| {INDEX|KEY} [index_name] [index_type] (index_col_name,…)
[index_option] …
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,…)
[index_option] …
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,…)
[index_option] …
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,…) reference_definition
| CHECK (expr)
定義字段數據類型
column_definition:
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
數據類型
data_type:
BIT[(length)]
| TINYINT[(length)] [UNSIGNED] [ZEROFILL]
| SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
| INT[(length)] [UNSIGNED] [ZEROFILL]
| INTEGER[(length)] [UNSIGNED] [ZEROFILL]
| BIGINT[(length)] [UNSIGNED] [ZEROFILL]
| REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
| NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
| DATE
| TIME
| TIMESTAMP
| DATETIME
| YEAR
| CHAR[(length)]
[CHARACTER SET charset_name] [COLLATE collation_name]
| VARCHAR(length)
[CHARACTER SET charset_name] [COLLATE collation_name]
| BINARY[(length)]
| VARBINARY(length)
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| TEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| MEDIUMTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| LONGTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| ENUM(value1,value2,value3,…)
[CHARACTER SET charset_name] [COLLATE collation_name]
| SET(value1,value2,value3,…)
[CHARACTER SET charset_name] [COLLATE collation_name]
| spatial_type
定義表屬性
table_options:
table_option [[,] table_option] …
表屬性
table_option:
ENGINE [=] engine_name
| AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| CONNECTION [=] 'connect_string'
| DATA DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| INDEX DIRECTORY [=] 'absolute path to directory'
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] value
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
| TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
| UNION [=] (tbl_name[,tbl_name]…)、
(2)、刪除表
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] …
(3)、修改表
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] …]
[partition_options]
修改方式
alter_specification:
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
| ADD [COLUMN] (col_name column_definition,…)
| ADD {INDEX|KEY} [index_name]
[index_type] (index_col_name,…) [index_option] …
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,…) [index_option] …
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,…) [index_option] …
| ADD FULLTEXT [INDEX|KEY] [index_name]
(index_col_name,…) [index_option] …
| ADD SPATIAL [INDEX|KEY] [index_name]
(index_col_name,…) [index_option] …
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,…)
reference_definition
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition //改變字段名稱和字段定義
[FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition //僅修改字段定義
[FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name
| DROP FOREIGN KEY fk_symbol
| MAX_ROWS = rows
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO|AS] new_tbl_name //重命名表
| ORDER BY col_name [, col_name] …
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| DISCARD TABLESPACE //表空間刪除,前提是innodb_file_per_table開啟
| IMPORT TABLESPACE //導入表空間,前提是innodb_file_per_table開啟
| FORCE
| ADD PARTITION (partition_definition)
| DROP PARTITION partition_names
| TRUNCATE PARTITION {partition_names | ALL}
| COALESCE PARTITION number
| REORGANIZE PARTITION [partition_names INTO (partition_definitions)]
| ANALYZE PARTITION {partition_names | ALL}
| CHECK PARTITION {partition_names | ALL}
| OPTIMIZE PARTITION {partition_names | ALL}
| REBUILD PARTITION {partition_names | ALL}
| REPAIR PARTITION {partition_names | ALL}
| PARTITION BY partitioning_expression
| REMOVE PARTITIONING
5、索引
(1)、索引的創建法則:基于搜索鍵來創建索引,一般是SELECT語句中的WHERE子句中的查詢條件中的字段。
(2)、索引使用策略
使用獨立的列,索引不能是表達式的一部分;
使用前綴索引來提高搜索效率;
多列索引中,如使用and則使用組合索引,如果使用or,使用簡單索引;
使用索引查詢時,索引選擇性高的寫在索引最前面;
聚簇索引固然會提升查詢速度,但同樣會提高更新代價;
必要情況下,盡量使用覆蓋索引;
遵循避免使用冗余索引,避免使用索引的原則。
(3)、創建索引:
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,…)
[index_option] …
定義索引字段
index_col_name:
col_name [(length)] [ASC | DESC]
定義索引類型
index_type:
USING {BTREE | HASH}
定義索引屬性
index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
值得注意的是,CREATE INDEX不能添加、修改索引,需借助于ALTER TABLE.
(4)、顯示特定表上的索引
SHOW {INDEX | INDEXES | KEYS}
{FROM | IN} tbl_name
[{FROM | IN} db_name]
[WHERE expr]
(5)、刪除索引
DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name
6、DML語句操作
(1)、插入記錄
INSERT [INTO] tbl_name [(col_name,…)] {VALUES | VALUE} (…),… //可以執行批量插入值
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, …
INSERT [INTO] tbl_name [(col_name,…)] SELECT …
(2)、更新記錄
PDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] …
[WHERE where_condition]
[ORDER BY …]
[LIMIT row_count]
ORDER BY col1[,…] {ASC|DESC} LIMIT # //排序后取前#條記錄
(3)、刪除記錄
UDELETE
DELETE FROM tbl_name
[WHERE where_condition]
[ORDER BY …] //排序方式
[LIMIT row_count] //排序后顯示前多少行記錄
7、SELECT查詢
(1)、SELECT查詢執行過程:FROM –> WHERE –> GROUP BY –> HAVING –> ORDER –> SELECT –> LIMIT;
(2)、SELECT可以使用查詢緩存來提升查詢速度,查詢緩存中的數據成對存在的鍵和值(key-value),其中鍵(key)是查詢語句hash碼,值(value)是查詢所得結果。
>SHOW GLOBAL VARIABLES LIKE '%query_cache%'; //使用此命令查詢緩存變量
+——————————+———-+
| Variable_name | Value |
+——————————+———-+
| have_query_cache | YES |
| query_cache_limit | 1048576
| query_cache_min_res_unit | 4096
| query_cache_size | 16777216 | //此值不為0說明查詢緩存開啟
| query_cache_strip_comments | OFF |
| query_cache_type | ON | //緩存服務類型選擇
| query_cache_wlock_invalidate | OFF |
+——————————+———-+
7 rows in set (0.00 sec)
其中query_cache_type變量可取值為
ON:表是mysqld自行決定需緩存對象
DEMAND:按需緩存,只有明確制定需緩存的對象才被緩存
OFF:關閉緩存,取此值并且query_cache_size為零時,mysql服務器緩存功能關閉。
MariaDB [(none)]> SELECT @@GLOBAL.query_cache_type;
+—————————+
| @@GLOBAL.query_cache_type |
+—————————+
| ON |
+—————————+
1 row in set (0.00 sec)
(3)、SELECT語法:
SELECT [ALL | DISTINCT | DISTINCTROW ]
value_to_display //查詢值
FROM table_name //查詢對象
WHERE expression //查詢條件表達式
GROUP BY how_to_group //分組依據字段
HAVING expression //分組后查詢條件表達式
ORDER BY how_to_sort //排序依據
LIMIT row_count; //限定顯示行數
(4)、mysql查詢子句
如下示例,均使用hellodb數據庫中的students表
WHERE(條件查詢)、HAVING(篩選)、GROUP BY(分組)、ORDER BY(排序)、LIMIT(限制結果數)
1、WHERE常用運算符
比較運算符:>,<,=,!=,>=,<=
IN(v1,v2…)
BETWEEN v1 AND v2 在v1和v2之間,包含v1和v2
SELECT Name,Age FROM students WHERE Age>=20 AND Age<=30 OR Age>=50 AND Age<=60;
SELECT Name,Age FROM students WHERE Age NOT BETWEEN 30 AND 100;
邏輯運算符:
NOT(!)邏輯非
OR(||)邏輯或
AND(&&)邏輯與
模糊查詢
LIKE 像
通配符:%任意字符;_任意單個字符
SELECT Name,Age FROM students WHERE Name LIKE '%shi%';
2、GROUP BY 分組
一般情況下,group by與統計函數(聚合函數)一起使用
mysql中的5種統計函數:
(1)、max求最大值
SELECT max(Age) FROM students;
(2)、min求最小值
(3)、求總數和
SELECT sum(Age) FROM students;
(4)、avg求平均值
(5)、count求總行數、
3、having和where
having和where類似,可以篩選數據,兩者后面跟的表達式通用。
where針對表中的列發揮作用,查詢數據;having針對查詢結果的列發揮作用,查詢數據
4、order by
(1) order by price //默認升序排列
(2)order by price desc //降序排列
(3)order by price asc //升序排列,與默認一樣
(4)order by rand() //隨機排列,效率不高
5、limit
limit [offset,] N
offset 偏移量,可選,不寫則相當于limit 0,N
N 取出條目
注意:特殊表達式
IS NULL; NOT NULL //判斷值是否為空
LIKE:可使用通配符 % _,其中%表示任意多個字符,_表示任意單個字符。
RLIKE或REGEXP:可以使用正則表達式的模式
(5)、mysql子查詢
1、where型子查詢,把內層查詢結果當作外層查詢的比較條件
例如,取出年齡最大的人員
2、from型子查詢,把內存查詢得到的結果供外層再次查詢
例如,從年齡大于30的人員中選出年齡大于等于50的人員
3、exists型子查詢,把外層的查詢結果拿到內層,看內層的查詢是否成立。
例如,創建表type,object要求如下
利用exists實現,object表中有記錄的對應的tid,則將表type中有相同tid的行顯示出來
上面語句是,查詢語句循環從表type中取出tid到exists子語句中看是否有相同的tid,有就顯示該tid所在行,沒有則不顯示,本例中,tid為1,2,3,的顯示,tid為4的記錄則不顯示。
5、聯合查詢,UNION的用法
把兩次或多次的查詢結果合并起來,要求查詢的列數一致,查詢對應類型一致,可查詢多張表;多次查詢如果列名不一致,則取第一次查詢列名為準,若不同的查詢語句取出的不同的行中的列中的值完全相同,默認采取去重操作,可以使用UNION ALL 聲明保留重復行。
示例,創建表tb1,tb2,要求如下
查詢兩張表并使用UNION
可以看到id為b的重復項自動去重,聲明UNION ALL
可以看到使用UNION ALL id為b的重復項不再去重
笛卡爾積連接:CROSS JOIN
內連接:INNER JOIN,分為等值連接和不等值連接
外連接:OUTERJOIN
左外連接:LEFT OUTER JOIN
右外聯接:RIGHT OUTER JOIN
自然連接:NATURAL JOIN,即等值連接。
6、外連接:
(1)、左外連接:以左表為準,去右表找數據,如果沒有匹配的數據,則以NULL補空,輸出結果,大于等于左表數。
語法:SELECT n1,n2,n3 FROM tb1 LEFT JOIN tb2 ON tb1.n1=tb2.n2 注意,此處ON后面的表達式,不僅僅能使用=,還可以使用>,<等算術、邏輯運算符,連接完成后,可以當成一張新表來進行表操作。
示例,兩張表如下
通過,左外連接顯示對應StuID的同學每一門課程的得分
下面把上面的結果當成新表,用表students與之再次左連接,查詢出每個人員的名字、年齡、課程和得分。
students表如下
再次執行左連接查詢
> SELECT Name,Age,t.Course,t.Score FROM students LEFT JOIN (SELECT StuID,Score,courses.Course FROM scores LEFT JOIN courses ON scores.CourseID=courses.CourseID) AS t ON students.StuID=t.StuID;
小結:所謂多表聯合查詢,無非是通過兩張或多張表中有著某種關系的字段將參與查詢的表聯系起來(如字段間的等于、大于或其他關系),在通過此聯系在組成的聯合表中查詢獲得數據,使之呈現出來。
(2)、右外連接:a表右外連接b表,相當于b表左外連接a表,一般使用左外連接取代右外連接。
(3)、內連接:內連接,又叫等值連接,這種連接取相應左右連接的交集,NULL項和重復項將會被去除,該連接無需特殊連接關鍵字,因此又稱自然連接。
查詢表students中的每個學生對應的每個科目的成績
> SELECT students.Name,t.Course,t.Score FROM students,(SELECT scores.StuID,scores.Score,courses.Course FROM scores,courses WHERE scores.CourseID=courses.CourseID) AS t WHERE students.StuID=t.StuID;
原創文章,作者:Silently,如若轉載,請注明出處:http://www.www58058.com/7286
輸出的代碼段可以格式化,格式化后效果會好很多