文章目錄
- 0 前言
- 1 連接查詢的定義
- 2 內連接查詢
- 3 外連接查詢
- 4 聯合查詢
- 5 外鍵
- 6 測驗代碼
- 6.1 創建Database
- 6.2 操作代碼
0 前言
總結了MySQL連接查詢操作的相關操作且給出了部分測驗代碼,大家可以輸入到MySQL中進行驗證,文章來源于麥子學院king老師的課程內容,我會及時回復評論區的問題,如果覺得本文有幫助歡迎點贊 😃,
1 連接查詢的定義
連接查詢是將兩個或兩個以上的表按某個條件連接起來,從中選取需要的資料,連接查詢是同時查詢兩個或兩個以上的表時使用的,當不同的表中存在相同意義的欄位時,可以通過該欄位連接這幾個表,
2 內連接查詢
JOIN|CROSS JOIN INNER JOIN,通過ON 連接條件,顯示兩個表中符合連接條件的記錄,
3 外連接查詢
- 左外連接
LEFT [OUTER] JOIN
顯示左表的全部記錄及右表符合連接條件的記錄 - 右外連接
RIGHT [OUTER] JOIN
顯示右表的全部記錄以及左表符合條件的記錄
4 聯合查詢
- UNION
- UNION ALL
- UNION和UNION ALL 區別是UNION去掉相同記錄,UNION ALL 是簡單的合并到一起,
5 外鍵
外鍵是表的一個特殊欄位,被參照的表是主表,外鍵所在欄位的表為子表,設定外鍵的原則需要記住,就是依賴于資料庫中已存在的表的主鍵,外鍵的作用是建立該表與其父表的關聯關系,父表中對記錄做操作時,子表中與之對應的資訊也應有相應的改變,外鍵的作用保持資料的一致性和完整性,可以實作一對一或一對多的關系,
- 父表和子表必須使用相同的存盤引擎,而且禁止使用臨時表,
- 資料表的存盤引擎只能為InnoDB,
- 外鍵列和參照列必須具有相似的資料型別,其中數字的長度或是否有符號位必須相同;而字符的長度則可以不同,
- 外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,MySQL將自動創建索引,
- 外鍵約束的參照操作
CASCADE:從父表洗掉或更新且自動洗掉或更新子表中匹配的行,
SET NULL:從父表洗掉或更新行,并設定子表中的外鍵列為NULL,如果使用該選項,必須保證子表列沒有指定NOT NULL,
RESTRICT:拒絕對父表的洗掉或更新操作,
NO ACTION:標準SQL的關鍵字,在MySQL中與RESTRICT相同,
6 測驗代碼
6.1 創建Database
首先要創建名為cms的database,詳細代碼見我的另外一篇文章文章鏈接6.1節內容,輸入即可,
6.2 操作代碼
-- 查詢cms_user id,username
-- provinces,proName
SELECT cms_user.id,username,proName FROM cms_user,provinces;
-- cms_user的proId對應省份表中的id
SELECT cms_user.id,username,proName FROM cms_user,provinces
WHERE cms_user.proId=provinces.id;
-- 查詢cms_user表中id,username,email,sex
-- 查詢provinces表proName
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u
INNER JOIN provinces AS p
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
CROSS JOIN cms_user AS u
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
JOIN cms_user AS u
ON u.proId=p.id;
-- 查詢cms_user id,username,sex
-- 查詢provinces proName
-- 條件是cms_user的性別為男的用戶
SELECT u.id,u.username,u.sex,p.proName
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男';
-- 根據proName分組
SELECT u.id,u.username,u.sex,p.proName,COUNT(*) AS totalUsers,GROUP_CONCAT(username)
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男'
GROUP BY p.proName;
-- 對分組結果進行篩選,選出組中人數>=1的
SELECT u.id,u.username,u.sex,p.proName,COUNT(*) AS totalUsers,GROUP_CONCAT(username)
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男'
GROUP BY p.proName
HAVING COUNT(*)>=1;
-- 按照id升序排列
SELECT u.id,u.username,u.sex,p.proName,COUNT(*) AS totalUsers,GROUP_CONCAT(username)
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男'
GROUP BY p.proName
HAVING COUNT(*)>=1
ORDER BY u.id ASC;
-- 限制顯示條數 前2條
SELECT u.id,u.username,u.sex,p.proName,COUNT(*) AS totalUsers,GROUP_CONCAT(username)
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男'
GROUP BY p.proName
HAVING COUNT(*)>=1
ORDER BY u.id ASC
LIMIT 0,2;
-- 查詢cms_news中的id,title,
-- 查詢cms_cate 中的cateName
SELECT n.id,n.title,c.cateName FROM
cms_news AS n
JOIN
cms_cate AS c
ON n.cId=c.id;
-- cms_news id,title
-- cms_admin username,role
SELECT n.id,n.title,a.username,a.role
FROM
cms_news AS n
JOIN
cms_admin AS a
ON n.aId=a.id;
-- cms_news id ,title
-- cms_cate cateName
-- cms_admin username,role
SELECT n.id,n.title,c.cateName,a.username,a.role
FROM cms_cate AS c
JOIN
cms_news AS n
ON n.cId=c.id
JOIN
cms_admin AS a
ON n.aId=a.id;
-- 插入錯誤的資料
INSERT cms_user(username,password,regTime,proId)
VALUES('TEST2','TEST2','1381203974',20);
-- 左外連接
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u
LEFT JOIN provinces AS p
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
LEFT JOIN cms_user AS u
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
RIGHT JOIN cms_user AS u
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
RIGHT JOIN cms_user AS u
ON u.proId=p.id;
-- 創建部門表department(主表)
-- id depName
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教學部'),
('市場部'),
('運營部'),
('督導部');
-- 創建員工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('king',1),
('queen',2),
('張三',3),
('李四',4),
('王五',1);
SELECT e.id,e.username,d.depName FROM
employee AS e
JOIN
department AS d
ON e.depId=d.id;
-- 洗掉督導部
DELETE FROM department WHERE depName='督導部';
-- 創建部門表department(主表)
-- id depName
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教學部'),
('市場部'),
('運營部'),
('督導部');
-- 創建員工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
FOREIGN KEY(depId) REFERENCES department(id)
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('king',1),
('queen',2),
('張三',3),
('李四',4),
('王五',1);
-- 洗掉主表中的記錄
DELETE FROM department WHERE id=1;
-- 洗掉employee中的屬于1部門的人
DELETE FROM employee WHERE depId=1;
INSERT employee(username,depId) VALUES('test',11);
-- 洗掉員工表
DROP TABLE employee;
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id)
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('king',3),
('queen',2),
('張三',3),
('李四',4),
('王五',2);
-- 洗掉外鍵
ALTER TABLE employee DROP FOREIGN KEY emp_fk_dep;
-- 添加外鍵
ALTER TABLE employee ADD CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id);
----------------
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教學部'),
('市場部'),
('運營部'),
('督導部');
-- 創建員工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
FOREIGN KEY(depId) REFERENCES department(id) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('king',1),
('queen',2),
('張三',3),
('李四',4),
('王五',1);
-- 洗掉部門表中的第一個部門
DELETE FROM department WHERE id=1;
UPDATE department SET id=id+10;
--------------------
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
)ENGINE=INNODB;
INSERT department(depName) VALUES('教學部'),
('市場部'),
('運營部'),
('督導部');
-- 創建員工表employee(子表)
-- id ,username ,depId
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
FOREIGN KEY(depId) REFERENCES department(id) ON DELETE SET NULL ON UPDATE SET NULL
)ENGINE=INNODB;
INSERT employee(username,depId) VALUES('king',1),
('queen',2),
('張三',3),
('李四',4),
('王五',1);
-- 聯合查詢
SELECT username FROM employee UNION SELECT username FROM cms_user;
SELECT username FROM employee UNION ALL SELECT username FROM cms_user;
SELECT id,username FROM employee UNION ALL SELECT username,age FROM cms_user;
-- 由[NOT] IN引發的子查詢
SELECT id FROM department;
SELECT id,username FROM employee WHERE depId IN(1,2,3,4);
SELECT id,username FROM employee WHERE depId IN(SELECT id FROM department);
SELECT id,username FROM employee WHERE depId NOT IN(SELECT id FROM department);
INSERT employee(username,depId) VALUES('testtest',8);
-- 創建學員表student
-- id username score
CREATE TABLE IF NOT EXISTS student(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
score TINYINT UNSIGNED
);
INSERT student(username,score) VALUES('king',95),
('king1',35),
('king2',45),
('king3',55),
('king4',65),
('king5',75),
('king6',80),
('king7',90),
('king8',25);
-- 創建獎學金scholarship
-- id ,level
CREATE TABLE IF NOT EXISTS scholarship(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
level TINYINT UNSIGNED
);
INSERT scholarship(level) VALUES(90),(80),(70);
-- 查詢獲得1等獎學金的學員有
SELECT level FROM scholarship WHERE id=1;
SELECT id,username FROM student WHERE score>=90;
SELECT id,username FROM student WHERE score>=(SELECT level FROM scholarship WHERE id=1);
-- 查詢部門表中
SELECT * FROM department WHERE id=5;
SELECT id,username FROM employee WHERE EXISTS(SELECT * FROM department WHERE id=5);
SELECT id,username FROM employee WHERE EXISTS(SELECT * FROM department WHERE id=4);
SELECT id,username FROM employee WHERE NOT EXISTS(SELECT * FROM department WHERE id=41);
-- 查詢所有獲得獎學金的學員
SELECT id,username,score FROM student WHERE score>=ANY(SELECT level FROM scholarship);
SELECT id,username,score FROM student WHERE score>=SOME(SELECT level FROM scholarship);
-- 查詢所有學員中獲得一等獎學金的學員
SELECT id,username,score FROM student WHERE score >=ALL(SELECT level FROM scholarship);
-- 查詢學員表中沒有獲得獎學金的學員
SELECT id,username,score FROM student WHERE score<ALL(SELECT level FROM scholarship);
SELECT id,username,score FROM student WHERE score<ANY(SELECT level FROM scholarship);
SELECT id,username,score FROM student WHERE score<=ANY(SELECT level FROM scholarship);
-- 相當于IN
SELECT id,username,score FROM student WHERE score=ANY(SELECT level FROM scholarship);
SELECT id,username,score FROM student WHERE score IN(SELECT level FROM scholarship);
-- 相當于NOT IN
SELECT id,username,score FROM student WHERE score NOT IN(SELECT level FROM scholarship);
SELECT id,username,score FROM student WHERE score <> ALL(SELECT level FROM scholarship);
CREATE TABLE test1 (
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
num TINYINT UNSIGNED
);
INSERT test1(id,num)
SELECT id,score FROM student;
CREATE TABLE test2 (
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
num TINYINT UNSIGNED
)SELECT id,score FROM student;
CREATE TABLE test3 (
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
score TINYINT UNSIGNED
)SELECT id,score FROM student;
-- ^匹配字符開始的部分
-- 查詢用戶名以t開始的用戶
SELECT * FROM cms_user WHERE username REGEXP '^t';
-- $匹配字串結尾的部分
SELECT * FROM cms_user WHERE username REGEXP 'g$';
-- .代表任意字符
SELECT * FROM cms_user WHERE username REGEXP '.';
SELECT * FROM cms_user WHERE username REGEXP 'r..g';
SELECT * FROM cms_user WHERE username LIKE 'r__g';
-- [字符集合] [lto]
SELECT * FROM cms_user WHERE username REGEXP '[lto]';
-- [^字符集合] 除了字符集合中的內容
SELECT * FROM cms_user WHERE username REGEXP '[^lto]';
SELECT * FROM cms_user WHERE username REGEXP '[^l]';
INSERT cms_user(username,password,regTime,proId)
VALUES('lll','lll',138212349,2),
('ttt','lll',138212349,2),
('ooo','lll',138212349,2);
SELECT * FROM cms_user WHERE username REGEXP '[a-k]';
SELECT * FROM cms_user WHERE username REGEXP '[^a-m]';
SELECT * FROM cms_user WHERE username REGEXP 'ng|qu';
SELECT * FROM cms_user WHERE username REGEXP 'ng|qu|te';
SELECT * FROM cms_user WHERE username REGEXP 'que*';
SELECT * FROM cms_user WHERE username REGEXP 't+';
SELECT * FROM cms_user WHERE username REGEXP 'que+';
SELECT * FROM cms_user WHERE username REGEXP 'que{2}';
SELECT * FROM cms_user WHERE username REGEXP 'que{3}';
SELECT * FROM cms_user WHERE username REGEXP 'que{1,3}';
SELECT CONCAT('_',TRIM(' ABC '),'_'),CONCAT('_',LTRIM(' ABC '),'_'),CONCAT('_',RTRIM(' ABC '),'_');
SELECT id,username,score, CASE WHEN score>60 THEN '不錯' WHEN score=60 THEN '剛及格' ELSE '沒及格' END FROM student;
INSERT student(username,score) VALUES('AAAA',12);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/295015.html
標籤:其他
下一篇:ELK太重?試試KFC日志采集
