• 深入学习之mysql(三)单表操作


    1、创建表的结构和数据
    CREATE TABLE `t_student`(
    `id` INT PRIMARY KEY,
    `stuName` VARCHAR(10) NOT NULL,
    `age` INT NOT NULL,
    `sex` VARCHAR (4),
    `gradeName` VARCHAR(10) NOT NULL
    );
    插入数据:
    INSERT INTO `t_student`
    (`id`,`stuName`,`age`,`sex`,`gradeName`)
    VALUES
    ('1','张三','23','男','一年级')
    ('2','麻子','25','男','二年级'),
    ('3','李四','22','男','一年级'),
    ('4','王五','23','男','三年级'),
    ('5','小龙女','21','女','一年级'),
    ('6','周芷若','26','女','二年级'),
    ('7','汪峰','20','男','三年级'),
    ('8','黄欧阳锋','21','男','二年级'),
    ('9','杨过','22','男','二年级'),
    ('10','令狐冲','19','男','三年级'),
    ('11','东方不败','25','男','一年级'),
    ('12','无崖子','30',NULL,'一年级'),
    ('13','连城诀','28',NULL,'一年级');
    2.单表查询
    查询所有字段
    SELECT 字段1,字段2,字段3.......FROM 表名;
    SELECT id,stuName,age,sex,gradeName FROM t_student;
    SELECT * FROM t_student;
    两者区别在于前者可以通过查询字段的顺序来调整显示结果的顺序,后者是按照表结构的顺序显示。
    where条件查询
    SELECT 字段1,字段2,字段3......FROM 表名;
    SELECT age,sex,gradeName FROM t_student WHERE 条件表达式;
    查询编号为1的学生:
    SELECT * FROM t_student WHERE id=1;
    mysql> SELECT * FROM t_student WHERE id=1;
    +----+---------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+---------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    +----+---------+-----+------+-----------+
    1 row in set (0.00 sec)
    查询年龄大于22岁的学生:
    SELECT * FROM t_student WHERE age >22;
    mysql> SELECT * FROM t_student WHERE age >22;
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 2 | 麻子 | 25 | 男 | 二年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 6 | 周芷若 | 26 | 女 | 二年级 |
    | 10 | 令狐冲 | 23 | 男 | 三年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    | 12 | 无崖子 | 23 | NULL | 一年级 |
    | 13 | 连城诀 | 23 | NULL | 一年级 |
    +----+--------------+-----+------+-----------+
    8 rows in set (0.00 sec)
    查询性别为男的学生:
    SELECT * FROM t_student WHERE sex='男';
    mysql> SELECT * FROM t_student WHERE sex='男';
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 2 | 麻子 | 25 | 男 | 二年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 7 | 汪峰 | 20 | 男 | 三年级 |
    | 8 | 黄欧阳锋 | 21 | 男 | 二年级 |
    | 9 | 杨过 | 22 | 男 | 二年级 |
    | 10 | 令狐冲 | 23 | 男 | 三年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    +----+--------------+-----+------+-----------+
    9 rows in set (0.00 sec)
    带IN关键字的查询
    查询年龄为22或者23岁的学生:
    SELECT * FROM t_student WHERE age IN (22,23);
    mysql> SELECT * FROM t_student WHERE age IN (22,23);
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 9 | 杨过 | 22 | 男 | 二年级 |
    | 10 | 令狐冲 | 23 | 男 | 三年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    | 12 | 无崖子 | 23 | NULL | 一年级 |
    | 13 | 连城诀 | 23 | NULL | 一年级 |
    +----+--------------+-----+------+-----------+
    8 rows in set (0.00 sec)
    查询学号不是1和9 的学生记录:
    SELECT * FROM t_student WHERE ID NOT IN (1,9);
    mysql> SELECT * FROM t_student WHERE ID NOT IN (1,9);
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 2 | 麻子 | 25 | 男 | 二年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 5 | 小龙女 | 21 | 女 | 一年级 |
    | 6 | 周芷若 | 26 | 女 | 二年级 |
    | 7 | 汪峰 | 20 | 男 | 三年级 |
    | 8 | 黄欧阳锋 | 21 | 男 | 二年级 |
    | 10 | 令狐冲 | 23 | 男 | 三年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    | 12 | 无崖子 | 23 | NULL | 一年级 |
    | 13 | 连城诀 | 23 | NULL | 一年级 |
    带BETWEEN的范围查询
    SELECT 字段1,字段2,字段3....FROM 表名 WHERE 条件表达式 [NOT] BETWEEN 数值1,AND数值2;
    SELECT * FROM t_student WHERE age NOT BETWEEN 22 AND 25;
    mysql> SELECT * FROM t_student WHERE age NOT BETWEEN 22 AND 25;
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 5 | 小龙女 | 21 | 女 | 一年级 |
    | 6 | 周芷若 | 26 | 女 | 二年级 |
    | 7 | 汪峰 | 20 | 男 | 三年级 |
    | 8 | 黄欧阳锋 | 21 | 男 | 二年级 |
    +----+--------------+-----+------+-----------+
    4 rows in set (0.00 sec)
    查询学号为1-9的学生记录:
    SELECT * FROM t_student WHERE id BETWEEN 1 AND 9;
    mysql> SELECT * FROM t_student WHERE id BETWEEN 1 AND 9;
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 2 | 麻子 | 25 | 男 | 二年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 5 | 小龙女 | 21 | 女 | 一年级 |
    | 6 | 周芷若 | 26 | 女 | 二年级 |
    | 7 | 汪峰 | 20 | 男 | 三年级 |
    | 8 | 黄欧阳锋 | 21 | 男 | 二年级 |
    | 9 | 杨过 | 22 | 男 | 二年级 |
    +----+--------------+-----+------+-----------+
    9 rows in set (0.00 sec)
    查询年龄小于22但是大于25 的学生信息:
    SELECT * FROM t_student WHERE age NOT BETWEEN 22 AND 25;
    mysql> SELECT * FROM t_student WHERE age NOT BETWEEN 22 AND 25;
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 5 | 小龙女 | 21 | 女 | 一年级 |
    | 6 | 周芷若 | 26 | 女 | 二年级 |
    | 7 | 汪峰 | 20 | 男 | 三年级 |
    | 8 | 黄欧阳锋 | 21 | 男 | 二年级 |
    +----+--------------+-----+------+-----------+
    4 rows in set (0.00 sec)
    带LIKE的模糊查询:
    SELECT 字段1,字段2,字段3 FROM 表名 WHERE 条件表达式 [NOT] LIKE '字符串';
    查询姓名中包含张的学生信息:
    SELECT * FROM t_student WHERE stuName LIKE '%张%';
    mysql> SELECT * FROM t_student WHERE stuName LIKE '张%';
    +----+-----------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+-----------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 2 | 张三丰 | 25 | 男 | 二年级 |
    +----+-----------+-----+------+-----------+
    2 rows in set (0.00 sec)
     
    查询姓名中第一个字为张的学生信息:
    SELECT * FROM t_student WHERE stuName LIKE '张%';
    mysql> SELECT * FROM t_student WHERE stuName LIKE '张%';
    +----+-----------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+-----------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 2 | 张三丰 | 25 | 男 | 二年级 |
    +----+-----------+-----+------+-----------+
    2 rows in set (0.00 sec)
    查询姓为张,名为一个字的学生信息:
    SELECT * FROM t_student WHERE stuNAME LIKE '张_';
    mysql> SELECT * FROM t_student WHERE stuNAME LIKE '张_';
    +----+---------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+---------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    +----+---------+-----+------+-----------+
    1 row in set (0.00 sec)
    空值查询:
    SELECT 字段1,字段2,字段3 FROM 表名 WHERE 条件表达式 IS [NOT] NULL;
    SELECT * FROM t_student WHERE sex IS NULL;
    mysql> SELECT * FROM t_student WHERE sex IS NULL;
    +----+-----------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+-----------+-----+------+-----------+
    | 12 | 无崖子 | 23 | NULL | 一年级 |
    | 13 | 连城诀 | 23 | NULL | 一年级 |
    +----+-----------+-----+------+-----------+
    2 rows in set (0.00 sec)
     
    查询性别不为NULL 的学生信息:
    SELECT * FROM t_student WHERE sex IS NOT NULL;
    mysql> SELECT * FROM t_student WHERE sex IS NOT NULL;
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 2 | 张三丰 | 25 | 男 | 二年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 5 | 小龙女 | 21 | 女 | 一年级 |
    | 6 | 周芷若 | 26 | 女 | 二年级 |
    | 7 | 汪峰 | 20 | 男 | 三年级 |
    | 8 | 黄欧阳锋 | 21 | 男 | 二年级 |
    | 9 | 杨过 | 22 | 男 | 二年级 |
    | 10 | 令狐冲 | 23 | 男 | 三年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    +----+--------------+-----+------+-----------+
    11 rows in set (0.00 sec)
    注意:在插入数据库的时候如果是NULL的话就直接插入NULL,这个值不等于空,也不等于'NULL';
    带AND的多条件查询:
    SELECT 字段1,字段2,字段3 FROM 表名 WHERE 表达式1 AND 表达式2 [...AND表达式N];
    SELECT * FROM t_student WHERE gradeName='一年级' AND sex='男';
    mysql> SELECT * FROM t_student WHERE gradeName='一年级' AND sex='男';
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    +----+--------------+-----+------+-----------+
    3 rows in set (0.01 sec)
    带OR的多条件查询:
    SELECT 字段1,字段2,字段3 FROM 表名 WHERE 表达式1 OR 表达式2 [...OR表达式N];
    SELECT * FROM t_student WHERE gradeName='一年级' OR age=23;
    mysql> SELECT * FROM t_student WHERE gradeName='一年级' OR age=23;
    +----+--------------+-----+------+-----------+
    | id | stuName | age | sex | gradeName |
    +----+--------------+-----+------+-----------+
    | 1 | 张三 | 23 | 男 | 一年级 |
    | 3 | 李四 | 22 | 男 | 一年级 |
    | 4 | 王五 | 23 | 男 | 三年级 |
    | 5 | 小龙女 | 21 | 女 | 一年级 |
    | 10 | 令狐冲 | 23 | 男 | 三年级 |
    | 11 | 东方不败 | 23 | 男 | 一年级 |
    | 12 | 无崖子 | 23 | NULL | 一年级 |
    | 13 | 连城诀 | 23 | NULL | 一年级 |
    +----+--------------+-----+------+-----------+
    8 rows in set (0.00 sec)
    去重复查询:
    SELECT DISTINCT gradeName FROM t_student;
    mysql> SELECT DISTINCT gradeName FROM t_student;
    +-----------+
    | gradeName |
    +-----------+
    | 一年级 |
    | 二年级 |
    | 三年级 |
    +-----------+
    3 rows in set (0.01 sec)
    对查询结果进行排序:
    SELECT 字段1,字段2,字段3.... FROM 表名 GROUP BY 字段名;[HAVING 条件表达式][WITH ROLLUP];
    1、GROUP BY单独使用时并无太大意义
    2、与GROUP_CONCAT()函数一起使用;
    3、与聚合函数一起使用;
    4、与HAVING一起使用(对查询结果进行排序)
    5、与WITH ROLLUP 一起使用(最后一行加入一个总和行)
    查询每个年级所有学生的姓名:
    SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName;
    mysql> SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName;
    +-----------+----------------------------------------------------------+
    | gradeName | GROUP_CONCAT(stuName) |
    +-----------+----------------------------------------------------------+
    | 一年级 | 张三,无崖子,东方不败,连城诀,小龙女,李四 |
    | 三年级 | 王五,令狐冲,汪峰 |
    | 二年级 | 周芷若,黄欧阳锋,杨过,张三丰 |
    +-----------+----------------------------------------------------------+
    3 rows in set (0.00 sec)
    查询每一个年级的学生数量:
    SELECT COUNT(stuNAme) AS '学生总数',gradeName AS '年级' FROM t_student GROUP BY gradeName;
    mysql> SELECT COUNT(stuNAme) AS '学生总数',gradeName AS '年级' FROM t_student GROUP BY gradeName;
    +--------------+-----------+
    | 学生总数 | 年级 |
    +--------------+-----------+
    | 6 | 一年级 |
    | 3 | 三年级 |
    | 4 | 二年级 |
    +--------------+-----------+
    3 rows in set (0.00 sec)
    查询每个年级的学生,并且筛选出人数大于3的年级:
    SELECT COUNT (stuName) AS '学生总数',gradeName AS '年级' FROM t_student GROUP BY gradeName HAVING COUNT(stuName) >3;
    mysql> SELECT COUNT(stuName) AS '学生总数',gradeName AS '年级' FROM t_student GROUP BY gradeName HAVING COUNT(stuName) >3;
    +--------------+-----------+
    | 学生总数 | 年级 |
    +--------------+-----------+
    | 6 | 一年级 |
    | 4 | 二年级 |
    +--------------+-----------+
    2 rows in set (0.00 sec)
     
    查询每个年级的学生并在查询的结果添加一个总和行:
    SELECT COUNT(studName ) AS '学生人数',gradeName AS '年级' FROM t_student GROUP BY gradeNAME AS ’总数‘ WITH ROLLUP;
    mysql> SELECT COUNT(stuName) AS '学生人数',gradeName AS '年级' FROM t_student GROUP BY gradeName WITH ROLLUP;
    +--------------+-----------+
    | 学生人数 | 年级 |
    +--------------+-----------+
    | 6 | 一年级 |
    | 3 | 三年级 |
    | 4 | 二年级 |
    | 13 | NULL |
    +--------------+-----------+
    4 rows in set (0.00 sec)
    查询LIMIT分页:
    SELECT 字段1,字段2,字段3 FROM表名LIMIT 条件开始,条件结束;
    查询前5条学生的详细信息:
    SELECT stuName, age,sex gradeName From t_student LIMIT 0,5;
    mysql> SELECT stuName,age,sex,gradeName From t_student LIMIT 0,5;
    +-----------+-----+------+-----------+
    | stuName | age | sex | gradeName |
    +-----------+-----+------+-----------+
    | 张三 | 23 | 男 | 一年级 |
    | 张三丰 | 25 | 男 | 二年级 |
    | 李四 | 22 | 男 | 一年级 |
    | 王五 | 23 | 男 | 三年级 |
    | 小龙女 | 21 | 女 | 一年级 |
    +-----------+-----+------+-----------+
    5 rows in set (0.00 sec)
     
     
  • 相关阅读:
    okhttp进行网络传输文件
    bazel、tensorflow_serving、opencv编译问题
    Linux下设置和查看环境变量(转)
    std::move的实际工作过程
    虚拷贝
    移动构造函数和移动赋值
    while(cin>>word)时的结束方法
    转:windows下命令行工具
    eclipse大括号高亮显示---颜色很淡,改为显眼的颜色
    转: Eclipse 分屏显示同一个文件
  • 原文地址:https://www.cnblogs.com/itor/p/6929287.html
Copyright © 2020-2023  润新知