引言
無論用的什麼數據庫,藉助什麼程序進行數據庫可視化,或者編程語言查詢,實質都是通過SQL語句中的SELECT關鍵字進行查詢。本文將舉例說明SELECT使用方法。使用優秀的SQL語句篩選數據比將數據獲取到後臺通過代碼處理效率高很多。
數據準備
本文使用mySQL數據庫,DataGrip進行數據庫可視化。
大家可以新建自己的空數據庫並對其執行我導出的SQL文件。
-- MySQL dump 10.13 Distrib 5.7.11, for Win64 (x86_64)
--
-- Host: 127.0.0.1 Database: studentinfo
-- ------------------------------------------------------
-- Server version 5.7.11-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `class`
--
DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
`ID` char(5) NOT NULL,
`headTeacher` char(9) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `class_teacher_ID_fk` (`headTeacher`),
CONSTRAINT `class_teacher_ID_fk` FOREIGN KEY (`headTeacher`) REFERENCES `teacher` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `class`
--
INSERT INTO `class` VALUES ('1','1'),('2','1'),('3','2'),('4','2'),('5','3');
--
-- Table structure for table `student`
--
DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `student` (
`ID` char(9) NOT NULL,
`name` char(7) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`classID` char(5) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `student_class_ID_fk` (`classID`),
CONSTRAINT `student_class_ID_fk` FOREIGN KEY (`classID`) REFERENCES `class` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `student`
--
INSERT INTO `student` VALUES ('201400001','張三',24,'1'),('201400002','李四',24,'1'),('201500001','王五',23,'2'),('201500002','趙六',23,'2'),('201600001','孫七',22,'3'),('201700001','周八',21,'4'),('201800001','吳九',20,'5'),('201800002','鄭十',20,'5');
--
-- Table structure for table `teacher`
--
DROP TABLE IF EXISTS `teacher`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `teacher` (
`ID` char(9) NOT NULL,
`age` int(11) DEFAULT NULL,
`name` char(7) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `teacher`
--
INSERT INTO `teacher` VALUES ('1',40,'張老師'),('2',38,'李老師'),('3',29,'王老師');
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-05-27 2:17:24
選擇數據庫執行以上代碼即可完成本文需要的表的建立及數據插入。
正文
簡單查詢
數據庫不區分大小寫,但建議關鍵字大寫
數據庫以";"判斷語句是否結束,以下出現的SQL語句可以寫成多行,使用命令行時需要在末尾加上分號如下所示:
SELECT
*
FROM student;
正式開始
查詢表裏的全部數據:
SELECT * FROM student
*表示所有列,FROM接要查詢的表名
查詢部分列:
SELECT ID,name,age FROM student
將要選擇的列用 , 隔開。
給列取別名:
SELECT ID as A,name,age FROM student
(多表查詢時,有重複字段可以取別名區分)。
內置方法,數據庫提供許多內置方法,如COUNT計算數量,DISTINCT找唯一值。
SELECT DISTINCT classID FROM student
帶條件的查詢
查找二班的學生:
SELECT * FROM student WHERE classID=2
WHERE後的判斷條件是字符串時需要加引號,查找張三的信息:
SELECT * FROM student WHERE name='張三'
查詢支持>,<判斷。範圍則用 BETWEEN 0 AND 60
多個條件用 OR,或者IN。下述兩句結果相同
SELECT * FROM student WHERE name='張三' OR name='李四'
SELECT * FROM student WHERE name IN('張三','李四')
通配符
查詢字符串時,可進行模糊匹配:查詢以名字"師"結尾的老師,"%“匹配任意多個字符。”_"匹配一個字符。
SELECT * FROM teacher WHERE name LIKE "%師"
SELECT * FROM teacher WHERE name LIKE "李_師"
關鍵字AVG, MAX, MIN, 可以完成平均值,最大,最小值的計算。可以通過 as 取個別名
SELECT AVG(age),MAX(age),MIN(age) FROM student
分組查詢,排序,分頁查詢
這裏以第一列的數量,classID分組,結果爲每個班級的學生數量.num爲別名:
SELECT count(0)as num,classID FROM student GROUP BY classID
按照數量排序:
SELECT count(0)as num,classID FROM student GROUP BY classID ORDER BY num
倒序 “DESC”,默認爲"ASC"
SELECT count(0)as num,classID FROM student GROUP BY classID ORDER BY num DESC
數據庫分頁主要利用LIMIT和OFFSET關鍵字,分別限制返回數據條數,及偏移量,示例 :查找 3條/頁 的第三頁 LIMIT爲限制條數3,OFFSET=(頁碼-1)* LIMIT
SELECT * FROM student LIMIT 3 OFFSET 6
多表查詢
演示通過學生id查詢該學生班級的班主任名稱:
SELECT teacher.name FROM student,class,teacher WHERE student.ID='201400001'AND student.classID=class.ID AND class.ID=teacher.ID
這裏先通過學號找到學生表中對應行,然後通過學生的班級ID找到班級對應的教師ID,然後通過教師ID確定教師信息,取出name。以上結果只選擇了教師姓名。這裏"*"可以取得三個表中關聯行的信息。
SELECT * FROM student,class,teacher WHERE student.ID='201400001'AND student.classID=class.ID AND class.ID=teacher.ID
自身連接
查詢比趙六年齡小的學生。
SELECT * FROM student AS A,student AS B WHERE A.name='趙六' AND B.age<A.age
先查出趙六的信息,再進行年齡比較。
可以看出,數據庫對每行都進行了比較,你可以用"B.*"只獲取後半部分信息。
SELECT B.* FROM student AS A,student AS B WHERE A.name='趙六' AND B.age<A.age
子查詢
選出班主任是張老師的學生姓名:
連接方式:先查出張老師帶的班,然後找到班裏的學生
SELECT student.name from student,class,teacher WHERE teacher.name="張老師" AND class.headTeacher=teacher.ID AND student.classID=class.ID
子查詢:
同樣先查詢出張老師帶的班,然後作爲條件判斷學生的班級是否由他管理。
SELECT student.name
FROM student
WHERE classID IN
(
SELECT class.ID from class,teacher WHERE teacher.name="張老師" AND class.headTeacher=teacher.ID
)
當然 關鍵字 ANY 也有同樣效果
SELECT student.name
FROM student
WHERE classID = ANY
(
SELECT class.ID from class,teacher WHERE teacher.name="張老師" AND class.headTeacher=teacher.ID
)
我們可以將上述結果繼續作爲下一次查詢的條件,例如:判斷張三是否在上述學生中
SELECT COUNT(0) AS num
FROM student
WHERE name='張三' AND name =ANY (
SELECT student.name FROM student WHERE classID = ANY (SELECT class.ID from class,teacher WHERE teacher.name="張老師" AND class.headTeacher=teacher.ID)
)
返回結果:0則說明沒查到數據,不在其中,1說明查到了張三信息。