MYSQL 連接
UNION?
MySQL UNION 操作符用于連接兩個(gè)以上的 SELECT 語(yǔ)句的結(jié)果組合到一個(gè)結(jié)果集合中。多個(gè) SELECT 語(yǔ)句會(huì)刪除重復(fù)的數(shù)據(jù)。查詢出來(lái)是一個(gè)結(jié)果的去重復(fù)合并
SELECT expression1, expression2, ... expression_n
FROM tables[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_nFROM tables[WHERE conditions];
expression1, expression2, ... expression_n: 要檢索的列。tables:?要檢索的數(shù)據(jù)表。
WHERE conditions:?可選, 檢索條件。
DISTINCT:?可選,刪除結(jié)果集中重復(fù)的數(shù)據(jù)。
默認(rèn)情況下 UNION 操作符已經(jīng)刪除了重復(fù)數(shù)據(jù),所以 DISTINCT 修飾符對(duì)結(jié)果沒(méi)啥影響。ALL:?可選,返回所有結(jié)果集,包含重復(fù)數(shù)據(jù).
SELECT country FROM Websites
UNION
SELECT country FROM appsORDER BY country;

SELECT country, name
FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name
FROM apps
WHERE country='CN'
ORDER BY country;

JOIN
*? INNER JOIN(內(nèi)連接,或等值連接):獲取兩個(gè)表中字段匹配關(guān)系的記錄。
SELECT
?a.runoob_id, a.runoob_author, b.runoob_count?
FROM runoob_tbl a?
INNER JOIN
?tcount_tbl b?
ON a.runoob_author = b.runoob_author;
A表 INNER JOIN B表? ON A.x = B.X
INNER JOIN ON 語(yǔ)句使用兩張表相同的字段 值相等的行做鏈接 , 拼接起來(lái)兩張表的數(shù)據(jù)


* LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒(méi)有對(duì)應(yīng)匹配的記錄。
SELECT
?a.runoob_id, a.runoob_author, b.runoob_count?
FROM?
runoob_tbl a LEFT JOIN tcount_tbl b?
ON a.runoob_author = b.runoob_author;


*RIGHT JOIN(右連接):與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒(méi)有對(duì)應(yīng)匹配的記錄。
SELECT?
a.runoob_id, a.runoob_author, b.runoob_count
?FROM?
runoob_tbl a RIGHT JOIN tcount_tbl b?
ON a.runoob_author = b.runoob_author;

MySQL 索引
索引分單列索引和組合索引。
單列索引,即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引,但這不是組合索引。
組合索引,即一個(gè)索引包含多個(gè)列
創(chuàng)建索引時(shí),你需要確保該索引是應(yīng)用在 SQL 查詢語(yǔ)句的條件(一般作為 WHERE 子句的條件)。
實(shí)際上,索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄。
索引也會(huì)有它的缺點(diǎn):雖然索引大大提高了查詢速度,同時(shí)卻會(huì)降低更新表的速度,如對(duì)表進(jìn)行INSERT、UPDATE和DELETE。
因?yàn)楦卤頃r(shí),MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。
建立索引會(huì)占用磁盤空間的索引文件。
創(chuàng)建索引
基本創(chuàng)建:
CREATE INDEX indexName ON mytable(username(length));
修改表結(jié)構(gòu)(添加索引):
ALTER table tableName ADD INDEX indexName(columnName)
創(chuàng)建表的時(shí)候直接指定:
CREATE TABLE mytable(
ID INT NOT NULL,?
username VARCHAR(16) NOT NULL,?
INDEX [indexName] (username(length))?
);?
刪除索引的語(yǔ)法:
DROP INDEX [indexName] ON mytable;
唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一
創(chuàng)建索引:
CREATE UNIQUE INDEX indexname ON mytable(username(length))
顯示索引信息:
SHOW INDEX FROM table_name
Group by 語(yǔ)法
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
function 一般有 count(統(tǒng)計(jì)分出來(lái)的組每組多少條) sum(計(jì)算每組某一個(gè)字段的和) avg(計(jì)算每組某個(gè)字段的均值) 函數(shù)
插入數(shù)據(jù)
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl`
( `id` int(11) NOT NULL
, `name` char(10) NOT NULL DEFAULT ' '
, `date` datetime NOT NULL,
`singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登錄次數(shù)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
數(shù)據(jù):
insert into employee_tbl values? ('1', '小明', '2016-04-22 15:25:33', '1'),('2', '小王', '2016-04-20 15:25:47', '3'),('3', '小麗', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'),('6', '小明', '2016-04-04 15:26:54', '2');

例子:
select name ,count(*) ,sum(id) ,AVG(id) from employee_tbl group by name ;

WITH ROLLUP??可以實(shí)現(xiàn)在分組統(tǒng)計(jì)數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(jì)(SUM,AVG,COUNT…)
coalesce(a,b,c);??如果a==null,則選擇b;如果b==null,則選擇c;如果a!=null,則選擇a;如果a b c 都為null ,則返回為null(沒(méi)意義)。
select coalesce(name,'總次數(shù)') name ,sum(singin) as singin_count from employee_tbl group by name with rollup ;

分組后的條件使用 HAVING 來(lái)限定,WHERE 是對(duì)原始數(shù)據(jù)進(jìn)行條件限制。幾個(gè)關(guān)鍵字的使用順序?yàn)?where 、group by 、having、order by ,例如:
SELECT name ,sum(singin)as 'cishu' FROM employee_tbl WHERE id<>1 GROUP BY name HAVING sum(singin)>5 ORDER BY sum(singin) DESC;
