java8新特性簡單介紹
MYSQL
選擇資料庫
input:use ggy;
output:Database changed
必須使用USE開啟資料庫,才能讀取其中的資料。
瞭解資料庫和表
input:show databases; output: +--------------------+ | Database | +--------------------+ | ggy | | information_schema | | mysql | | performance_schema | | sys | +--------------------+
input:show tables;
output:
+---------------+
| Tables_in_ggy |
+---------------+
| temp |
| user |
+---------------+
2 rows in set (0.00 sec)
input:show columns from temp; output: +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int | NO | MUL | NULL | auto_increment | | name | varchar(20) | NO | | | | | age | tinyint unsigned | NO | | 0 | | +-------+------------------+------+-----+---------+----------------+
show columns要求給出一個表名(這個例子中的FROM temp),它對每個欄位返回一行,行中包含欄位名,資料型別,是否允許為NULL,鍵資訊、預設值以及其他資訊(如欄位auto_increment)。
這個和desc一樣的效果:
mysql> desc user; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int | NO | MUL | NULL | auto_increment | | name | varchar(20) | NO | | | | | age | tinyint unsigned | NO | | 0 | | +-------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> describe user; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int | NO | MUL | NULL | auto_increment | | name | varchar(20) | NO | | | | | age | tinyint unsigned | NO | | 0 | | +-------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
其他SHOW語句
SHOW STATUS; 用來顯示廣泛的伺服器狀態資訊。
mysql> show create database ggy;顯示建立資料庫的SQL語句
mysql> show create table user;顯示建立資料庫的TABLE語句
show grants;用來顯示授權使用者(所有使用者或特定使用者)的安全許可權
show errors 和 show warnings;用來顯示伺服器錯誤或警告資訊。
檢索資料
檢索單個列
mysql> select sno from temp;
Empty set (0.00 sec)
檢索多個列
mysql> select sno,sname from temp;
Empty set (0.00 sec)
檢索所有列
mysql> select * from temp;
Empty set (0.00 sec)
一般除非你確實需要表中的每個列,否則最好不要用*萬用字元。雖然使用萬用字元可能會使你自己省事,不用明確列出所需列,但檢索不需要的列通常會降低索引和應用程式的效能。
檢索不同的行
mysql> select age from user;
+-----+
| age |
+-----+
| 20 |
| 20 |
+-----+
2 rows in set (0.00 sec)
檢索出不同的值(distinct)
mysql> select distinct age from user;
+-----+
| age |
+-----+
| 20 |
+-----+
1 row in set (0.00 sec)
========================================================
mysql> select distinct age,name from user;
+-----+------+
| age | name |
+-----+------+
| 20 | 張飛 |
| 20 | 關羽 |
+-----+------+
2 rows in set (0.00 sec)
不能部分使用DISTINCT,如果給出兩個列,除非指定的兩個列都不同,否則所有列都將被檢索處理。
限制結果(limit)
mysql> select name from user limit 1;
+------+
| name |
+------+
| 張飛 |
+------+
1 row in set (0.00 sec)
limit 1 指示MySql返回不多於1行。
mysql> select name from user limit 1,1;
+------+
| name |
+------+
| 關羽 |
+------+
mysql> select name from user limit 1,0;
Empty set (0.00 sec)
limit1,1指示MySql返回從行1開始的1列。第一個數為開始位置,第二個數為要檢索的行數。即從x開始的第y行。
使用完全限定的表名
mysql> select user.name from ggy.user;
+------+
| name |
+------+
| 張飛 |
| 關羽 |
+------+
2 rows in set (0.00 sec)
排序檢索資料
select語句的order by字句。
mysql> select user.name from user ;
+------+
| name |
+------+
| 張飛 |
| 關羽 |
+------+
2 rows in set (0.00 sec)
mysql> select user.name from user order by user.name;
+------+
| name |
+------+
| 關羽 |
| 張飛 |
+------+
2 rows in set (0.00 sec)
按多個列排序
mysql> select user.name, user.age from user order by user.age, user.name;
+------+-----+
| name | age |
+------+-----+
| 關羽 | 20 |
| 張飛 | 20 |
| 劉備 | 30 |
+------+-----+
3 rows in set (0.00 sec)
僅在多個行具有相同的age時才對user按name排序。如果age列中的所有值都是唯一的,則不會按name排序。
指定排序方向
mysql> select user.name, user.age from user order by user.age desc;
+------+-----+
| name | age |
+------+-----+
| 趙雲 | 40 |
| 劉備 | 30 |
| 張飛 | 20 |
| 關羽 | 20 |
+------+-----+
4 rows in set (0.00 sec)
如果是多個列:
mysql> select user.name, user.age from user order by user.age desc ,user.name;
+------+-----+
| name | age |
+------+-----+
| 趙雲 | 40 |
| 劉備 | 30 |
| 關羽 | 20 |
| 張飛 | 20 |
+------+-----+
4 rows in set (0.00 sec)
desc只應用到直接位於其前面的列名,上例值對age指定desc,而name依舊按照升序排序。
與desc相反的是asc(預設)。
order by 和 limit組合
mysql> select * from user order by user.age desc limit 1;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 4 | 趙雲 | 40 |
+----+------+-----+
1 row in set (0.00 sec)
在給出order by子句時,應該保證他位於from子句之後。如果使用LIMIT,他必須位於order by之後。使用子句的次序不對將產生錯誤訊息。
過濾資料
使用where子句
mysql> select * from user where user.age = 20;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
+----+------+-----+
2 rows in set (0.00 sec)
where 子句操作符
操作符 | 說明 |
---|---|
= | 等於 |
<> | 不等於 |
!= | 不等於 |
< / <= | 小於、小於等於 |
>/ >= | 大於、大於等於 |
between and | 在指定的兩個值之間 |
檢查單個值
mysql> select * from user where age = 20;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
+----+------+-----+
2 rows in set (0.00 sec)
使用where=“”語句,他返回的數值預設不區分大小寫。
空值查詢
mysql> select * from user where age is null;
Empty set (0.00 sec)
資料過濾
組和where子句
and操作符
mysql> select * from user where age < 40 and age > 20;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 3 | 劉備 | 30 |
+----+------+-----+
1 row in set (0.00 sec)
or操作符
mysql> select * from user where age < 40 or age > 20;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
| 3 | 劉備 | 30 |
| 4 | 趙雲 | 40 |
| 5 | 黃忠 | 0 |
+----+------+-----+
5 rows in set (0.00 sec)
計算次序
AND的優先順序比OR高,所以要是用();
IN操作符
mysql> select * from user where age in (30,40);
+----+------+-----+
| id | name | age |
+----+------+-----+
| 3 | 劉備 | 30 |
| 4 | 趙雲 | 40 |
+----+------+-----+
2 rows in set (0.00 sec)
IN操作符的優點
- IN操作符一般比OR操作符清單執行更快。
- IN最大的有點是可以包含其他的SELECT語句,使得能夠更動態地建立WHERE字句。
NOT操作符
mysql> select * from user where age not in (30,40);
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
| 5 | 黃忠 | 0 |
+----+------+-----+
3 rows in set (0.00 sec)
使用萬用字元進行過濾
like操作符
%萬用字元
mysql> select * from user where name like "張%";
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
+----+------+-----+
1 row in set (0.00 sec)
%表示任意字元出現任意次數。
_萬用字元
mysql> select * from user where name like "張_";
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
+----+------+-----+
1 row in set (0.00 sec)
_只匹配單個字元而不是多個字元。
使用萬用字元的技巧
- 不要過度使用萬用字元。如果其他操作符能夠達到相同的目的,應該使用其他操作符。
- 在確實需要萬用字元時,除非絕對有必要,否則不要把他們用在搜尋模式的開始出,搜尋起來是最慢的。
用正則表示式進行搜尋
基本字元匹配
mysql> select user.name from user where user.age regexp 20 order by user.name;
+------+
| name |
+------+
| 關羽 |
| 張飛 |
+------+
2 rows in set (0.00 sec)
它告訴MySql:REGEXP後跟的東西作為正則表示式處理。
mysql> select * from user where user.age regexp ".0" order by user.name;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | 關羽 | 20 |
| 3 | 劉備 | 30 |
| 1 | 張飛 | 20 |
| 4 | 趙雲 | 40 |
+----+------+-----+
4 rows in set (0.00 sec)
mysql> select * from user where user.age regexp "0" order by user.name;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | 關羽 | 20 |
| 3 | 劉備 | 30 |
| 1 | 張飛 | 20 |
| 4 | 趙雲 | 40 |
| 5 | 黃忠 | 0 |
+----+------+-----+
5 rows in set (0.00 sec)
這裡使用了正則表示式.0。.是正則表示式中一個特殊字元,用來匹配任意一個字元。
如果被匹配的文字在列值中出現,like將不會找到他,相應的行也不會被返回,但是REGEXP在列值內進行匹配,如果被匹配的文字在列值中出現,REGEXP將會找到他,相應的行也會被返回。
匹配不區分大小寫,為區分大小寫,可使用BINARY關鍵字,如... REGEXP BINARY '.0'。
進行or匹配
mysql> select * from user where name regexp "關羽|劉備" order by name;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | 關羽 | 20 |
| 3 | 劉備 | 30 |
+----+------+-----+
2 rows in set (0.00 sec)
|
是正則表示式的OR操作符。他標識匹配其中之一,因此劉備,關羽都匹配返回。
匹配幾個字元之一
mysql> select * from user where age regexp '[1234]0'order by name desc;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 4 | 趙雲 | 40 |
| 1 | 張飛 | 20 |
| 3 | 劉備 | 30 |
| 2 | 關羽 | 20 |
+----+------+-----+
4 rows in set (0.00 sec)
[]
的有意思是匹配10,20,30,40。
mysql> select * from user where age regexp '1|2|3|4 0'order by name;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 2 | 關羽 | 20 |
| 3 | 劉備 | 30 |
| 1 | 張飛 | 20 |
+----+------+-----+
3 rows in set (0.00 sec)
這不是期望的輸出,這樣的意思是'1'或’2‘或’3‘ 或’4 0 ‘。除非把字元括在一個集合中,否則它將應用於整個串。
字元集合也可以被否定,即匹配除指定字元外的任何東西。[^1 2 3]
mysql> select * from user where age regexp '[^1 2 3]0'order by name;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 4 | 趙雲 | 40 |
+----+------+-----+
1 row in set (0.00 sec)
匹配範圍
[0123456789]可簡化成[0-9],也有[a-z]。
mysql> select * from user where user.age regexp "[1-3]0" order by user.age desc;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 3 | 劉備 | 30 |
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
+----+------+-----+
3 rows in set (0.00 sec)
匹配特殊字元
例如\
,.
,%
mysql> select * from user where user.age regexp "\\." order by user.age desc;
Empty set (0.00 sec)
未匹配特殊字元,必須使用\\
為前導。
匹配多個例項
元字元 | 說明 |
---|---|
* | 0個或多個匹配 |
+ | 1個或多個匹配(等於{1,}) |
? | 0個或1個匹配(等於{0,1}) |
{n} | 指定數目的匹配 |
{n,} | 不少於指定數目的匹配 |
{n,m} | 匹配數目的範圍(m不超過225) |
mysql> select * from user where user.age regexp "[:digit:]{1}" order by age desc;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 4 | 趙雲 | 40 |
| 3 | 劉備 | 30 |
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
| 5 | 黃忠 | 0 |
+----+------+-----+
5 rows in set (0.00 sec)
定位符
元符號 | 說明 |
---|---|
^ | 文字的開始 |
$ | 文字的結束 |
[[:<:]] | 詞的開始 |
[[:>:]] | 詞的結束 |
[.0]和[^0]
的區別
mysql> select * from user where user.age regexp ".0" order by age desc;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 4 | 趙雲 | 40 |
| 3 | 劉備 | 30 |
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
| 5 | 黃忠 | 0 |
+----+------+-----+
5 rows in set (0.00 sec)
=======================================================================
mysql> select * from user where user.age regexp "^0" order by age desc;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 5 | 黃忠 | 0 |
+----+------+-----+
1 row in set (0.00 sec)
[.0]:包含0,[^0]
限制開頭問0;
^在集合中(用[]定義),他用來否定該集合,“”則指串的開始初。
計算欄位
拼接(85頁)
拼接(concatenate):將值聯合到一切構成單個值。可使用Concat()
函式來拼接兩個列。
執行算數技術
mysql> select *, user.id*user.age as ageId from user order by ageId;
+----+------+-----+-------+
| id | name | age | ageId |
+----+------+-----+-------+
| 5 | 黃忠 | 0 | 0 |
| 1 | 張飛 | 20 | 20 |
| 2 | 關羽 | 20 | 40 |
| 3 | 劉備 | 30 | 90 |
| 4 | 趙雲 | 40 | 160 |
+----+------+-----+-------+
5 rows in set (0.00 sec)
使用資料處理函式
文字處理函式
concat()
mysql> select concat(age,name) as aname from user;
+--------+
| aname |
+--------+
| 20張飛 |
| 20關羽 |
| 30劉備 |
| 40趙雲 |
| 0黃忠 |
| 6tom |
| 6jack |
+--------+
7 rows in set (0.00 sec)
upper()
mysql> select user.name , Upper(user.name) from user;
+------+------------------+
| name | Upper(user.name) |
+------+------------------+
| 張飛 | 張飛 |
| 關羽 | 關羽 |
| 劉備 | 劉備 |
| 趙雲 | 趙雲 |
| 黃忠 | 黃忠 |
| tom | TOM |
| jack | JACK |
+------+------------------+
7 rows in set (0.00 sec)
常見文字處理函式
函式 | 說明 |
---|---|
left() | 返回串左邊的字元 |
length() | 返回串的長度 |
locate() | 找出串的一個子串 |
lower() | 將串轉換為小寫 |
ltrim() | 去掉串左邊的空格 |
right() | 去掉串右邊的字元 |
rtrim() | 去掉串右邊的空格 |
soundex() | 返回串的SOUNDEX值 |
substring() | 返回子串的字元 |
upper() | 將串轉換為大寫 |
soundex是將一個任何文字串穿環衛描述其語音表示的字元數字模式的演算法。
日期處理
數值處理函式
彙總資料
聚合函式
函式 | 說明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
分組資料
grop by
mysql> select name,count(*) from user group by name;
+------+----------+
| name | count(*) |
+------+----------+
| 張飛 | 1 |
| 關羽 | 1 |
| 劉備 | 1 |
| 趙雲 | 1 |
| 黃忠 | 1 |
| tom | 1 |
| jack | 1 |
+------+----------+
過濾分組 having
mysql> select user.age,count(*) from user where count(*)>1 group by age;
ERROR 1111 (HY000): Invalid use of group function
mysql> select user.age,count(*) from user where count(*)>1 ;
ERROR 1111 (HY000): Invalid use of group function
mysql> select age,count(*) from user group by age having count(*) > 1;
+-----+----------+
| age | count(*) |
+-----+----------+
| 20 | 2 |
| 6 | 2 |
+-----+----------+
2 rows in set (0.00 sec)
having和where的差異
這裡的where不起作用,是因為過濾是基於分組聚集值而不是特定行值的。
另一種理解:WHERE在資料分組前進行過濾,HAVING在資料分組後進行過濾。這是一個重要的區別,where排除的行不包括在分組中,這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。
having和where連用
mysql> select user.age,count(*) from user where age > 10 group by age;
+-----+----------+
| age | count(*) |
+-----+----------+
| 20 | 2 |
| 30 | 1 |
| 40 | 1 |
+-----+----------+
3 rows in set (0.00 sec)
mysql> select user.age,count(*) from user where age > 10 group by age having count(*) > 1;
+-----+----------+
| age | count(*) |
+-----+----------+
| 20 | 2 |
+-----+----------+
1 row in set (0.00 sec)
select 子句順序
子句 | 說明 | 是否必須使用 |
---|---|---|
SELECT | 要返回的列或表示式 | 是 |
from | 從中檢索資料的表 | 僅在從表選擇資料時使用 |
where | 行級過濾 | 否 |
group by | 分組說明 | 僅在按組計算聚集時使用 |
having | 組級過濾 | 否 |
order by | 輸出排序順序 | 否 |
要檢索的行數 | 否 |
使用子查詢
利用子查詢進行過濾
mysql> select * from user where age in(select age from user where age > 10);
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | 張飛 | 20 |
| 2 | 關羽 | 20 |
| 3 | 劉備 | 30 |
| 4 | 趙雲 | 40 |
+----+------+-----+
4 rows in set (0.01 sec)
mysql> select *, (select name from user where name = "張飛") as newname from user order by age;
+----+------+-----+---------+
| id | name | age | newname |
+----+------+-----+---------+
| 5 | 黃忠 | 0 | 張飛 |
| 6 | tom | 6 | 張飛 |
| 7 | jack | 6 | 張飛 |
| 1 | 張飛 | 20 | 張飛 |
| 2 | 關羽 | 20 | 張飛 |
| 3 | 劉備 | 30 | 張飛 |
| 4 | 趙雲 | 40 | 張飛 |
+----+------+-----+---------+
7 rows in set (0.00 sec)
聯結表
mysql> select user.name, user.age from user,temp where user.name = temp.name order by user.age asc;
+------+-----+
| name | age |
+------+-----+
| tom | 6 |
| 張飛 | 20 |
| 劉備 | 30 |
| 趙雲 | 40 |
+------+-----+
4 rows in set (0.00 sec)
內部聯結
mysql> select user.name, temp.age from temp join user on user.name = temp.name;
+------+-----+
| name | age |
+------+-----+
| 張飛 | 30 |
| 劉備 | 30 |
| 趙雲 | 30 |
| tom | 30 |
+------+-----+
4 rows in set (0.00 sec)
mysql> select user.name, temp.age from temp join user on user.name = temp.name and user.age = temp.age;
+------+-----+
| name | age |
+------+-----+
| 劉備 | 30 |
+------+-----+
1 row in set (0.00 sec)
MySql在執行時關聯指定的每個表以處理聯結。這種處理可能是非常耗費資源的,因此應該仔細,不要聯結不必要的表。聯結的越多,效能下降越厲害。
建立高階聯結
使用表別名
mysql> select u.name,t.age from user AS u,temp AS t where u.name = t.name and u.age = t.age;
+------+-----+
| name | age |
+------+-----+
| 劉備 | 30 |
+------+-----+
1 row in set (0.00 sec)
union
union從查詢結果集中自動去除了重複的行。如果想返回所有的匹配行,可使用UNION ALL;
mysql> select name,user.age from user where age > 20 union select temp.name,temp.age from temp where temp.id > 0;
+------+-----+
| name | age |
+------+-----+
| 劉備 | 30 |
| 趙雲 | 40 |
| 張飛 | 30 |
| 趙雲 | 30 |
| tom | 30 |
+------+-----+
5 rows in set (0.00 sec)
mysql> select name,user.age from user where age > 20 union all select temp.name,temp.age from temp where temp.id > 0;
+------+-----+
| name | age |
+------+-----+
| 劉備 | 30 |
| 趙雲 | 40 |
| 劉備 | 30 |
| 張飛 | 30 |
| 趙雲 | 30 |
| tom | 30 |
+------+-----+
6 rows in set (0.00 sec)
對組合語句查詢結果排序
select語句的輸出用ORDER BY 子句排序。在UNION組合查詢時,只能使用一條ORDER BY 子句,他必須出現在最後一條SELECT語句之後。對於結果集,不存在用一種方式排序一部分,而又用用另一種方式排序另一部分的情況,因此不允許使用多條ORDER BY子句。
插入資料
插入完整的行
mysql> insert into temp values(10,"我",100);
Query OK, 1 row affected (0.01 sec)
mysql> insert into temp (id,name,age) values(5,"誰",100);
Query OK, 1 row affected (0.02 sec)
插入多行
mysql> insert into temp (id,name,age) values(6,"華雄",100),(7,"關羽",200);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
插入檢索出來的資料
mysql> insert into temp (name, age) select temp.name, temp.age from temp where temp.id = 10;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
更新資料
mysql> update temp set age = 10 where name = "華雄";
Query OK, 1 row affected (0.01 sec)
UPDATE語句總是以要更新的表的名字開始。set命名用來將新值賦給被更新的列。
UPDATA語句以WHERE子句結束,他告訴MySql更新哪一行。沒有where字句,mysql將會用更新表中的所有行。
更新多個列
mysql> update temp set age = 10, id = 9 where name = "華雄";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
刪除資料
mysql> delete from temp where id = 11;
Query OK, 1 row affected (0.01 sec)
delete刪除整行而不是刪除列。為了刪除指定的列,請使用update;
建立表
mysql> create table t (id int not null auto_increment, name varchar(10) not null,primary key (id))engine= innodb;
Query OK, 0 rows affected (0.09 sec)
如果表不存在的時候建立
mysql> create table if not exists t (id int not null auto_increment, name varchar(10) not null,primary key (id))engine= innodb;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> alter table t add sno varchar(10) not null;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table t drop column sno;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除表
mysql> drop table t;
重命名錶
mysql> rename table ta to t;
Query OK, 0 rows affected (0.06 sec)
檢視
如果檢視定義中有以下操作,則不能進行檢視的更新:
分組
聯結
子查詢
並
聚集函式
distinct
匯出列