MYSQL初级学习笔记四:查询数据的操作DQL(SELECT基本形式)(26-35)

知识点六:查询数据的操作DQL(SELECT基本形式)(26-35)

 1 CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8;
 2 USE cms;
 3 -- 管理员表cms_admin
 4 CREATE TABLE cms_admin(
 5 id TINYINT UNSIGNED AUTO_INCREMENT KEY,
 6 username VARCHAR(20) NOT NULL UNIQUE,
 7 password CHAR(32) NOT NULL,
 8 email VARCHAR(50) NOT NULL DEFAULT '[email protected]',
 9 role ENUM('普通管理员','超级管理员') DEFAULT '普通管理员'
10 );
11 INSERT cms_admin(username,password,email,role) VALUES('admin','admin','[email protected]',2);
12 
13 INSERT cms_admin(username,password) VALUES('king','king'),
14 
15 ('麦子','maizi'),
16 
17 ('queen','queen'),
18 
19 ('test','test');
20 
21 -- 创建分类表cms_cate
22 CREATE TABLE cms_cate(
23 id TINYINT UNSIGNED AUTO_INCREMENT KEY,
24 cateName VARCHAR(50) NOT NULL UNIQUE,
25 cateDesc VARCHAR(200) NOT NULL DEFAULT ''
26 );
27 
28 INSERT cms_cate(cateName,cateDesc) VALUES('国内新闻','聚焦当今最热的国内新闻'),
29 ('国际新闻','聚焦当今最热的国际新闻'),
30 ('体育新闻','聚焦当今最热的体育新闻'),
31 ('军事新闻','聚焦当今最热的军事新闻'),
32 ('教育新闻','聚焦当今最热的教育新闻');
33 
34 -- 创建新闻表cms_news
35 CREATE TABLE cms_news(
36 id INT UNSIGNED AUTO_INCREMENT KEY,
37 title VARCHAR(50) NOT NULL UNIQUE,
38 content TEXT,
39 clickNum INT UNSIGNED DEFAULT 0,
40 pubTime INT UNSIGNED,
41 cId TINYINT UNSIGNED NOT NULL COMMENT '新闻所属分类,对应分类表中的id',
42 aId TINYINT UNSIGNED NOT NULL COMMENT '哪个管理员发布的,对应管理员表中的id'
43 );
44 INSERT cms_news(title,content,pubTime,cId,aId) VALUES('亚航客机失联搜救尚无线索 未发求救信号','马来西亚亚洲航空公司一架搭载155名乘客的客机28日早晨从印度尼西亚飞往新加坡途中与空中交通控制塔台失去联系,下落不明。',1419818808,1,2),
45 ('北京新开通四条地铁线路 迎接首位客人','12月28日凌晨,随着北京地铁6号线二期、7号线、15号线西段、14号线东段的开通试运营,北京的轨道交通运营里程将再添62公里,共计达到527公里。当日凌晨5时许,北京地铁7号线瓷器口换乘站迎来新线开通的第一位乘客。',1419818108,2,1),
46 ('考研政治题多次出现习大大讲话内容','新京报讯 (记者许路阳 (微博))APEC反腐宣言、国家公祭日、依法治国……昨日,全国硕士研究生招生考试进行首日初试,其中,思想政治理论考题多次提及时事热点,并且多次出现习大大在不同场合的讲话内容。',1419818208,3,2),
47 ('深度-曾雪麟:佩兰别重蹈卡马乔覆辙','12月25日是前国足主帅曾雪麟的85岁大寿,恰逢圣诞节,患有尿毒症老爷子带着圣诞帽度过了自己的生日。此前,腾讯记者曾专访曾雪麟,尽管已经退休多年,但老爷子仍旧关心着中国足球,为国足揪心,对于国足近几位的教练,他只欣赏高洪波。对即将征战亚洲杯的国足,老爷子希望佩兰不要重蹈卡马乔的覆辙',1419818308,2,4),
48 ('国产JAD-1手枪枪架投入使用 手枪可变"冲锋枪"','日前,JAD-1型多功能手枪枪架通过公安部特种警用装备质量监督检验中心检验,正式投入生产使用。此款多功能枪架由京安盾(北京)警用装备有限公司开发研制,期间经广东省江门市公安特警支队试用,获得好评。',1419818408,4,4),
49 ('麦子学院荣获新浪教育大奖','麦子学院最大的职业IT教育平台,获奖了',1419818508,1,5),
50 ('麦子学院荣获腾讯教育大奖','麦子学院最大的职业IT教育平台,获奖了',1419818608,1,5),
51 ('麦子学院新课上线','麦子学院PHP课程马上上线了,小伙伴快来报名学习哈',1419818708,1,5);
52 
53 -- 创建省份表 provinces
54 CREATE TABLE provinces(
55 id TINYINT UNSIGNED AUTO_INCREMENT KEY,
56 proName VARCHAR(10) NOT NULL UNIQUE
57 );
58 INSERT provinces(proName) VALUES('北京'),
59 ('上海'),
60 ('深圳'),
61 ('广州'),
62 ('重庆');
63 
64 -- 创建用户表cms_user
65 CREATE TABLE cms_user(
66 id INT UNSIGNED AUTO_INCREMENT KEY,
67 username VARCHAR(20) NOT NULL UNIQUE,
68 password CHAR(32) NOT NULL,
69 email VARCHAR(50) NOT NULL DEFAULT '[email protected]',
70 regTime INT UNSIGNED NOT NULL,
71 face VARCHAR(100) NOT NULL DEFAULT 'user.jpg',
72 proId TINYINT UNSIGNED NOT NULL COMMENT '用户所属省份'
73 );
74 
75 INSERT cms_user(username,password,regTime,proId)
76 
77 VALUES('张三','zhangsan',1419811708,1),
78 ('张三丰','zhangsanfeng',1419812708,2),
79 ('章子怡','zhangsan',1419813708,3),
80 ('long','long',1419814708,4),
81 ('ring','ring',1419815708,2),
82 ('queen','queen',1419861708,3),
83 ('king','king',1419817708,5),
84 ('blek','blek',1419818708,1),
85 ('rose','rose',1419821708,2),
86 ('lily','lily',1419831708,2),
87 ('john','john',1419841708,2);
默认数据

