SQL的单表查询

SQL的单表查询

SQL概述

SQL:StructureQueryLanguage。(结构化查询语言)

  • DDL(DataDefinitionLanguage)
    数据定义语言,用来定义数据库对象:库、表、列等;CREATE、ALTER、DROPDML。
  • DML(DataManipulationLanguage)
    数据操作语言,用来定义数据库记录(数据);INSERT、UPDATE、DELETEDCL。
  • DCL(DataControlLanguage)
    数据控制语言,用来定义访问权限和安全级别。
  • DQL(DataQueryLanguage)
    数据查询语言,用来查询记录(数据)。

Ps:SELECT*注意:sql语句以;结尾

DDL:操作数据库、表、列等

使用的关键字:CREATE、ALTER、DROP

创建

create database mydb1;
Create database mydb2 character set gbk;
Create database mydb3 character set gbk COLLATE gbk_chinese_ci;

  • 查询查看当前数据库服务器中的所有数据库
    show databases;
  • 查看前面创建的 mydb2 数据库的定义信息
    Show create database mydb2;
  • 删除前面创建的 mydb3 数据库
    Drop database mydb3;
  • 修改查看服务器中的数据库,并把 mydb2 的字符集修改为 utf8;
    alter database mydb2 character set utf8;
  • 删除
    drop database mydb3;
  • 其他:
    查看当前使用的数据库 select database();
    切换数据库 use mydb2;

操作语法

  • 语法:
    create table 表名(
    字段 1 字段类型, 字段 2 字段类型,

    字段 n 字段类型
    );
  • 常用数据类型:
    int:整型
    double:浮点型,例如 double(5,2)表示最多 5 位,其中必须有 2 位小数,即最大值为 999.99;
    char:固定长度字符串类型; char(10) ‘abc ’
    varchar:可变长度字符串类型;
    varchar(10) ‘abc’ text:字符串类型;
    blob:字节类型;
    date:日期类型,格式为:yyyy-MM-dd;
    time:时间类型,格式为:hh:mm:ss
    timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值
    datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
  • 当前数据库中的所有表
    SHOW TABLES;
  • 查看表的字段信息
    DESC employee;
  • 在上面员工表的基本上增加一个 image 列。
    ALTER TABLE employee ADD image blob;
  • 修改 job 列,使其长度为 60。
    ALTER TABLE employee MODIFY job varchar(60);
  • 删除 image 列,一次只能删一列。
    ALTER TABLE employee DROP image;
  • 表名改为 user。
    RENAME TABLE employee TO user;
  • 查看表格的创建细节
    SHOW CREATE TABLE user;
  • 修改表的字符集为 gbk
    ALTER TABLE user CHARACTER SET gbk;
  • 列名 name 修改为 username
    ALTER TABLE user CHANGE name username varchar(100);
  • 删除表
    DROP TABLE user ;

DML 操作(重要)

查询表中的所有数据
SELECT * FROM 表名;
DML 是对表中的数据进行增、删、改的操作。不要与 DDL 混淆了。
INSERT 、UPDATE、 DELETE
Ps:在 mysql 中,字符串类型和日期类型都要用单引号括起来。‘tom’ ‘2015-09-04’ 空值:null

操作语法

