文章摘要:
1、連接哎榴、退出MySql數(shù)據(jù)庫
2型豁、查詢MySql用戶以及l(fā)ocalHost
3、創(chuàng)建數(shù)據(jù)庫叹话、顯示數(shù)據(jù)庫表結(jié)構(gòu)
4偷遗、ALTER增加/修改數(shù)據(jù)庫列
5、數(shù)據(jù)庫外鍵
6驼壶、數(shù)據(jù)庫日期函數(shù)
7氏豌、IS NOT NULL
8、模式匹配
9热凹、計數(shù)
一泵喘、MySql 數(shù)據(jù)庫連接泪电、退出
1、連接MySql
shell> mysql -h host -u user -p
Enter password: ********
host和user分別代表MySQL服務器運行的主機名和MySQL賬戶用戶名纪铺。設置時替換為正確的值相速。******** 代表你的密碼;當mysql顯示Enter password:提示時輸入它鲜锚。
如果有效突诬,你應該看見mysql>提示符后的一些介紹信息:
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.17 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2、退出MySql
輸入“Quit(\q)”或者“Exit”芜繁。
3旺隙、查詢用戶以及Host
mysql> SELECT USER();
mysql> SELECT Host,User from mysql.user;
4、查詢當前日期和版本號骏令。
mysql> SELECT VERSION(), CURRENT_DATE;
5蔬捷、不區(qū)分大小寫。
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
6榔袋、支持邏輯運算
mysql> SELECT SIN(PI()/4), (4+1)*5;
二周拐、數(shù)據(jù)庫相關(guān):
1、存在那些數(shù)據(jù)庫
mysql> SHOW DATABASES;
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.01 sec)
2凰兑、使用數(shù)據(jù)庫
mysql> USE test
3妥粟、創(chuàng)建數(shù)據(jù)庫
mysql> Ccreate table 寵物(名字 varchar(20),主人 varchar(20),種類 varchar(20),
性別 char(1),出生 DATE,死亡 DATE);
CREATE TABLE 寵物日志 (id INT NOT NULL AUTO_INCREMENT,
名字 VARCHAR(20), 時間 DATE, 時間類型 VARCHAR(15),
評論 VARCHAR(255),`事件id` INT(45) NOT NULL,PRIMARY KEY (`id`));
4、數(shù)據(jù)庫中有那些表聪黎。
mysql> SHOW TABLES;
5罕容、顯示數(shù)據(jù)表創(chuàng)建結(jié)構(gòu)。
- 5.1稿饰、DESCRIBE方式
DESCRIBE + 表名锦秒。
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| 名字 | varchar(20) | NO | PRI | NULL | |
| 主人 | varchar(20) | YES | | NULL | |
| 種類 | varchar(20) | YES | | NULL | |
| 性別 | char(1) | YES | | NULL | |
| 出生 | date | YES | | NULL | |
| 死亡 | date | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)
- 5.2、SHOW CREATE TABLE + 表名
show create table 寵物;
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 寵物 | CREATE TABLE `寵物` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`名字` varchar(20) NOT NULL,
`主人` varchar(20) DEFAULT NULL,
`種類` varchar(20) DEFAULT NULL,
`性別` char(1) DEFAULT NULL,
`出生` date DEFAULT NULL,
`死亡` date DEFAULT NULL,
PRIMARY KEY (`id`,`名字`)
) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8 |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
6喉镰、填充數(shù)據(jù)旅择。Load/insert操作
要想將文本文件“pet.txt”裝載到pet表中,使用這個命令:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
請注意如果用Windows中的編輯器(使用\r\n做為行的結(jié)束符)創(chuàng)建文件侣姆,應使用:
mysql> -- 從txt中加載數(shù)據(jù) --
LOAD DATA LOCAL INFILE '/Users/ifei/Downloads/寵物.txt' INTO TABLE 寵物;
-> LINES TERMINATED BY '\r\n';
(在運行OS X的Apple機上生真,應使用行結(jié)束符'\r'。)
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
附 寵物.txt:
\N 大虎 高小胖 dog f 2010-02-05 \N
\N 老笨 高大胖 dog f 2014-09-05 \N
\N 旺財 高大胖 cat m 2016-07-03 \N
\N Fang Harold bird m 2010-03-03 2017-07-03
\N Chirpy Gwen bird f 2015-05-19 \N
\N Slim Gwen cat f 2010-07-12 2014-01-03
\N Buffy Diane snake m 2002-04-12 2014-08-09
\N Claws Diane snake m 2003-08-17 \N
7捺宗、增加新列柱蟀,增加主鍵
-- 增加新列、增加主鍵 --
ALTER TABLE `test`.`寵物`
ADD COLUMN `id` VARCHAR(45) NOT NULL FIRST,
ADD PRIMARY KEY (`id`);
8蚜厉、修改數(shù)據(jù)庫列长已,增加自增屬性
-- 修改列、增加自增屬性 --
ALTER TABLE `test`.`寵物`
CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT ;
9、數(shù)據(jù)庫外鍵
- 外鍵必須指向另一個表的主鍵术瓮。
- 在引用表中康聂,必須有一個索引,外鍵列以同樣的順序被列在其中作為第一列胞四。這樣一個索引如果不存在恬汁,它必須在 引用表里被自動創(chuàng)建。
-- 增加約束-外鍵 --
ALTER TABLE test.寵物日志
ADD FOREIGN KEY test.寵物日志(`事件id`) REFERENCES test.寵物(`id`);
ALTER TABLE `test`.`寵物日志`
ADD FOREIGN KEY (`事件id` , `名字`)
REFERENCES `test`.`寵物` (`id` , `名字`);
10辜伟、查詢選擇數(shù)據(jù)
SELECT語句用來從數(shù)據(jù)表中檢索信息氓侧。語句的一般格式是:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
- what_to_select指出你想要看到的內(nèi)容,可以是列的一個表导狡,或*表示“所有的列”甘苍。
- which_table指出你想要從其檢索數(shù)據(jù)的表。
- WHERE子句是可選項烘豌,如果選擇該項,conditions_to_satisfy指定行必須滿足的檢索條件看彼。
mysql> SELECT * FROM 寵物 WHERE 種類 = 'dog' AND 性別 = 'f';
mysql> SELECT * FROM 寵物 WHERE 種類 = 'snake' OR 種類 = 'bird';
AND和OR可以混用廊佩,但AND比OR具有更高的優(yōu)先級。如果你使用兩個操作符靖榕,使用圓括號指明如何對條件進行分組是一個好主意:
mysql> SELECT * FROM 寵物 WHERE (種類 = 'cat' AND 性別 = 'm')
-> OR (種類 = 'dog' AND 性別 = 'f');
- 關(guān)鍵字:DISTINCT
請注意該查詢只是簡單地檢索每個記錄的owner列标锄,并且他們中的一些出現(xiàn)多次。為了使輸出減到最少茁计,增加關(guān)鍵字DISTINCT檢索出每個唯一的輸出記錄:
mysql> SELECT DISTINCT 主人 FROM 寵物;
11料皇、查詢結(jié)果排序,默認按照ASC來排序星压。
mysql> SELECT 名字, 出生 FROM 寵物 ORDER BY 出生 (ASC);
默認排序是升序践剂,最小的值在第一。要想以降序排序娜膘,在你正在排序的列名上增加DESC(降序 )關(guān)鍵字:
mysql> SELECT 名字, 出生 FROM 寵物 ORDER BY 出生 DESC;
可以對多個列進行排序逊脯,并且可以按不同的方向?qū)Σ煌牧羞M行排序。例如竣贪,按升序?qū)游锏姆N類進行排序军洼,然后按降序根據(jù)生日對各動物種類進行排序(最年輕的動物在最前面),使用下列查詢:
mysql> SELECT 名字, 種類, 出生 FROM 寵物
-> ORDER BY 種類, 出生 DESC;
注意DESC關(guān)鍵字僅適用于在它前面的列名(“出生”)演怎;不影響“種類”列的排序順序匕争。
12、日期函數(shù)
要想確定每個寵物有多大爷耀,可以計算當前日期的年和出生日期之間的差甘桑。如果當前日期的日歷年比出生日期早,則減去一年。以下查詢顯示了每個寵物的出生日期扇住、當前日期和年齡數(shù)值的年數(shù)字春缕。
mysql> SELECT 名字, 出生, CURDATE(),
-> (YEAR(CURDATE())-YEAR(出生))
-> - (RIGHT(CURDATE(),5)<RIGHT(出生,5))
-> AS 年齡
-> FROM 寵物;
YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日歷年)部分的最右面5個字符艘蹋。比較MM-DD值的表達式部分的值一般為1或0锄贼,如果CURDATE()的年比birth的年早,則年份應減去1女阀。
附:
名字 | 出生 | CURDATE() | 年齡 |
---|---|---|---|
大虎 | 2010-02-05 | 2017-07-04 | 7 |
老笨 | 2014-09-05 | 2017-07-04 | 2 |
旺財 | 2016-07-03 | 2017-07-04 | 1 |
Fang | 2010-03-03 | 2017-07-04 | 7 |
Chirpy | 2015-05-19 | 2017-07-04 | 2 |
Slim | 2010-07-12 | 2017-07-04 | 6 |
Buffy | 2002-04-12 | 2017-07-04 | 15 |
Claws | 2003-08-17 | 2017-07-04 | 13 |
temp | NULL | 2017-07-04 | NULL |
mysql> SELECT 名字, 出生 FROM 寵物
-> WHERE MONTH(出生) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
DATE_ADD( )允許在一個給定的日期上加上時間間隔宅荤。如果在NOW( )值上加上一個月,然后用MONTH()提取月份浸策,就是下個月冯键。
等價于使用MOD取模函數(shù):
mysql> SELECT 名字, 出生 FROM pet
-> WHERE MONTH(出生) = MOD(MONTH(CURDATE()), 12) + 1;
13、IS NOT NULL的用法
NULL值可能令人感到奇怪直到你習慣它庸汗。概念上惫确,NULL意味著“沒有值”或“未知值”,且它被看作與眾不同的值蚯舱。為了測試NULL改化,你不能使用算術(shù)比較 操作符例如=、<或!=枉昏。為了說明它陈肛,試試下列查詢:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+```
很顯然你不能通過這些比較得到有意義的結(jié)果。相反使用IS NULL和IS NOT NULL操作符:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
請注意在MySQL中兄裂,0或 NULL意味著假而其它值意味著真句旱。布爾運算的默認真值是1
mysql> SELECT 名字, 出生, 死亡,
-> (YEAR(死亡)-YEAR(出生)) - (RIGHT(死亡,5)<RIGHT(死亡,5))
-> AS 年齡
-> FROM 寵物 WHERE 死亡 IS NOT NULL ORDER BY 年齡;
+--------+------------+------------+--------+
| 名字 | 出生 | 死亡 | 年齡 |
+--------+------------+------------+--------+
| Slim | 2010-07-12 | 2014-01-03 | 4 |
| Fang | 2010-03-03 | 2017-07-03 | 7 |
| Buffy | 2002-04-12 | 2014-08-09 | 12 |
+--------+------------+------------+--------+
查詢使用出生 IS NOT NULL而非出生 != NULL,因為NULL是特殊的值晰奖,不能使用普通比較符來比較谈撒。
下述語句不返回任何行,這是因為匾南,對于任何表達式港华,expr = NULL永遠不為“真”:
mysql> SELECT * FROM my_table WHERE phone = NULL;
要想查找NULL值,必須使用IS NULL測試午衰。在下面的語句中立宜,介紹了查找NULL電話號碼和空電話號碼的方式:
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';
- 使用DISTINCT、GROUP BY或ORDER BY時臊岸,所有NULL值將被視為等同的橙数。
- 使用ORDER BY時,首先將顯示NULL值帅戒,如果指定了DESC按降序排列灯帮,NULL值將最后顯示崖技。
- 對于聚合(累計)函數(shù),如COUNT()钟哥、MIN()和SUM()迎献,將忽略NULL值。對此的例外是COUNT(*)腻贰,它將計數(shù)行而不是單獨的列值吁恍。例如,下述語句產(chǎn)生兩個計數(shù)播演。首先計數(shù)表中的行數(shù)冀瓦,其次計數(shù)"出生"列中的非NULL值數(shù)目:
mysql> SELECT COUNT(*), COUNT(出生) FROM 寵物;
##14、模式匹配
SQL模式匹配允許你使用“_”匹配任何單個字符写烤,而“%”匹配任意數(shù)目字符(包括零字符)翼闽。在 MySQL中,SQL的模式默認是忽略大小寫的洲炊。注意使用SQL模式時感局,不能使用=或!=;而應使用LIKE或NOT LIKE比較操作符暂衡。
要想找出包含“w”的名字:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
要想找出正好包含5個字符的名字蓝厌,使用“_”模式字符:
mysql> SELECT * FROM pet WHERE name LIKE '_____';
由MySQL提供的模式匹配的其它類型是使用擴展正則表達式。當你對這類模式進行匹配測試時古徒,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)读恃。
擴展正則表達式的一些字符是:
- ‘.’匹配任何單個的字符隧膘。
- 字符類“[...]”匹配在方括號內(nèi)的任何字符。例如寺惫,“[abc]”匹配“a”疹吃、“b”或“c”。為了命名字符的范圍西雀,使用一個“-”萨驶。“[a-z]”匹配任何字母艇肴,而“[0-9]”匹配任何數(shù)字腔呜。
- “ * ”匹配零個或多個在它前面的字符。例如再悼,“x*”匹配任何數(shù)量的“x”字符核畴,“[0-9]*”匹配任何數(shù)量的數(shù)字,而“.*”匹配任何數(shù)量的任何字符冲九。
如果REGEXP模式與被測試值的任何地方匹配谤草,模式就匹配(這不同于LIKE模式匹配,只有與整個值匹配,模式才匹配)丑孩。
- 為了定位一個模式以便它必須匹配被測試值的開始或結(jié)尾冀宴,在模式開始處使用“^”或在模式的結(jié)尾用“$”。
為了找出以“b”開頭的名字温学,使用“^”匹配名字的開始:
mysql> SELECT * FROM 寵物 WHERE 名字 REGEXP '^b';
如果你想強制使REGEXP比較區(qū)分大小寫略贮,使用BINARY關(guān)鍵字使其中一個字符串變?yōu)槎M制字符串。該查詢只匹配名稱首字母的小寫‘b’枫浙。
mysql> SELECT * FROM 寵物 WHERE 名字 REGEXP BINARY '^b';
為了找出包含一個“w”的名字刨肃,使用以下查詢:
mysql> SELECT * FROM 寵物 WHERE 名字 REGEXP 'w';
既然如果一個正則表達式出現(xiàn)在值的任何地方,其模式匹配了箩帚,就不必在先前的查詢中在模式的兩側(cè)放置一個通配符以使得它匹配整個值真友,就像你使用了一個SQL模式那樣。
為了找出包含正好5個字符的名字紧帕,使用“^”和“$”匹配名字的開始和結(jié)尾盔然,和5個“.”實例在兩者之間:
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
等價于:
你也可以使用“{n}”“重復n次”操作符重寫前面的查詢:
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
##15、計數(shù)
在前面是嗜,你檢索了擁有寵物的人的名字愈案。如果你想要知道每個主人有多少寵物,你可以使用COUNT( )函數(shù):
mysql> SELECT 主人, COUNT(*) FROM 寵物 GROUP BY 主人;
+-----------+----------+
| 主人 | COUNT(*) |
+-----------+----------+
| Diane | 2 |
| Gwen | 2 |
| hailou | 1 |
| Harold | 1 |
| 高大胖 | 2 |
| 高小胖 | 1 |
+-----------+----------+
注意鹅搪,使用GROUP BY對每個"主人"的所有記錄分組站绪,沒有它,你會得到錯誤消息:
mysql> SELECT 主人, COUNT(*) FROM 寵物;
ERROR 1140 (42000): In aggregated query without GROUP BY,
expression #1 of SELECT list contains nonaggregated column
'test.寵物.主人'; this is incompatible with sql_mode=only_full_group_by