查询记录:

  SELECT select_expr[*,select_expr… ,关键字]

  [  

    FROM table_references(数据表)

    [WHERE 条件]

    GROP BY {col_name|position} [ASC|DESC],…分组]

    [HIVING 条件 对分组进行二次筛选]

    [ORDER BY {col_name | position} [ASC | DESC],…排序]

    [LIMIT 限制显示条数]

  ]

 1 -- 查询
 2 SELECT * FROM cms_admin;
 3 SELECT cms_admin.* FROM cms_admin;
 4 
 5 -- 查询管理员编号和名称
 6 SELECT id,username FROM cms_admin;
 7 SELECT username,id,role FROM cms_admin;
 8 
 9 -- 表来自于哪个数据库下db_name.tbl_name
10 SELECT id,username,role FROM cms.cms_admin;
11 
12 -- 字段来自于哪张表
13 SELECT cms_admin.id,cms_admin.username FROM cms.cms_admin;
查询测试

查询表达式:

  每一个表达式表示想要的一列,必须至少有一列,多个列之间以逗号隔开

    *表示所有列,tbl_name.*可以表示命名表的所有列

    查询查询表达式可以使用[AS]alias_name为其赋予别名

 1 -- 给表名起别名
 2 SELECT id,username FROM cms_admin AS a;
 3 SELECT id,username FROM cms_admin a;
 4 SELECT a.id,a.username,a.email,a.role FROM cms_admin AS a;
 5 
 6 -- 给字段起别名
 7 SELECT id AS '编号',username AS '用户名',email AS '邮箱',role '角色' FROM cms_admin;
 8 SELECT a.id AS i,a.username AS u,a.email as e,a.role AS r FROM cms_admin AS a; 
 9 SELECT id AS proId,proId AS id,username FROM cms_user;
10 SELECT 1,2,3,4,5,id,username FROM cms_user;
查询表达式测试

WHERE条件:

 

查询条件

符号

比较

=,<,<=,>,>=,!=,<>,!>,!<,<=>

指定范围

BETWEEN AND,NOT BETWEEN AND

指定集合

IN,NOT IN

匹配字符

LIKE,NOT LIKE

是否为控制

IS NULL,IS NOT NULL

多个查询条件

AND,OR

 

 1 -- WHERE条件
 2 -- 查询编号为1的用户
 3 SELECT id,username,email FROM cms_user WHERE id=1;
 4 
 5 SELECT id,username,email FROM cms_user WHERE username='king';
 6 
 7 -- 查询编号不为1的用户
 8 SELECT  * FROM cms_user WHERE id!=1;
 9 
