SQL語句SELECT總結

引言

無論用的什麼數據庫,藉助什麼程序進行數據庫可視化,或者編程語言查詢,實質都是通過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說明查到了張三信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章