1. 插入操作:INSERT:

  • 语法: INSERT INTO 表名(列名 1,列名 2 …)VALUES(列值 1,列值 2…);
    注意:列名与列值的类型、个数、顺序要一一对应。
    可以把列名当做 java 中的形参,把列值当做实参。
    值不要超出列定义的长度。
    如果插入空值,请使用 null 插入的日期和字符一样,都使用引号括起来。
  • 案例:
    create table emp( id int, name varchar(100), gender varchar(10), birthday date, salary float(10,2), entry_date date, resume text);

    INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
    VALUES(1,‘zhangsan’,‘female’,‘1990-5-10’,10000,‘2015-5-5-’,‘good girl’);

    INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume) VALUES(2,‘lisi’,‘male’,‘1995-5-10’,10000,‘2015-5-5’,‘good boy’);

    INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume) VALUES(3,‘wangwu’,‘male’,‘1995-5-10’,10000,‘2015-5-5’,‘good boy’);

  • 批量插入:
    INSERT INTO emp VALUES
    (4,‘zs’,‘m’,‘2015-09-01’,10000,‘2015-09-01’,NULL),
    (5,‘li’,‘m’,‘2015-09-01’,10000,‘2015-09-01’,NULL), (6,‘ww’,‘m’,‘2015-09-01’,10000,‘2015-09-01’,NULL);

    2. 修改操作 UPDATE:
  • 语法:UPDATE 表名 SET 列名 1=列值 1,列名 2=列值 2 。。。 WHERE 列名= 值
  • 练习:
    将所有员工薪水修改为 5000 元。
    UPDATE emp SET salary=5000

    将姓名为’zs’的员工薪水修改为 3000 元。
    UPDATE emp SET salary=3000 WHERE name=’ zhangsan’;

    将姓名为’aaa’的员工薪水修改为 4000 元,job 改为 ccc。
    UPDATE emp SET salary=4000,gender=‘female’ WHERE name=‘lisi’;

    将 wu 的薪水在原有基础上增加 1000 元。
    UPDATE emp SET salary=salary+1000 WHERE gender=‘male’;

    3. 删除操作 DELETE:

  • 语法: DELETE FROM 表名【WHERE 列名=值】
  • 练习:
    删除表中名称为’zs’的记录。
    DELETE FROM emp WHERE name=‘zs’;

    删除表中所有记录。
    DELETE FROM emp;

    使用 truncate 删除表中记录。
    TRUNCATE TABLE emp;

    Ps:DELETE 删除表中的数据,表结构还在;删除后的数据可以找回,TRUNCATE 删除是把表直接 DROP 掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比 DELETE 快。

DQL 操作

  • 介绍:DQL 数据查询语言(重要)数据库执行 DQL 语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。
  • 查询关键字:SELECT 语法:
    SELECT 列名 FROM 表名【WHERE –> GROUP BY –>HAVING–> ORDER BY】
  • 语法:
    要查询的列名称
    SELECT selection_list

    要查询的表名称
    FROM table_list

    行条件
    WHERE condition

    对结果分组
    GROUP BY grouping_columns

    分组后的行条件
    HAVING condition

    对结果排序
    ORDER BY sorting_columns

    结果限定
    LIMIT offset_start, row_count

案例分析

表一:学生表 stu

字段名称 字段类型 说明
sid char(6) 学生学号
sname varchar(50) 学生姓名
age int 学生年龄
gender varchar(50) 学生性别

建表:

CREATE TABLE stu ( sid	CHAR(6),
sname VARCHAR(50), age INT,
	gender	VARCHAR(50)
);

插入数据

INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
 INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

表二:雇员表 emp

字段名称 字段类型 说明
empno int 员工编号
ename varchar(50) 员工姓名
job varchar(50) 员工姓名
mgr int 员工工作
mgr int 领导编号
hiredate date 入职日期
sal decimal(7,2) 月薪
comm decimal(7,2) 奖金
deptno int 部门编号

建表:

CREATE TABLE emp(
empno INT, ename VARCHAR(50), job VARCHAR(50), mgr INT,
	hiredate	DATE,
sal DECIMAL(7,2), comm decimal(7,2), deptno INT
) ;

插入数据

INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

表三:部门表 dept

字段名称 字段类型 说明
deptno int 学生学号
sname varchar(50) 部门编码
dname varchar(50) 部门名称
loc varchar(50) 部门所在地点

建表:

CREATE TABLE dept(
	deptno	INT,
dname varchar(14), loc varchar(13)
);

插入数据

INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
  • 1 基础查询

    • 1.1 查询所有列
      SELECT * FROM stu;
    • 1.2 查询指定列
      SELECT sid, sname, age FROM stu;
      2 条件查询
    • 2.1 条件查询介绍条件查询就是在查询时给出 WHERE 子句,在 WHERE 子句中可以使用如下运算符及关键字:
      =、!=、<>、<、<=、>、>=;
      BETWEEN…AND;IN(set);IS NULL; IS NOT NULL;AND;OR;NOT;
    • 2.2 查询性别为女,并且年龄 50 的记录
      SELECT * FROM stu
      WHERE gender=‘female’ AND ge<50;
    • 2.3 查询学号为 S_1001,或者姓名为 liSi 的记录
      SELECT * FROM stu
      WHERE sid =‘S_1001’ OR sname=‘liSi’;
    • 2.4 查询学号为 S_1001,S_1002,S_1003 的记录
      SELECT * FROM stu
      WHERE sid IN (‘S_1001’,‘S_1002’,‘S_1003’);
    • 2.5 查询学号不是 S_1001,S_1002,S_1003 的记录
      SELECT* FROM tab_student
      WHERE s_number NOT IN (‘S_1001’,‘S_1002’,‘S_1003’);
    • 2.6 查询年龄为 null 的记录
      SELECT * FROM stu
      WHERE age IS NULL;
    • 2.7 查询年龄在 20 到 40 之间的学生记录
      SELECT *
      FROM stu
      WHERE age>=20 AND age<=40;

      或者
      SELECT *
      FROM stu
      WHERE age BETWEEN 20 AND 40;
    • 2.8 查询性别非男的学生记录
      SELECT
      FROM stu
      WHERE gender!=‘male’;

      或者
      SELECT *
      FROM stu
      WHERE gender<>‘male’;

      或者
      SELECT *
      FROM stu
      WHERE NOT gender=‘male’;
    • 2.9 查询姓名不为 null 的学生记录
      SELECT *
      FROM stu
      WHERE sname IS NOT NULL;

      或者
      SELECT *
      FROM stu
      WHERE NOT sname IS NULL;
  • 3 模糊查询
    当想查询姓名中包含 a 字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字
    LIKE。
    通配符:
    _ 任意一个字符
    %:任意 0~n 个字符
    ‘%张%’ ‘张_’

    • 3.1 查询姓名由 5 个字母构成的学生记录
      SELECT *
      FROM stu
      WHERE sname LIKE ‘_____’;

      模糊查询必须使用 LIKE 关键字。其中“”匹配任意一个字母,5 个“”表示 5 个任意字母。
    • 3.2 查询姓名由 5 个字母构成,并且第 5 个字母为“i”的学生记录
      SELECT *
      FROM stu
      WHERE sname LIKE ‘____i’;
    • 3.3 查询姓名以“z”开头的学生记录
      SELECT *
      FROM stu
      WHERE sname LIKE ‘z%’;

      其中“%”匹配 0~n 个任何字母。
    • 3.4 查询姓名中第 2 个字母为“i”的学生记录
      SELECT *
      FROM stu
      WHERE sname LIKE ‘_i%’;
    • 3.5 查询姓名中包含“a”字母的学生记录
      SELECT
      FROM stu
      WHERE sname LIKE ‘%a%’;
  • 4 字段控制查询

    • 4.1 去除重复记录去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如 emp 表中 sal 字段就存在相同的记录。当只查询 emp 表的 sal 字段时,那么会出现重复记录,那么想去除重复记录,需要使用
      DISTINCT:
      SELECT DISTINCT sal FROM emp;
      4.2 查看雇员的月薪与佣金之和因为 sal 和 comm 两列的类型都是数值类型,所以可以做加运算。如果 sal 或 comm 中有一个字段不是数值类型,那么会出错。
      SELECT * sal+comm FROM emp;
      comm 列有很多记录的值为 NULL,因为任何东西与 NULL 相加结果还是 NULL,所以
      结算结果可能会出现 NULL。

      下面使用了把 NULL 转换成数值 0 的函数 IFNULL:
      SELECT * sal+IFNULL(comm,0) FROM emp;
    • 4.3 给列名添加别名在上面查询中出现列名为 sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出
      一个别名,为 total:
      SELECT * sal+IFNULL(comm,0) AS total FROM emp;
      给列起别名时,是可以省略 AS 关键字的:
      SELECT * sal+IFNULL(comm,0) total FROM emp;
  • 5 排序 orderby 列名 asc(默认)desc

    • 5.1 查询所有学生记录,按年龄升序排序
      SELECT *
      FROM stu
      ORDER BY sage ASC;

      或者
      SELECT *
      FROM stu
      ORDER BY sage;
    • 5.2 查询所有学生记录,按年龄降序排序
      SELECT *
      FROM stu
      ORDER BY age DESC;
    • 5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
      SELECT * FROM emp ORDER BY sal DESC,empno ASC;
  • 6 聚合函数 sumavgmaxmin count
    聚合函数是用来做纵向运算的函数:
    COUNT():统计指定列不为 NULL 的记录行数;
    MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
    MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
    SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为 0;
    AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为 0;

    • 6.1 COUNT
      当需要纵向统计时可以使用 COUNT()。
      查询 emp 表中记录数:
      SELECT COUNT(* ) AS cnt FROM emp;
      查询 emp 表中有佣金的人数:
      SELECT COUNT(comm) cnt FROM emp;
      注意,因为 count()函数中给出的是 comm 列,那么只统计 comm 列非 NULL 的行数。
      查询 emp 表中月薪大于 2500 的人数:
      SELECT COUNT() FROM emp WHERE sal > 2500;*
      统计月薪与佣金之和大于 2500 元的人数:
      SELECT COUNT() AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;*
      查询有佣金的人数,有领导的人数:
      SELECT COUNT(comm), COUNT(mgr) FROM emp;
    • 6.2 SUM 和 AVG
      当需要纵向求和时使用 sum()函数。 查询所有雇员月薪和:
      SELECT SUM(sal) FROM emp;
      查询所有雇员月薪和,以及所有雇员佣金和:
      SELECT SUM(sal), SUM(comm) FROM emp;
      查询所有雇员月薪+佣金和:
      SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
      统计所有员工平均工资:
      SELECT AVG(sal) FROM emp;
    • 6.3 MAX 和 MIN
      查询最高工资和最低工资:
      SELECT MAX(sal), MIN(sal) FROM emp;
  • 7 分组查询
    当需要分组查询时需要使用 GROUP BY 子句,例如查询每个部门的工资和,这说明要
    使用部门来分组。
    在这里插入图片描述
    注:凡和聚合函数同时出现的列名,一定要写在 group by 之后

  • -7.1 分组查询
    查询每个部门的部门编号和每个部门的工资和:
    SELECT deptno, SUM(sal)
    FROM emp
    GROUP BY deptno;

    查询每个部门的部门编号以及每个部门的人数:
    SELECT deptno,COUNT()
    FROM emp
    GROUP BY deptno;*
    查询每个部门的部门编号以及每个部门工资大于 1500 的人数:
    SELECT deptno,COUNT()
    FROM emp
    WHERE sal>1500
    GROUP BY deptno;*

    • 7.2 HAVING 子句
      查询工资总和大于 9000 的部门编号以及工资和:
      SELECT deptno, SUM(sal)
      FROM emp
      GROUP BY deptno
      HAVING SUM(sal) > 9000;

      注:having 与 where 的区别:
      • 1.having 是在分组后对数据进行过滤.
        where 是在分组前对数据进行过滤
      • 2.having 后面可以使用聚合函数(统计函数) where 后面不可以使用聚合函数。
        WHERE 是对分组前记录的条件,如果某行记录没有满足 WHERE 子句的条件,那么这行记录不会参加分组;而 HAVING 是对分组后数据的约束。
  • 8 LIMIT 方言
    LIMIT 用来限定查询结果的起始行,以及总行数。

    • 8.1 查询 5 行记录,起始行从 0 开始
      SELECT * FROM emp LIMIT 0, 5;
      注意,起始行从 0 开始,即第一行开始!
    • 8.2 查询 10 行记录,起始行从 3 开始
      SELECT * FROM emp LIMIT 3, 10;
    • 8.3 分页查询
      如果一页记录为 10 条,希望查看第 3 页记录应该怎么查呢?
      第一页记录起始行为 0,一共查询 10 行;
      第二页记录起始行为 10,一共查询 10 行;
      第三页记录起始行为 20,一共查询 10 行;
    • 8.3 查询代码的书写顺序和执行顺序
      查询语句书写顺序:select – from- where- group by- having- order by-limit
      查询语句执行顺序:from – where -group by – having – select – order by-limit
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106724.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何使用robots.txt及其详解

    如何使用robots.txt及其详解在国内,网站管理者似乎对robots.txt并没有引起多大重视,应一些朋友之请求,今天想通过这篇文章来简单谈一下robots.txt的写作。robots.txt基本介绍robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的内容。当一个搜索机器人(有的叫搜索蜘蛛)访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,…

    2022年6月11日
    31
  • eclipse离线安装svn插件使用教程_eclipse导入svn项目

    eclipse离线安装svn插件使用教程_eclipse导入svn项目最近要在eclipse上安装一个svn插件,本来以为是很简单的一件事,没想到尝试了很多方法,还是各种不成功以下是网上常见的解决方案:第一种(失败):help->EclipseMarketplace在线安装结果:下载不下来,换一个版本的插件安装成功,但连接仓库会提示0x00400006第二种(失败):help->InstallNewSoftware手动在线安装:给的地址是类似这样的:http://subclipse.tigris.org/update_1.8…

    2022年10月14日
    0
  • 决策树分析例题经典案例_决策树例题分析及解答

    决策树分析例题经典案例_决策树例题分析及解答决策树例题分析及解答 1 例 某农业企业有耕地面积 33 333 公顷 可供灌水量 6300 立方米 在生产忙季可供工作日 2800 个 用于种植玉米 棉花和花生三种作物 预计三种作物每公顷在用水忙季用工日数 灌水量和利润见表 在完成 16 5 万公斤玉米生产任务的前提下 如何安排三种作物的种植面积 以获得最大的利润 2 解 玉米 棉花 花生和种植面积分别为 X1 X2 X3 公顷 依题意列出线性规划模型 目标

    2025年7月2日
    1
  • NSTimer用法

    NSTimer用法

    2021年8月26日
    50
  • 波特尔暗空分类法_光辉战机和歼10c对比

    波特尔暗空分类法_光辉战机和歼10c对比传说中的暗之连锁被人们称为 Dark。Dark 是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它。经过研究,你发现 Dark 呈现无向图的结构,图中有 N 个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark 有 N–1 条主要边,并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark 还有 M 条附加边。你的任务是把 Dark 斩为不连通的两部分。一开始 Dark 的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark

    2022年8月10日
    10
  • 是学Java好呢?还是学C++更有前途?

    是学Java好呢?还是学C++更有前途?最近有不少初学编程的朋友问:他们比较倾向于Java和C++作为他们首选学习语言,但是学Java好呢?还是学C++更有前途?到底哪一门语言更有“钱途”呢?这个问题问的好,很多初学者都会有类似的疑问,今天我就来给大家简单的解答一下。1、C++和Java在编程排行榜中的排名作为IT行业的软件研发人员,在我看来,这两种语言都可以学,都很有前途。其实Java和C++一直名列世界编程语言排行榜的前几位,始终是热门的开发语言,下图是最近的世界编程语言排行榜:不管是从世界…

    2022年7月17日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号