10 SELECT  * FROM cms_user WHERE id<>1;
11 
12 -- 添加age字段
13 ALTER TABLE cms_user ADD age TINYINT UNSIGNED DEFAULT 18;
14 
15 INSERT cms_user(username,password,regTime,proId,age)
16 VALUES('test1','test1',1419811708,1,NULL);
17 
18 -- 查询表中记录age值为NULL
19 SELECT * FROM cms_user WHERE age=NULL; --查不出来("="查不出值为NULL的列
20 
21 SELECT * FROM cms_user WHERE age<=>NULL;--可以查出
22 
23 --查询age不等于18的用户
24 SELECT * FROM cms_user WHERE age<=>18;
25 
26 -- IS NULL 或者IS NOT NULL
27 SELECT * FROM cms_user WHERE age IS NULL;
28 
29 
30 --指定范围查询
31 -- 查询编号在3~10之间的用户
32 SELECT * FROM cms_user WHERE id BETWEEN 3 AND 10;
33 
34 
35 --指定集合查询
36 -- 查询编号为1,3,5,7,9,11,13,100
37 SELECT * FROM cms_user WHERE id IN(1,3,5,7,9,11,13,100,1000);
38 
39 -- 查询proId为1 和3的用户
40 SELECT * FROM cms_user WHERE proId IN(1,3);
41 
42 -- 查询用户名为king,queen,张三,章子怡的记录
43 SELECT * FROM cms_user WHERE username IN('king','queen','张三','章子怡');
44 
45 SELECT * FROM cms_user WHERE username IN('KinG','QUEEN','张三','章子怡');
46 
47 
48 --匹配字符查询
49 -- 模糊查询
50 -- %:代表0个一个或者多个任意字符
51 -- _:代表1个任意字符
52 
53 -- 查询姓张的用户
54 SELECT * FROM cms_user WHERE username LIKE '张%';
55 
56 -- 查询用户名中包含in的用户
57 SELECT * FROM cms_user WHERE username LIKE '%in%';
58 
59 --查询所有用户
60 SELECT * FROM cms_user WHERE username LIKE '%';
61 
62 -- 查询用户名为3位的用户
63 SELECT * FROM cms_user WHERE username LIKE '___';
64 
65 --用户名_i%
66 SELECT * FROM cms_user WHERE username LIKE '_I%';
67 
68 SELECT * FROM cms_user WHERE username LIKE 'king';
69 
70 SELECT * FROM cms_user WHERE username NOT LIKE '_I%';
71 
72 
73 --逻辑查询
74 -- 查询用户名为king并且密码为king的用户
75 SELECT * FROM cms_user WHERE username='king' AND password='king';
76 
77 -- 查询编号大于等于3的变量年龄不为NULL的用户
78 SELECT * FROM cms_user WHERE id>=3 AND age IS NOT NULL;
79 
80 -- 查询编号大于等于3的变量年龄不为NULL的用户 并且proId为的3
81 SELECT * FROM cms_user WHERE id>=3 AND age IS NOT NULL AND proId=3;
82 
83 -- 查询编号在5~10的用户并且用户名为4位的用户
84 SELECT * FROM cms_user WHERE id BETWEEN 5 AND 10 AND username LIKE '____';
85 
86 -- 查询用户名以张开始或者用户所在身份为2,4的记录
87 SELECT * FROM cms_user WHERE username LIKE '张%' OR proId IN(2,4);
WHERE条件查询测试

GROUP BY查询结果分组:

 1 -- 按照用户所属身份分组proId
 2 SELECT * FROM cms_user GROUP BY proId;
 3 
 4 -- 向用户表中添加性别字段
 5 ALTER TABLE cms_user ADD sex ENUM('','','保密');
 6 
 7 --更新数据
 8 UPDATE cms_user SET sex='' WHERE id IN(1,3,5,7,9);
 9 UPDATE cms_user SET sex='' WHERE id IN(2,4,6,8,10);
10 UPDATE cms_user SET sex='保密' WHERE id IN(12,11);
11 
12 
13 --按照用户性别分组
14 SELECT * FROM cms_user GROUP BY sex;
15 
16 --按照字段位置分组(从1开始)
17 SELECT * FROM cms_user GROUP BY 7;
18 
19 --按照多个字段分组
20 SELECT * FROM cms_user GROUP BY sex,proId;
21 
22 -- 查询编号大于等于5的用户按照sex分组
23 SELECT * FROM cms_user WHERE id>=5 GROUP BY sex;
分组查询测试

  配合GROUP_CONCAT()得到分组详细信息

  配合聚合函数:

    COUNT():统计记录的总数

    MAX():统计某个字段的最大值

    MIN():统计某个字段的最小值

    AVG():统计某个字段的平均值

    SUM():统计某个字段的和

 1 -- 查询id,sex,用户名详情按照性别分组
 2 SELECT id,sex,GROUP_CONCAT(username) FROM cms_user GROUP BY sex;
 3 
 4 --查询proId,性别详情,注册时间详情,用户名详情 安装proId
 5 SELECT proId,GROUP_CONCAT(username),GROUP_CONCAT(sex),GROUP_CONCAT(regTime)
 6 FROM cms_user GROUP BY proId;
 7 
 8 --立起来显示
 9 SELECT proId,GROUP_CONCAT(username),GROUP_CONCAT(sex),GROUP_CONCAT(regTime)
10 FROM cms_user GROUP BY proId\G;
11 
12 UPDATE cms_user SET age=11 WHERE id=1;
13 UPDATE cms_user SET age=21 WHERE id=2;
14 UPDATE cms_user SET age=33 WHERE id=3;
15 UPDATE cms_user SET age=44 WHERE id=4;
16 UPDATE cms_user SET age=25 WHERE id=5;
17 UPDATE cms_user SET age=77 WHERE id=6;
18 UPDATE cms_user SET age=56 WHERE id=7;
19 UPDATE cms_user SET age=88 WHERE id=8;
20 UPDATE cms_user SET age=12 WHERE id=9;
21 UPDATE cms_user SET age=32 WHERE id=10;
22 UPDATE cms_user SET age=65 WHERE id=11;
23 
24 --查询编号,sex,用户名详情以及组中总人数按照sex分组
25 SELECT id,sex,GROUP_CONCAT(username)AS users,COUNT(*) AS totalUsers FROM cms_user GROUP BY sex;
26 
27 -- 统计表中所有记录
28 SELECT COUNT(*) AS totalUsers FROM cms_user;
29 --SELECT COUNT(*) AS totalUsers FROM cms_user GROUP BY sex;
30 
31 SELECT COUNT(id) AS totalUsers FROM cms_user;
32 
33 --COUNT(字段)不统计NULL值
34 SELECT COUNT(age) AS totalUsers FROM cms_user;
35 
36 
37 --总结
38 --查询编号,性别,用户名详情,组中总人数,组中最大年龄,最小年龄,
39 -- 平均年龄,以及年龄总和按照性别分组
40 SELECT id,sex,GROUP_CONCAT(username),
41 COUNT(*) AS totalUsers,
42 MAX(age) AS max_age,
43 MIN(age) AS min_age,
44 AVG(age) AS avg_age,
45 SUM(age) AS sum_age
46 FROM cms_user
47 GROUP BY sex;
分组查询配合聚合函数测试

  配合WITH ROLLUP记录上面所有记录的总和

 1 -- WITH ROLLUP
 2 SELECT id,sex,
 3 COUNT(*) AS totalUsers,
 4 MAX(age) AS max_age,
 5 MIN(age) AS min_age
 6 FROM cms_user
 7 GROUP BY sex WITH ROLLUP;
 8 
 9 
10 SELECT id,sex,
11 COUNT(*) AS totalUsers,
12 MAX(age) AS max_age,
13 MIN(age) AS min_age,
14 SUM(age) AS sum_age
15 FROM cms_user
16 GROUP BY sex WITH ROLLUP;
WITH ROLLUP测试

HAVING子句:

  通过HAVING子句对分组结果进行二次筛选

    (必须与ORDER BY结合使用,否则不起作用)

 1 --查询性别sex,用户名详情,组中总人数,最大年龄,年龄总和,根据性别分组
 2 SELECT sex,GROUP_CONCAT(username) AS users,
 3 COUNT(*) AS totalUsers,
 4 MAX(age) AS max_age,
 5 SUM(age) AS sum_age
 6 FROM cms_user 
 7 GROUP BY sex;
 8 
 9 -- 查询组中人数大于2的
10 SELECT sex,GROUP_CONCAT(username) AS users,
11 COUNT(*) AS totalUsers,
12 MAX(age) AS max_age,
13 SUM(age) AS sum_age
14 FROM cms_user 
15 GROUP BY sex
16 HAVING COUNT(*)>2;
17 
18 -- 查询组中人数大于2并且最大年龄大于60的
19 SELECT sex,GROUP_CONCAT(username) AS users,
20 COUNT(*) AS totalUsers,
21 MAX(age) AS max_age,
22 SUM(age) AS sum_age
23 FROM cms_user 
24 GROUP BY sex
25 HAVING COUNT(*)>2 AND MAX(age)>60;
26 
27 -- 查询编号大于等于2的用户
28 SELECT sex,GROUP_CONCAT(username) AS users,
29 COUNT(*) AS totalUsers,
30 MAX(age) AS max_age,
31 SUM(age) AS sum_age
32 FROM cms_user 
33 WHERE id>=2
34 GROUP BY sex
35 HAVING COUNT(*)>2 AND MAX(age)>60;
36 
37 --having必须与GROUP BY结合使用,要不然不会起作用
38 SELECT id,sex,GROUP_CONCAT(username) AS users,
39 COUNT(*) AS totalUsers,
40 MAX(age) AS max_age,
41 SUM(age) AS sum_age
42 FROM cms_user 
43 WHERE id>=2
44 HAVING COUNT(*)>2 AND MAX(age)>60;
having语句对分组结果进行二次筛选测试

ORDER BY排序:

  通过ORDER BY对查询结果排序

    (按照id降序排列DESC 默认的是ASC)

 1 -- 按照id降序排列DESC 默认的是ASC
 2 SELECT * FROM cms_user ORDER BY id ;
 3 
 4 SELECT * FROM cms_user ORDER BY id ASC;
 5 
 6 SELECT * FROM cms_user ORDER BY id DESC;
 7 
 8 -- 按照年龄升序排列
 9 SELECT * FROM cms_user ORDER BY age ASC;
10 
11 SELECT * FROM cms_user ORDER BY 1 DESC;
12 
13 
14 -- 按照年龄升序,id降序排列
15 
16 UPDATE cms_user SET age=12 WHERE id=5;
17 
18 SELECT * FROM cms_user ORDER BY age ASC,id DESC;
19 
20 
21 SELECT id,age,sex,GROUP_CONCAT(username),COUNT(*) AS totalUsers,SUM(age) AS sum_age 
22 FROM cms_user 
23 WHERE id>=2 
24 GROUP BY sex
25 HAVING COUNT(*)>=2
26 ORDER BY age DESC,id ASC;
27 
28 -- 实现记录随机
29 SELECT * FROM cms_user ORDER BY RAND();
ORDER BY对查询结果进行排序测试

LIMIT限制查询结果显示条数:

  LIMIT显示条数

  LIMIT 偏移量,显示条数

 1 -- 查询表中前3条记录
 2 SELECT * FROM cms_user LIMIT 3;
 3 
 4 SELECT * FROM cms_user ORDER BY id DESC LIMIT 5;
 5 
 6 -- 查询表中前一条记录
 7 SELECT * FROM cms_user LIMIT 1;
 8 
 9 SELECT * FROM cms_user LIMIT 0,1;
10 
11 SELECT * FROM cms_user LIMIT 1,1;
12 
13 SELECT * FROM cms_user LIMIT 0,5;
14 SELECT * FROM cms_user LIMIT 5,5;
15 SELECT * FROM cms_user LIMIT 10,5;
通过LIMIT限制显示条数测试

总结:

 1 --总结
 2 --查询cms_user表中id大于1的id,sex,age,用户详情,组中总人数,最大年龄,最小年龄,平均年龄,
 3 --各组年龄总和,根据性别分组
 4 --并且查询组中总人数大于2的组,按降序排列,没页显示2条
 5 SELECT id,sex,age,GROUP_CONCAT(username),
 6 COUNT(*) AS totalUsers,
 7 MAX(age) AS max_age,
 8 MIN(age) AS min_age,
 9 AVG(age) AS avg_age,
10 SUM(age) AS sum_age
11 FROM cms_user
12 WHERE id>=1
13 GROUP BY sex
14 HAVING COUNT(*)>=2
15 ORDER BY age DESC
16 LIMIT 0,2;

猜你喜欢

转载自www.cnblogs.com/darwinli/p/8996213.html