本文主要給大家介紹SELECT單表、多表查詢升級及插入刪除,其所涉及的東西,從理論知識來獲悉,有很多書籍、文獻可供大家參考,從現實意義來講,億速云累計多年的實踐經驗可分享給大家。
SELECT:查詢
SELECT select-list FROM tb WHERE qualification 根據標準qualification查找對應的行
查詢語句類型: qualification條件 field領域 distinct獨特的,沒有重復的
簡單查詢:
多表查詢:
子查詢:
SELECT * FROM tb_name: 查詢tb_name表的所有信息
SELECT field1,field2 FROM tb_name: 投影顯示所設定的領域條目(field),一個field就是一列
SELECT [DISTINCT] * FROM tb_name WHERE qualification;從tb_name表中選擇符合條件的獨特的不重復的條目。
FROM子句:表、多個表、其他SELECT語句
WHERE子句:布爾關系表達式 =、>、<、<=、>= 表示大于等于,小于等于,大于,小于,等于。
邏輯關系:AND(與&&) OR(或||) NOT(非!) XOR(異或)
mysql>SELECT Name,Age,Gender FROM students WHERE NOT Age>20 AND NOT Gender='M'; #選擇查詢年齡不大于20,且性別不是男的數據,也可以寫成下面的條件
mysql> SELECT Name,Age,Gender FROM students WHERE NOT ( Age>20 OR Gender='M' );
特殊關系:BETWEEN ... AND ... 在兩者之間之間。
LIKE ''
%:任意長度任意字符
_:任意單個字符
Usage: SELECT Name FROM students WHERE Name LIKE 'Y%'; 查找Name字段以Y開頭的數據。
SELECT Name FROM students WHERE Name LIKE '%ing%';查找Name字段中必須包括ing的字段
SELECT Name FROM students WHERE Name LIKE 'Y___';查找Name字段中Y后面至少跟著3個字符的
REGEXP或者RLIKE 支持正則表達式:
Usage:SELECT Name,Age FROM students WHERE Name RLIKE '^[XY].*$';
查找Name字段行首為X或Y的數據
IN離散條件的查找:
Usage: SELECT Name,Age FROM students WHERE Age IN (18,20,25);
查找Age字段為18或20或25歲的相關數據
有空值的時候,比較:IS NULL ,NOT NULL ORDER BY ... 以...某字段升序排列
ORDER BY ... 以...某字段降序排列
Usage: SELECT Name,Age FROM students WHERE Name IS NULL;
查找Name字段為空值的數據
SELECT Name,Age FROM students WHERE Name IS NULL;
查找Name字段不為空值的數據
按照升序或者降序排列出查找的數據:ORDER BY field_name {ASC|DESC};
ASC升序排列(默認值)DESC降序排列
SELECT Name,Age FROM students WHERE CID IS NOT NULL ORDER BY Name;
查找CID字段不為空的數據并按字段Name的升序排列;
SELECT Name,Age FROM students WHERE CID IS NOT NULL ORDER BY Name DESC;
查找CID字段不為空的數據并按字段Name的降序排列;
字段別名:AS
Usage: SELECT Name AS Student_Name FROM student;
mysql> SELECT Name FROM student;
+------------+
| Name |
+------------+
| Li Lianjie |
| Cheng Long |
| Yang Guo |
| Guo Jing |
+------------+
4 rows in set (0.00 sec)
mysql> SELECT Name AS Student_Name FROM student;
+--------------+
| Student_Name | AS別名為Student_Name
+--------------+
| Li Lianjie |
| Cheng Long |
| Yang Guo |
| Guo Jing |
+--------------+
4 rows in set (0.00 sec)
LIMIT子句:LIMIT [offset,]Count offset偏移多少,Count顯示多少
Usage: SELECT Name AS Student_Name FROM student LIMIT 3;
查找顯示Name別名為Student_Name,只顯示前3個數據
Usage: SELECT Name AS Student_Name FROM student LIMIT 2,2;
查找顯示Name別名為Student_Name,偏移掉前2個數據不顯示,顯示第2個數據后的2個數據
mysql> SELECT Name AS Student_Name FROM student LIMIT 3;
+--------------+
| Student_Name |
+--------------+
| Li Lianjie |
| Cheng Long |
| Yang Guo |
+--------------+
3 rows in set (0.00 sec)
mysql> SELECT Name AS Student_Name FROM student LIMIT 2,2;
+--------------+
| Student_Name |
+--------------+
| Yang Guo |
| Guo Jing |
+--------------+
2 rows in set (0.00 sec)
聚合運算:SUM()求和,MIN()最小值,MAX()最大值,AVG()平均值,COUNT()統計字段中相同數值的個數;
新建立一張表:
mysql> CREATE TABLE class(ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,Name CHAR(20) NOT NULL UNSIGNED, Age TINYINT NOT NULL);
mysql> INSERT INTO class (Name,Age) VALUES ('Yang Guo',22),('Guo Jing',46),('Xiao Longnv',18),('Huang Rong',40);
mysql> DESC class;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(20) | NO | | NULL | |
| Age | tinyint(4) | NO | | NULL | |
+-------+------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM class;
+----+-------------+-----+
| ID | Name | Age |
+----+-------------+-----+
| 1 | Yang Guo | 22 |
| 2 | Guo Jing | 46 |
| 3 | Xiao Longnv | 18 |
| 4 | Huang Rong | 40 |
+----+-------------+-----+
4 rows in set (0.00 sec)
mysql> SELECT SUM(Age) FROM class;
+----------+
| SUM(Age) |
+----------+
| 126 |
+----------+
1 row in set (0.02 sec)
mysql> SELECT MAX(Age) FROM class;
+----------+
| MAX(Age) |
+----------+
| 46 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT MIN(Age) FROM class;
+----------+
| MIN(Age) |
+----------+
| 18 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT AVG(Age) FROM class;
+----------+
| AVG(Age) |
+----------+
| 31.5000 |
+----------+
1 row in set (0.00 sec)
分組:GROUP BY ... HAVING qualification 根據...分組 并且滿足條件qualification
對于GROUP BY的條件選擇需用HAVING作為條件篩選,而不是用WHERE
mysql> SELECT Age,Gender FROM class1 GROUP BY Gender; #以性別分組顯示
+-----+--------+
| Age | Gender |
+-----+--------+
| 18 | F |
| 22 | M |
+-----+--------+
2 rows in set (0.00 sec)
mysql> SELECT AVG(Age),Gender FROM class1 GROUP BY Gender; #求男同學和女同學的平均年齡。
+----------+--------+
| AVG(Age) | Gender |
+----------+--------+
| 29.0000 | F |
| 34.0000 | M |
+----------+--------+
2 rows in set (0.00 sec)
mysql> SELECT Name,AVG(Age) FROM class1 GROUP BY Gender HAVING Name RLIKE 'Y.*';
#求以Gender分組的年齡平局值,且只顯示以Y開頭的Name字段的平均值和姓名
+----------+----------+
| Name | AVG(Age) |
+----------+----------+
| Yang Guo | 34.0000 |
+----------+----------+
1 row in set (0.00 sec)
SELECT用法歸納:
多表查詢:
連接:
交叉連接:笛卡爾乘積 (Usag:SELECT * FROM students,course;查詢students和course表的 內容)
自然連接:
Usage: SELECT students.Name,courses.Course FROM students,courses WHERE students.CID1=courses.CID 查詢students表和courses表CID1=CID的選項,并顯示名稱
外連接:
左外連接:左表 LEFT JOIN 右表 ON 條件
右外連接:左表 RIGHT JOIN 右表 ON 條件
Usage:
SELECT s.Name,c.Name FROM students AS s LEFT JOIN courses AS c ON s.CID1=c.CID;
顯示左表中所有學生,并查看他們所選修的課程名稱,沒有選修課程的直接顯示NULL
SELECT s.Name,c.Name FROM students AS s RIGHT JOIN courses AS c ON s.CID1=c.CID;
查看右表中所有選修課程,并查看有哪些學生選修了,課程沒有被選修的直接顯示NULL
自連接:
對于一個表自己的多個字段進行連接查詢
Usage:
SELECT c.Name AS student,s.Name AS teacher FROM students AS c,students AS s WHERE
c.TID=s.SID;
查看students表中TID和SID相同的字段,并顯示他們的學生名和老師名。AS取別名
子查詢:
查詢語句里面嵌套其他的子查詢,比較操作中使用子查詢,子查詢只能返回單個值;
Usage: SELECT Name FROM students WHERE Age > (SELECT AVG(Age) FROM students);
查詢年齡大于平均年齡的學生姓名
IN (): 使用子查詢
Usage:SELECT Name FROM students WHERE Age IN(SELECT Age FROM teacheers);
查詢學生年齡中與老師年齡一樣的學生姓名,IN表示子查詢可以是一組數值。
FROM中也可以插入子查詢:
Usage:SELECT Name,Age FROM (SELECT Name,Age FROM students) AS t WHERE t.Age >= 20;
從SELECT查詢的結構的表中再從中查詢其他符合條件的數據
聯合查詢:
UNION :把兩張表連接成一張表查詢顯示出來
Usage: (SELECT Name,Age FROM class) UNION (SELECT CID,Couse FROM courses)
把courses表中CID和Couse字段跟class表中的Name和Age字段聯合起來顯示為一張表
mysql> SELECT Name,Age FROM class;
+-------------+-----+
| Name | Age |
+-------------+-----+
| Yang Guo | 22 |
| Guo Jing | 46 |
| Xiao Longnv | 18 |
| Huang Rong | 40 |
+-------------+-----+
4 rows in set (0.00 sec)
mysql> SELECT CID,Couse FROM courses;
+-----+-----------+
| CID | Couse |
+-----+-----------+
| 1 | physics |
| 2 | english |
| 3 | chemistry |
| 4 | maths |
+-----+-----------+
4 rows in set (0.00 sec)
mysql> (SELECT Name,Age FROM class) UNION (SELECT CID,Couse FROM courses);
+-------------+-----------+
| Name | Age |
+-------------+-----------+
| Yang Guo | 22 |
| Guo Jing | 46 |
| Xiao Longnv | 18 |
| Huang Rong | 40 |
| 1 | physics |
| 2 | english |
| 3 | chemistry |
| 4 | maths |
+-------------+-----------+
8 rows in set (0.00 sec)
實例:
1.挑選出courses表中沒有被students表中的CID2學習的課程的課程名稱;
msyql> SELECT Cname FROM courses WHERE CID NOT IN (SELECT DISTINCT CID2 FROM students
WHERE CID2 IS NOT NULL); #SELECT DISTINCT CID2 FROM students WHERE CID2 IS NOT NULL從students表中找出CID2不為空的且不重復的行,然后從courses表中找到CID不在剛才查找的那些行
里面的Cname的值
2.找出students表中CID2有兩個或者以上的同學學習了的,同一門課程的課程名稱;
msyql> SELECT Cname FROM courses WHERE CID IN (SELECT CID2 FROM students GROUP
BY CID2 HAVING COUNT(CID2) >= 2); #查找一門課程至少2個同學學習,并顯示課程名稱。
3.顯示每一個課程及其相關的老師,沒有老師教授的課程將其老師顯示為空;
msyql> SELECT t.Tname,c.Cname FROM teachers AS t RIGHT JOIN courses AS c ON t.CID=c.TID;
4.顯示每一位老師及其所教授的課程,沒有教授的課程保持為null;
msyql> SELECT t.Tname,c.Cname FROM teachers AS t LEFT JOIN courses AS c ON t.CID=c.TID;
5.顯示每位同學的CID1課程名及其講授了相關課程的老師名稱;
msyql> SELECT Name,Cname,Tname FROM students,courses,teachers WHERE students.CID1=courses.CID AND courses.CID=teachers.CID;
看了以上介紹SELECT單表、多表查詢升級及插入刪除,希望能給大家在實際運用中帶來一定的幫助。本文由于篇幅有限,難免會有不足和需要補充的地方,大家可以繼續關注億速云行業資訊板塊,會定期給大家更新行業新聞和知識,如有需要更加專業的解答,可在官網聯系我們的24小時售前售后,隨時幫您解答問題的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。