本文目錄一覽:
- 1、MySQL利用count()函數統計總數的技巧
- 2、如何用mysql數據庫統計分類下文章數量
- 3、Mysql數據庫一個字段內多個值如何統計個數
- 4、mysql快速查詢數據庫中有多少條數據
- 5、mysql怎麼統計總數
- 6、mysql查詢統計數量
MySQL利用count()函數統計總數的技巧
2020-03-01
對於count的函數的使用,我們常見的一個錯誤是在括號內隨意指定一個列去統計結果集的行數。但只有指定的行確實都是有值的時候,統計的才是實際的行數,否則可能統計的結果並不是實際的行數。而對於MyISAM存儲引擎,如果某一列的值確實不可能為null時,MySQL內部就會將count()函數優化成count(*),若沒有帶where條件,此時計算速度是非常快的,因為此時沒有實際的去計算表的行數。
總結: 對於MyISAM存儲引擎,不帶where條件的count(*)是非常快的。
技巧:
利用上述MyISAM的count(* )特性,加速一些特定查詢條件的count()查詢。
如:
對於select count(* ) from tablename where id 10; 可以做如下的反轉查詢:
select (select count(* ) from tablename) – count(* ) from tablename where id 10;
因為這樣在查詢階段MySQL將子查詢當做一個常數來處理,大大減少了掃描的行數。
如何用mysql數據庫統計分類下文章數量
直接group by 不就可以了?
select 文章分類,count(*)
from 表
group by 文章分類
是要這樣嗎
Mysql數據庫一個字段內多個值如何統計個數
CREATE TABLE person (
name varchar(20)
);
INSERT INTO person VALUES (‘a,b,c’);
INSERT INTO person VALUES (‘a,b’);
INSERT INTO person VALUES (‘a,c’);
DELIMITER //
DROP FUNCTION GetTextCount //
/**********
— 獲取字符串中有幾個部分.
**********/
CREATE FUNCTION GetTextCount(pSourceText VARCHAR(255), pDivChar CHAR(1))
RETURNS TINYINT
BEGIN
— 預期結果.
DECLARE vResult TINYINT;
— 當前逗號的位置.
DECLARE vIndex INT;
— 前一個逗號的位置.
DECLARE vPrevIndex INT;
— 結果的初始值.
SET vResult = 1;
— 查詢第一個 逗號的位置.
SET vIndex = INSTR(pSourceText, pDivChar);
IF vIndex = 0 THEN
— 參數中沒有逗號,直接返回.
RETURN vResult;
END IF;
— 初始化情況,前一個逗號不存在.
SET vPrevIndex = 0;
— 循環處理。
WHILE vIndex 0 DO
— 結果遞增.
SET vResult = vResult + 1;
— 前一個逗號的位置 = 當前逗號的位置
SET vPrevIndex = vIndex;
— 查詢下一個逗號的位置.
SET vIndex = LOCATE(pDivChar, pSourceText, vPrevIndex + 1);
END WHILE;
— 返回結果.
RETURN vResult;
END;
//
DROP FUNCTION GetTextValue //
/**********
— 獲取字符串中具體某一個部分的數據.
**********/
CREATE FUNCTION GetTextValue(pSourceText VARCHAR(255), pDivChar CHAR(1), pIndex TINYINT)
RETURNS VARCHAR(255)
BEGIN
— 預期結果.
DECLARE vResult VARCHAR(255);
IF pIndex = 1 THEN
SELECT SUBSTRING_INDEX(pSourceText, pDivChar, 1) INTO vResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText, pDivChar, pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText, pDivChar, pIndex – 1) , pDivChar),
”) INTO vResult;
END IF;
— 返回.
RETURN vResult;
END;
//
DELIMITER ;
SELECT
GetTextValue(t.name, ‘,’, MaxNum.No) AS `名稱`,
COUNT(*) AS `個數`
FROM
person t,
(SELECT 1 No UNION ALL
SELECT 2 No UNION ALL
SELECT 3 No UNION ALL
SELECT 4 No UNION ALL
SELECT 5 No ) MaxNum
WHERE
GetTextCount(t.name, ‘,’) = MaxNum.No
GROUP BY
GetTextValue(t.name, ‘,’, MaxNum.No);
+——+——+
| 名稱 | 個數 |
+——+——+
| a | 3 |
| b | 2 |
| c | 2 |
+——+——+
3 rows in set (0.01 sec)
mysql快速查詢數據庫中有多少條數據
今天主要複習了MySQL的一些簡單語句,可總結:
mysql 統計 表的數量:SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA = ‘你的數據庫’;
有時候需要查詢MySQL數據庫中各個表大小,該如何操作呢?
MySQL中有一個名為 information_schema 的數據庫,在該庫中有一個 TABLES 表,這個表主要字段分別是:
TABLE_SCHEMA : 數據庫名
TABLE_NAME:表名
ENGINE:所使用的存儲引擎
TABLES_ROWS:記錄數
DATA_LENGTH:數據大小
INDEX_LENGTH:索引大小
use information_schema;
SELECT
TABLE_NAME,
(DATA_LENGTH/1024/1024) as DataM ,
(INDEX_LENGTH/1024/1024) as IndexM,
((DATA_LENGTH+INDEX_LENGTH)/1024/1024) as AllM,
TABLE_ROWS
FROM
TABLES
WHERE
TABLE_SCHEMA = ‘你的數據庫’;
MySQL的一些基礎語句:
行是記錄 列是字段
創建庫
CREATE DATABASE [IF NOT EXISTS] 數據庫名 [參數[ 參數] [ 參數]…];
參數:
CHARACTER SET 碼錶名
COLLATE 校對規則名, 詳見文檔10.10.1
顯示庫
SHOW DATABASES;
顯示數據庫創建語句
SHOW CREATE DATABASE 數據庫名;
修改庫
ALTER DATABASE 數據庫名[ 參數[ 參數][ 參數]…];
注意: 不能改數據庫的名字
刪除庫
DROP DATABASE [IF EXISTS] 數據庫名;
操作表之前使用需要先確定使用哪個數據庫
USE 數據庫名
創建表
CREATE TABLE 表名(列名 類型[,列名 類型][,列名 類型]…);
查看所有表
SHOW TABLES;
查看錶的創建語句
SHOW CREATE TABLE 表名;
顯示錶結構
DESC 表名;
修改表名
RENAME TABLE 原表名 TO 新表名;
修改字符集
ALTER TABLE 表名 CHARACTER SET 字符集名;
刪除表
DROP TABLE 表名;
追加列
ALTER TABLE 表名 ADD 列名 類型[,列名 類型][,列名 類型]…;
修改列類型
ALTER TABLE 表名 MODIFY 列名 類型[,列名 類型][,列名 類型]…;
修改列
ALTER TABLE 表名 CHANGE COLUMN 原列名 新列名 類型;
刪除列
ALTER TABLE 表名 DROP 列名;
插入語法:
INSERT INTO 表名[(列名[,列名]…)] VALUES(值[,值]…);
注意事項:
插入值類型必須與對應列的數據類型一致
數據不能超出長度
插入值得為之必須與列名順序一致
字符和日期數據要放在單引號中
插入空值使用null
如果不指定插入哪一列, 就是插入所有列
中文數據
由於默認碼錶是utf8, 而cmd.exe的碼錶是gbk, 在插入中文數據的時候會報錯, 所以我們需要修改客戶端碼錶
先查看系統變量: SHOW VARIABLES LIKE ‘character%’;
修改客戶端碼錶: SET character_set_client=gbk;
修改輸出數據的碼錶: SET character_set_results=gbk;
修改語法
UPDATE 表名 SET 列名=值[,列名=值]…[WHERE 條件語句];
注意事項
WHERE子句選擇滿足條件的行進行更新, 如果不寫, 則更新所有行
刪除語法
DELETE FROM 表名 [where 條件語句]
注意事項
如果不加where子句, 將刪除表中所有記錄
delete只能用作刪除行, 不能刪除某一列的值, 需要用update
在delete和update的時候需要注意表與表之間的關聯關係
刪除表中所有數據可以使用: TRANCATE 表名, 這種方式會刪除舊錶重新創建, 在數據較多的時候使用
備份數據庫
輸入quit退出mysql, 在cmd.exe中輸入:
mysqldump –u用戶名 –p密碼 數據庫名 文件名
恢複數據庫
進入mysql.exe之後, 使用數據庫之後
source 文件名
操作數據(查詢)
DISTINCT語法
SELECT [DISTINCT] 列名[, 列名]… FROM 表名
注意事項
*可以替代列名, 表示所有列, 但是通常我們為了提高代碼的可讀性, 不使用*
DISTINCT為過濾重複記錄
如果DISTINCT後面跟多列, 是過濾掉多列合併之後的重複
列名表達式——語法
SELECT 列名|表達式[,列名|表達式]… FROM 表名
注意事項
表達式只是顯示時起作用, 不會改變數據庫中的值
AS——
SELECT 列名 AS 別名 FROM 表名
注意事項
起別名時AS可以省略
不會改變數據庫中的值
WHERE——
語法
SELECT 列名 FROM 表名 [WHERE 條件語句]
WHERE子句中的運算符
比較運算符
, , =, =, =,
注意不等於和Java中不同, 是
BETWEEN … AND …
某一區間內的值, 從 … 到 …
IN(列表)
在列表之中, 例: in(1,2,3) 代表1或2或3
LIKE(表達式)
模糊查詢, %代表多個字符, _代表單個字符
IS NULL
判斷是否為NULL
邏輯運算符
AND
與, 兩邊都為TRUE結果為TRUE
OR ||
或, 一邊為TRUE結果就為TRUE
NOT !
非, 將表達式結果取反
ORDER BY——
語法
SELECT 列名 FROM 表名 ORDER BY 列名 ASC|DESC;
注意事項
ORDER BY 指定排序的列名可以是表中的列名, 也可以是SELECT語句後面起的別名
ASC為升序, DESC為降序
ORDER BY應在查詢語句的結尾
COUNT函數——
語法
SELECT COUNT(*)|COUNT(列名) from 表名 [WHERE 條件語句]
注意事項
COUNT(列名)的方式是統計指定列中有多少條記錄, 不包括值為NULL的
COUNT(*)則是統計表中有多少條數據
COUNT(DISTINCT 列名) 統計不重複的記錄數
如果加上WHERE子句, 則是統計滿足條件的記錄
mysql怎麼統計總數
統計所有記錄的數量:
SELECT COUNT(*) FROM table_name
統計某列的數量:
SELECT COUNT(column_name) FROM table_name
where 條件
mysql查詢統計數量
一共加了三條數據
insert into pl_org_region(parent_id,region_sn,region_name,comments) values (0,’001′,’北京大區’,’無’);
insert into pl_org_region(parent_id,region_sn,region_name,comments) values (0,’002′,’西南大區’,’無’);
insert into pl_store (store_sn,region_id,region_name) values (‘P001′,6,’北京大區’);
查詢語句改成:
SELECT
p.region_id,
COUNT(p.region_id) AS cnt,
r.*
FROM
pl_org_region r
LEFT JOIN pl_store p ON r.region_id = p.region_id
GROUP BY
p.region_id;
查詢結果:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/279185.html