> #### *MySQL一些常用查詢技巧*
查詢每個班有多少人,如果沒有人的班級顯示無
```
SELECT IF (COUNT(u.class_id),COUNT(u.class_id),'無') AS num,c.cname
FROM `class` AS c LEFT JOIN `user` AS u ON u.class_id=c.id GROUP BY c.id;
```
order by可以進行多次排序,如
```
select * from `user` order by class, order by score desc;
```
查出每個班的及格人數與不及格人數,格式為:class、及格人數、不及格人數
對于這種矛盾體來說(也就是即要不格又要及格),主要用到的是if,
向表中添加一個字段
```
alter table 表名 add 字段名 varchar(20) not null
```
修改
```
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段類型定義
```
刪除
```
alter table 表名 drop column 字段名
```
清空表數據
```
truncate 表名
```
復制表結構
```
1、CREATE TABLE 要復制的表名 SELECT * FROM 被復制的表名 WHERE 0;#結構與數據同時復制
2、create table 表名 like 要復制表名;#只復制表結構
insert into 表名 select * from 要復制的表名; #復制表內容
```
> #分組后一般查詢的字段只能是分組的字段
> #where中不能用聚合函數
> #在聚合函數中要用having代替where,having是在進行分組后篩選
### **刪除表中的重復記錄,同時保留最小id的記錄**
```
DELETE FROM tableName WHERE id IN (
SELECT b.id FROM (
SELECT
max(id) AS id,title,count(*) AS repeat_num
FROM
tableName as a
GROUP BY
title
HAVING
repeat_num > 1
) AS b
)
```
查看慢查詢日志(超過10秒的才會被記錄)
`show variables like '%quer%'`
查看一個數據庫中是否有慢查詢
`show status like '%quer%'`
#查出文章表中所有的文章并顯示屬于哪個分類下的文章,如果有圖片將圖片顯示出業,如果沒有,則不顯示
```
SELECT
b.id,
b.title,
a.cat_name,
ifnull(c.file,'無圖片') as image
FROM
article_category AS a
LEFT OUTER JOINarticle AS b ON a.cat_id = b.cat_id
LEFT OUTER JOIN file AS c ON b.image = c.number
```
*****
> 獲取上一篇與下一篇實現思路
##### 當前文章
`select * from dou_article where id = 232 limit 0,1;
`
##### 上一篇:原理:查出比當前文章id小于的所有文章id,然后再將查出來的所有id求出最大值
`select max(id) from dou_article where id < 232 limit 0,1;
`
##### 下一篇:原理:查出比當前文章id大于的所有文章的id,然后再將查出來的所有id求出最小值
`select min(id) from dou_article where id > 232 limit 1;`
*****
>發貼數最多的十個人名字的SQL,利用下表:members(id,username,posts,pass,email)
`select username from members order by posts desc limit 0,10`
*****
> 根據分組選擇所有分組下面的數據
在mysql中如果用group by進行分組,選擇的數據只包含了第一條,如果選擇所有的數據,可以用mysql的一個函數來選取,group_concat()
`select username from members order by posts desc limit 0,10`