MySQL中查询数据操作(DQL)

一、查询记录
SELECT select_expr [,select_expr…][FROM table_references [WHERE条件][GROUP BY {col_name | position} [ASC | DESC],…分组] [HAVING 条件 对分组结果进行二次筛选] [ORDER BY {col_name | position} [ASC | DESC],…排序] [LIMIT 限制显示条数]
二、查询表达式
1、每一个表达式表示想要的一列,必须至少有一列,多个列之间以逗号分隔
例如:
SELECT id,username FROM cms_admin
SELECT id,username FROM cms.cms_admin表示来自数据库cms中的数据表cms_admin
2、*表示多有列,tbl_name.可以表示命名表的所有列
例如:
SELECT * FROM cms_admin
SELECT cms_admin
FROM cms_admin
3、查询表达式可以使用[AS] alias_name为其赋予别名
例如:
给表名起别名 SELECT id,username FROM cms_admin AS a
给字段起别名 SELECT id AS ‘编号’,username AS ‘用户名’ FROM cms_admin
三、WHERE条件
在这里插入图片描述
注意:
<>表示不等于的意思
<=>也是等于的意思,但是比=多了一个等于NULL值的功能

1、指定范围查询
SELECT * FROM cms_user WHERE id BETWEEN 3 AND 10
2、指定集合查询
SELECT * FROM cms_user WHERE id IN(1,3,5,7,9)
3、模糊查询
%:代表0个1个或多个任意字符
:代表1个任意字符
SELECT * FROM cms_user WHERE username LIKE ‘%张%’
SELECT * FROM cms_user WHERE username LIKE '
__'查询用户名为3位的用为用3个_下划线来表示
四、GROUP BY查询结果分组
(一)配合GROUP_CONCAT()得到分组详情
1、SELECT * FROM cms_user GROUP BY age 表示按照年龄来分类,并且只显示每个分组的第一条记录
2、SELECT * FROM cms_user GROUP BY 7 表示按照第七个字段来分组
3、SELECT * FROM cms_user GROUP BY age,sex表示按照年龄、性别来分类
4、SELECT * FROM cms_user WHERE id>=5 GROUP BY age表示查询编号大于等于5得用户并按照年龄来分组
5、SELECT id,sex,GROUP_CONCAT(username) FROM cms_user GROUP BY sex表示查询编号、性别、用户名并按照性别来分类,列出用户名
在这里插入图片描述
(二)配合聚合函数
1、COUNT()注意这个函数不统计NULL值
(1)SELECT id,sex,GROUP_BY(username) AS users,COUNT() AS totalUsers FROM cms_user GROUP BY sex查询编号、性别,用户名详情以及组中总人数按照性别分类
在这里插入图片描述
(2)统计表中所有记录
SELECT COUNT(
) AS totalUsers FROM cms_user
(3) MAX()、MIN()、AVG()、SUM()
SELECT id,sex,GROUP_BY(username),COUNT() AS totalUsers,MAX(age) AS max_age,MIN(age) AS min_age,AVG(age) AS avg_age,SUM(age) AS sum_age
FROM cms_user GROUP BY sex
(三)配合WITH ROLLUP记录上面所有记录的总和
SELECT id,sex,COUNT(
) AS totalUsers,MAX(age) AS max_age,MIN(age) AS min_age FROM cms_user GROUP BY sex WITH ROLLUP得到统计人数的总和、每个组中的最大年龄和最小年龄
在这里插入图片描述
五、HAVING子句(只能用于分组后,即需要配合GROUP BY来使用)
通过HAVING子句对分组结果进行二次筛选
SELECT sex,GROUP_CONCAT(username) AS users,COUNT() AS totalUsers,MAX(age) AS max_age,MIN(age) AS,SUM(age) AS sum_age FROM cms_user GROUP BY sex HAVING COUNT()>2
在这里插入图片描述
六、ORDER BY排序(DESC降序,默认升序ASC)
通过ORDER BY对查询结果排序
SELECT * FROM cms_user ORDER BY id 表示升序
SELECT * FROM cms_user ORDER BY id DESC
SELECT * FROM cms_user ORDER BY age ASC,id DESC
SELECT * FROM cms_user ORDER BY RAND()实现记录随机
七、LIMIT限制查询结果显示条数
(一)LIMIT显示条数
查询表中前3条记录
SELECT * FROM cms_user LIMIT 3
SELECT * FROM cms_user ORDER BY id DESC LIMIT 5
在这里插入图片描述
(二)LIMIT偏移量,显示条数(偏移量从0开始)注意:更新和删除操作的时候不能用这种方法,只能用第一种
SELECT * FROM cms_user LIMIT 0,1表示第一条记录
SELECT * FROM cms_user LIMIT 1,1表示第二条记录
SELECT * FROM cms_user LIMIT 0,5表示前五条记录
删除用户性别为男的用户,按照年龄降序排列,删除前一条记录
DELETE FROM cms_user WHERE sex=‘男’ ORDER BY age DESC LIMIT 1
八、连接查询
(一)定义
连接查询是将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据。连接查询是同时查询两个或两个以上的表时使用的。当不同的表中存在相同意义的字段时,可以通过该字段连接这几个表。
(二)分类
1、内连接查询(用的比较多)
(1)JOIN | CROSS JOIN | INNER JOIN
(2)通过ON连接条件
(3)显示两个表中符合条件的记录
例如:
两个表的连接:
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 cms_user AS u
CROSS JOIN provinces AS p
ON u.proId=p.id
或者:
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u JOIN provinces AS p ON u.proId=p.id
三个表的连接:
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
2、外连接查询
(1)左外连接
LEFT [OUTER] JOIN显示左表的全部记录及右表符合连接条件的记录(以左表为主表,在LEFT JOIN前面的为主表)
例如:
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
(2)右外连接
RIGHT [OUTER] JOIN显示右表的全部记录及左表符合连接条件记录(以右表为主表,在RIGHT JOIN后面的为主表)
九、联合查询
(一)UNION
SELECT username FROM employee UNION SELECT username FROM cms_user
(二)UNION ALL
SELECT username FROM employee UNION ALL SELECT username FROM cms_user
(三)UNION和UNION ALL的区别
UNION是去掉相同记录,UNION ALL是简单的合并到一起
十、外键
(一)定义
1、外键是表的一个特殊字段。被参照的表是主表,外键所在字段的表为子表。
2、设置外键的原则是依赖于数据库中已经存在的主键。
3、外键的作用是建立该表与其父表的关联关系。父表中对记录做操作时,子表中与之对应的信息也应有相应的改变。
4、外键的作用是保持数据的一致性和完整性
5、可以实现一对一或一对多的关系
例如:
1、创建一个主表部门表,然后再创建一个子表员工表并建立外键,使得部门删除的时候主表会受到外键约束的限制,必须要将相对应部门的员工删除了,才能删除主表中的部门
–创建部门表
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
) ENGINE=INNODB;
INSERT department(depName) VALUES(‘教学部’),(‘市场部’),(‘运营部’),(‘督导部’);
–创建员工表
CREATE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
FOREING KEY(depId) REFERENCES department(id)
) ENGINE=INNODB;
INSERT employee(username,depId) VALUES (‘king’,1), (‘queen’,2),
(‘张三’,3),
(‘李四’,4),
(‘王五’,1);
2、创建一个主表部门表,然后再创建一个子表员工表并建立外键以及命名外键的名称,使得部门删除的时候主表会受到外键约束的限制,必须要将相对应部门的员工删除了,才能删除主表中的部门
–创建部门表
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
) ENGINE=INNODB;
INSERT department(depName) VALUES(‘教学部’),(‘市场部’),(‘运营部’),(‘督导部’);
–创建员工表
CREATE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT em_fk_dep FOREING KEY(depId) REFERENCES department(id)
) ENGINE=INNODB;
INSERT employee(username,depId) VALUES (‘king’,1), (‘queen’,2),
(‘张三’,3),
(‘李四’,4),
(‘王五’,1);
2、外键的删除
ALTER TABLE employee DROP FOREING KEY em_fk_dep
3、添加外键
ALTER TABLE employee ADD CONSTRAINT em_fk_dep FOREING KEY(depId) REFERENCES department(id)
(二)注意
1、父表和子表必须使用相同的存储引擎,而且禁止使用临时表
2、数据表的存储引擎只能为InnoDB
3、外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度则可以不同
4、外键列和参照列必须创建索引。如果外键不存在索引,MySQL将自动创建索引,删除外键的时候索引不会被删除。
(三)外键约束的参照操作
1、CASCATE:从父表删除或更新且自动删或更新子表中匹配的行
–创建部门表
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
depName VARCHAR(20) NOT NULL UNIQUE
) ENGINE=INNODB;
INSERT department(depName) VALUES(‘教学部’),(‘市场部’),(‘运营部’),(‘督导部’);
–创建员工表
CREATE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT em_fk_dep FOREING KEY(depId) REFERENCES department(id) ON DELETE CASCADE UPDATE CASCADE
) ENGINE=INNODB;
INSERT employee(username,depId) VALUES (‘king’,1), (‘queen’,2),
(‘张三’,3),
(‘李四’,4),
(‘王五’,1);
2、SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
3、RESTRICT:拒绝对父表的删除或更新操作。
4、NO ACTION:标准SQL的关键字,在MySQL与RESTRICT相同
十一、子查询
(一)定义
子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果作为外层查询语句提供条件(先执行内层语句,再执行外层语句)
(二)引发子查询的情况
1、使用[NOT]IN的子查询
SELECT id,username FROM employee WHERE depId IN (SELECT id FROM department)
2、使用比较运算符的子查询=、>、<、>=、<=、<>、!=、<=>
3、使用[NOT]EXISTS的子查询([EXISTS查询的结果为真时才会执行外层语句,为假的时候不会执行,;而NOT EXISTS查询的结果为假时才会执行外层语句,为真的时候不会执行)
例如:
SELECT id,username FROM employee WHERE EXISTS(SELECT * FROM department WHERE id=4)
4、使用[ANY]SOME的子查询(注意:ANY和SOME其实是等价的)
在这里插入图片描述
例如:
SELECT id,username,score FROM student WHERE score>=ANY(SELECT level FROM scholarship)表示获得分数大于ANY后面括号查询出来的最小值。
(三)将查询结果写入到数据表
INSERT [INTO] tbl_name [(col_name,…)]
SELECT…
例如:
INSERT test1(id,num)
SELECT id,score FROM student
(四)创建数据表同时将查询结果写入到数据表
CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,…)]
select_statement
CREATE TABLE test1(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
num TINYINT UNSIGNED
)SELECT id,score FROM student

发布了79 篇原创文章 · 获赞 1 · 访问量 1487

猜你喜欢

转载自blog.csdn.net/DAN_L/article/details/104631361
今日推荐