简介

  • 数据库的作用:数据存储

    数据库本质上就是个文件系统,而且存储的数据可以实现持久化存储
    • DBS:—>数据库系统:由数据库、数据库管理员、数据库管理系统构成

    • DBMS:—>数据库管理系统:是一种用于操纵和管理数据的软件,用于建立、使用、维护数据库。因此数据库的安全性、健壮性、可扩展性都得到了提升

    • DBA:—>数据库管理员:DBA使用DBMS来管理DB

    • DB:—>数据库:本质上是一个个的文件

    当前数据库分为两大类:关系型数据库和非关系型数据
    • 关系型数据库(relational database):存放数据的结构是表,首先要有数据库,再在数据库中创建表,然后在表中存放数据。关系型数据库内部,表与表之间是可以建立关联的。

      • 优点:数据结构鲜明、容易管理
      • 缺点:如果数据量过于庞大,那么在操作数据时,效率相对来说过于底下
      • 典型软件:oracle,DB2,sqlServer,mysql…
    • 非关系型数据库:(NoSql)结构简单,数据与数据之间没有关系。通常用做数据缓存(比如:redis缓存框架)

      • 优点:在架构层面做到了易扩展、数据库庞大时,性能也会很高
      • 典型软件:Redis、MongoDB
  • SQL

    SQL就是结构化的查询语言(structured query language)
    • 特点:

      是一种具有特殊目的的编程语言,是用来完成数据库查询和设计的语言,用于对数据进行更新和查询,创建数据库、创建表等…

      想要操作数据库,想要操作数据库,想要完成对数据库的任何改动,必须使用SQL,因为数据库能够识别的语言只有SQL

    • DDL(data definition language)数据定义语言

      针对数据库或者表结构的创建、修改、删除,通俗来说就是定义数据存储结构的sql语句,关键字:createalterdropshow

    • DML(data manipulation language)数据操作语言

      主要操作数据表中数据的增删改(添加,删除,修改),关键字:insertdeleteupdate

    • DQL(data query language)数据查询语言

      主要针对数据的查询操作,关键字select

    • DCL(data control language)数据控制语言:主要用来创建用户,设置权限,回收权限等,关键字:grant(授权),revoke(回收权限)

      1. 重要数据的操作,是会签订保密、安全协议的,这个是具有法律效应的
      2. 通常其他人没有删除的操作权限
      3. 数据库都是有备份的
    • TCL(transaction control language)数据事务语言:主要用来数据库操作的事务,关键字:commitrollback

    • CCL(cursor control language)指针控制语言:

    • SQL语句的书写规范:

      • sql语句不区分大小写,也就是对大小写不敏感。但是要注意,不区分大小写的是sql语句的关键字,但是自定义的内容严格区分大小写
      • sql语句关键字与内容之间使用空格隔开,目的在确保sql语句正确的前提下,提高代码的可读性
      • 每一条sql语句中

DDL

  • 数据库操作

    • 打开命令提示窗:
    win+r-->cmd
    
    • 登录数据库:
    mysql -uroot -p密码
    
    • 查看所有的数据库:
    show databases;
    
    • 创建数据库
    #创建数据库
    create database 数据库名称;
    #判断数据是否存在之后再创建
    create database if not exists 数据库名;
    #如果还要考虑数据库中的编码格式的话(编码用""引起来,例:"utf8")
    create database if not exists 数据库名 character set "编码格式"(gbk|utf8);
    
    • 使用和切换数据库
    use 数据库名称;
    
    • 修改数据库的编码格式
    alter database 数据库名称 character set "编码格式";
    
    • 查看当前数据库的创建信息
    show create database 数据库名称;
    
    • 删除数据库
    drop database 数据库名称;
    
  • 常用数据类型

    • 数字
      • 整数: tinyint,int
      • 浮点: float,double
    • 字符–>字符串–>值加引号(‘’)
      • 可变字符 varchar
      • 不可变字符 char
    • 日期
      • date:年月日
      • datetime:年月日时分秒 最大取值 9999年12月31日 23时59分59秒
      • timestamp:年月日时分秒 最大取值 2037年12月31日 23时59分59秒,当转换时区的时候,时间随着时区转换而转换
  • 表结构操作

    • 创建表格
    create table 表名(列名1 数据类型(长度),列名2 数据类型(长度)......);
    #当列的数据类型为整数和日期的时候,长度是可以省略的
    
    • 查看表结构
    desc 表名;
    
    • 修改表名
    alter table 旧表名 rename 新表名;
    
    • 查看创建表的相关信息
    show create table 表名;
    
    • 查看当前数据库所有的表
    show tables;
    
    • 在表格的末尾添加一个新的列
    alter table 表名 add 列名 数据类型(长度);
    
    • 在表的最前面添加一个新的列
    alter table 表名 add 列名 数据类型(长度) first;
    
    • 在表中指定列后面添加一个新的列
    alter table 表名 add 列名 数据类型(长度) after 指定的列名;
    
    • 修改表中列的数据类型
    alter table 表名 modify 列名 数据类型;
    
    • 修改表中列的名称
    alter table 表名 change 旧列名 新列名 数据类型(长度);
    
    • 修改表中列的类型和长度
    alter table 表名 modify 列名 新类型 新约束;
    
    • 删除列
    alter table 表名 drop 列名;
    
    • 删除表
    drop table 表名;
    

    案例:

    #创建一个表 stu,包含学号sno,姓名sname,年龄age,生日bir
    CREATE TABLE stu(sno INT,sname VARCHAR(100),age INT,bir DATE
    );
    #将stu表改名为stu1
    ALTER TABLE stu RENAME stu1;
    #向stu1中添加一个sex列
    ALTER TABLE stu1 ADD sex VARCHAR(10);
    #将sex列的类型改变为tinyint类型
    ALTER TABLE stu1 MODIFY sex TINYINT;
    #将sex列改变为gender
    ALTER TABLE stu1 CHANGE sex gender TINYINT;
    #将gender列删除掉
    ALTER TABLE stu1 DROP gender;
    

DML

数据库操作语言—>增删改

  • 添加insert

    • 添加一行数据

      注意事项:

      1. 如果只添加一条数据,使用values,如果想要一次性添加多条数据,使用value
      2. 字段的个数与类型要与值的个数与类型一致字段=列
      3. 如果想要为字段赋值为空:不写此字段或直接为此字段赋值为null
      4. 现在要为表中所有字段完成赋值:将字段挨个写出来或忽略字段的书写,直接写value,但在写值时要注意个数、顺序与类型要与表中字段完全一致
      5. 在一次性添加多行数据时,那么数据与数据之间用逗号分隔
    insert into 表名(列名1,列名2,...)values(值1,值2,...);
    
    • 添加多行数据
    insert into 表名(列名1,列名2,...)values(值11,值12,...),(值21,值22,...),...;
    
    • 单行注释
    #这是一个单行注释
    -- 这也是一个单行注释(注意:这里--后有空格)
    
    • 多行注释
    /*这是一个多行注释
    */
    

    案例

    #添加一行数据
    INSERT INTO demo01(sno,sname,age,sex,bir)VALUES('001','张三',23,'男','1998-6-16');
    #向demo01表中添加一行数据(sno,sname)
    INSERT INTO demo01(sno,sname)VALUES('002','李四');
    /*当向一行中所有的列添加数据的时候,可以简写成insert into 表名 values(值1,值2,...);值1,值2,...等一些值必须按照表的顺序进行添加,不可改变位置
    */
    INSERT INTO demo01 VALUES ('003',22,'王五','男','1999-3-18');
    #添加多行数据
    INSERT INTO demo01 VALUES ('004',23,'赵六','女','1998-5-22'),('005',23,'小明','男','1998-10-19'),('006',21,'小红','女','2000-1-18');
    
  • 修改update

    注意事项:

    1. 修改时没有条件,那么表中所有的记录修改字段的值都会成为一致状态
    2. 修改时有条件,先通过条件筛选出满足的记录,修改这些满足条件的记录中字段的值
    3. 一次性改变多个字段的值时,多个字段之间使用逗号分隔
    4. 修改后的值,
    update 表名 set 列名1=新值,列名2=新值,... where 条件(列名=值);
    

    案例:

    #将名字为小明的生日修改为1998-11-28
    UPDATE demo01 SET bir='1998-11-28' WHERE sname='小明';
    #将编号为002的年龄修改为18,生日修改为2003-3-23
    UPDATE demo01 SET age='18',bir='2003-3-23' WHERE sno='002';
    #将编号为004的学生姓名改为赵小六
    UPDATE demo01 SET sname='赵小六' WHERE sno='004';
    
  • 删除delete

    注意事项:

    1. 删除时没有条件,将表中所有记录删除

    2. 删除时携带条件,将满足条件的记录删除

    delete from 表名 where 条件(列名=值);
    
  • 截断truncate

    truncate table 表名;
    

    案例:

    #删除编号为005的学生信息
    DELETE FROM demo01 WHERE sno='005';
    #删除男同学信息
    DELETE FROM demo01 WHERE sex='男';
    #截断表(清空表)
    TRUNCATE TABLE demo01;
    #删除表(清空表)
    DELETE FROM demo01;
    

DQL

  • 查询select

    • 基本查询
    select 列名1,列名2,... from 表名;
    
    • 去重查询
    select distinct 列名 from 表名;
    
    • 设置别名

      别名的设置方法:as 别名 或者 省略as直接写别名

    #设置列的别名
    select 列名1 as 别名1, 列名2 别名2 from 表名;
    #设置表的别名
    select 别名.字段1 , 别名.字段2 from 表名 别名;
    
    • 查询整个表
    select * from 表名;
    
    • 条件查询
    select 列名 from 表名 where 条件(列名=值);
    
    • 条件中可以使用的关系符号:大于> 大于等于>= 小于< 小于等于<= 不等于!=或<> 等于=或<=>

      =<>只能判断查询该字段值不为null<=>!=可以判断查询该字段值为null;判断为空时可以使用is null;判断不为空时可以使用is not null或者not(字段名 <=> null)

    案例:

    #查询表中所有数据
    SELECT sno,sname,age,sex,bir FROM demo01;
    #查询sno和sname信息
    SELECT sno,sname FROM demo01;
    #给列名取别名(关键字as->但是往往省略不写)select 列名 as 别名 from 表名;
    #别名类似于绰号,不改变数据库的原名称
    SELECT sno AS 学生编号,sname AS 学生姓名 FROM demo01;
    SELECT age 年龄,bir 生日,sex 性别 FROM demo01;#查询学生编号为004的学生信息
    SELECT * FROM demo01 WHERE sno = '004';
    #查询学生年龄大于22的学生信息
    SELECT * FROM demo01 WHERE age > 22;
    #查询学生姓名张三之外的其他学生信息
    SELECT * FROM demo01 WHERE sname <> '张三';#相当于查询学生姓名不等于张三的学生信息
    SELECT * FROM demo01 WHERE sname != '张三';
    #查询学生姓名为null的学生信息
    SELECT * FROM demo01 WHERE sname <=> NULL;
    SELECT * FROM demo01 WHERE sname IS NULL;
    #查询学生姓名不为null的学生信息
    SELECT * FROM demo01 WHERE sname != NULL;
    SELECT * FROM demo01 WHERE sname IS NOT NULL;
    SELECT * FROM demo01 WHERE sname NOT(sname <=> NULL);
    
    • and|or|not|in|between…and…关键字的用法
      • and同时满足两个条件
      • or满足两个中的一个条件或两个都个满足
      • not不满足该条件
      • in在给定的数值中选择满足的值–>or的简化写法(同一个列取多个值的时候)
      • between A and B在[A,B]的范围区间内取值,AB的数据类型:数字|日期

    案例:

    #查询学生性别为男,并且年龄大于20的学生信息
    SELECT * FROM demo01 WHERE sex='男' AND age>20;
    #查新学生编号为002,005,008的学生信息
    SELECT * FROM demo01 WHERE sno='002' OR sno='005' OR sno='008';
    SELECT * FROM demo01 WHERE sno IN ('002','005','008');
    #查询年龄在21到22之间的学生信息
    #不用bewteen...and...
    SELECT * FROM demo01 WHERE age>=21 AND age<=22;
    #使用bewteen...and...
    SELECT * FROM demo01 WHERE age BETWEEN 21 AND 22;
    #查询生日为1998年5月份的学生信息
    SELECT * FROM demo01 WHERE bir BETWEEN '1998-05-01' AND '1998-05-31';
    
    • null | is null| is not null 关键字用法
      • null 为空:具体值
      • is null 为空:逻辑判断条件
      • is not null 不为空:逻辑判断条件

    案例:

    #将学生编号为002的学生年龄信息改为空null
    UPDATE demo01 SET age=NULL WHERE sno='002';
    #查询年龄为空的学生信息
    SELECT * FROM demo01 WHERE age IS NULL;
    #查询年龄不为空的学生信息
    SELECT * FROM demo01 WHERE age IS NOT NULL;
    
    • 列当中值的去重复:distinct或者distinct()–>分组在一定程度上也是有去重功能的

    案例:

    SELECT DISTINCT(age) FROM demo01;
    
  • 约束

    主要作用:规范表中列的值,让数据更加合理

    主键约束、非空约束、默认约束、唯一约束、外键约束

    • 主键约束primary key:

      • 作用:字段的值非空且唯一,主键的作用就是用来唯一标识一条记录的。主键这个字段与表中正常数据的字段是无关系的,主键是不具备含义的字段。主键的字段名通常都是以id结尾,而且主键的字段类型通常都是int类型
      • 意义:检索的时候速度快
      • 注意:一个表中只有一个主键,一个主键可以是多个列
      • 在创建表的时候添加约束即可,在列的后边直接添加primary key
      CREATE TABLE demo02(id INT PRIMARY KEY, NAME VARCHAR(100)
      );
      INSERT INTO demo02 VALUES (1,'张三');
      #insert into demo03 values (1,'李四');#会报错,主键不能重复
      
      • 一般情况下,当一个列作为一个主键列的时候,因为主键是非空且唯一的,那么我们自己手动维护,难免会出现重复值的情况,所以针对主键,提供了一种自增长的机制,可以帮助我们去维护主键的值
    • 自增auto_increment

      特点:

      1. 只有整型主键才可以用自增长修饰
      2. 只有主键字段才能使用自增长修饰
      3. 自增长的主键在赋值时,可以给null,会做值的自动累加
      4. 初始值为1,每次累加1
      5. 自增的值一旦出现,不能重复,而且累加默认从最大值往后累加
      CREATE TABLE demo03(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(100)
      );
      INSERT INTO demo03 (NAME) VALUE ('张三'); #运行多少次也不会报错
      #运行时id值每次在该列中找到最大值(所有该列中出现过的id中的最大值)加一
      
    • 非空约束not null

      字段的值不能为空,添加位置与主键约束的添加位置相同;可以创建表的时候添加,也可以创建之后再添加(null值不等于空字符串)

      CREATE TABLE demo04(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(100) NOT NULL
      );
      INSERT INTO demo04 (NAME) VALUE ('');#空字符串与字符为空是不同的两个概念,二者不相等
      #INSERT INTO demo04 (NAME) VALUE (null);#报错,违反非空约束
      

      如果触犯了非空约束:column '列名' cannot be null

    • 默认约束default

      如果想要选取默认值:

      1. 忽略此字段的赋值
      2. 为该字段赋值为default

      如果想要改变默认约束字段的值,那么就需要我们手动赋值

    CREATE TABLE demo05(id INT PRIMARY KEY AUTO_INCREMENT,#编号为主键NAME VARCHAR(100) NOT NULL,#姓名值不为空age INT DEFAULT 18#年龄默认18岁
    );
    INSERT INTO demo05 (NAME) VALUE ('珊珊');
    SELECT * FROM demo05;
    INSERT INTO demo05 (NAME,age) VALUES ('珊珊',20);
    SELECT * FROM demo05;
    INSERT INTO demo05 VALUES ('珊珊',default);
    SELECT * FROM demo05;
    
    • 唯一约束unique

      字段的值不能重复

    CREATE TABLE demo06(id INT PRIMARY KEY AUTO_INCREMENT,#主键NAME VARCHAR(100) NOT NULL,#值不为空age INT DEFAULT 18,#默认18岁tel VARCHAR(50) UNIQUE#电话号码唯一
    );
    INSERT INTO demo06 (NAME,tel) VALUES ('凉凉','');
    #INSERT INTO demo06 (NAME,tel) VALUES ('亮亮','');#报错,违反唯一约束
    INSERT INTO demo06 (NAME,tel) VALUES ('亮亮','13813331122');
    #INSERT INTO demo06 (NAME,tel) VALUES ('珊珊','13813331122');#报错,违反唯一约束
    SELECT * FROM demo06;
    

    ​ 如果触犯了唯一约束:duplicate entry '值' for key '列名'

  • 表关系

    一对一、一对多(多对一)、多对多

    • 一对一

      设计方式:两张表A、B,分别添加主键,选取任意一张表,设置外键关联另一张表的主键,而且作为外键的是当前这张表的主键!通俗来说:主键连主键

      特点:在一对一的关系下,两个表中主键值相同的记录就是对应关系

    CREATE TABLE hus(#创建丈夫表hid INT PRIMARY KEY,hname VARCHAR(100) NOT NULL
    );
    CREATE TABLE wife(#创建妻子表wid INT PRIMARY KEY,wname VARCHAR(100) NOT NULL,FOREIGN KEY(wid) REFERENCES hus(hid)#设置外键的一种方式#丈夫表的主键作为妻子表的主键,实现一对一关系
    );
    #一个表中的列作为主键的同时又是外键,如上表中的wife表
    INSERT INTO hus VALUES(1,'唐伯虎');
    INSERT INTO hus VALUES(2,'张无忌');
    INSERT INTO hus VALUES(3,'杨过');
    INSERT INTO hus VALUES(4,'景天');INSERT INTO wife VALUES(1,'秋香');
    INSERT INTO wife VALUES(2,'周芷若');
    INSERT INTO wife VALUES(3,'小龙女');
    INSERT INTO wife VALUES(5,'赵灵儿');#报错,因为主表中没有id为5的值,所以从表是不可以使用的,违反外键约束
    #如果两个表中有主从关系,那么删除的时候应该先删除从表数据,然后再删除主表数据
    
    • 一对多

      设计方式:一方的表称为主表,多方的表称为从表!在从表中设置一个外键,去关联主表的主键

    CREATE TABLE dept(#部门表dno INT PRIMARY KEY,dname VARCHAR(100) NOT NULL
    );
    CREATE TABLE emp(#员工表eno INT PRIMARY KEY,ename VARCHAR(100) NOT NULL,dno INT,FOREIGN KEY(dno) REFERENCES dept(dno)#设置外键的一种方式
    );
    
    • 多对多

      设计方式:两张表A、B,分别添加主键,此时创建一张中间表C,在C中设置两个外键,分别关联A、B表的主键。那么借助中间表C,就可以实现A、B的多对多关系

    CREATE TABLE stu(#学生表sid INT PRIMARY KEY,sname VARCHAR(100) NOT NULL
    );
    CREATE TABLE course(#课程表cid INT PRIMARY KEY,cname VARCHAR(100) NOT NULL
    );
    CREATE TABLE s_c(#中间表:选课表id INT PRIMARY KEY,sid INT,cid INT,FOREIGN KEY(sid) REFERENCES stu(sid),FOREIGN KEY(cid) REFERENCES course(cid)
    );
    #此时,学生表与课程表之间就是多对多关系
    #添加一些数据
    INSERT INTO stu VALUES(1,'zs');
    INSERT INTO stu VALUES(2,'ls');
    INSERT INTO stu VALUES(3,'ww');
    INSERT INTO stu VALUES(4,'zl');
    INSERT INTO course VALUES(1,'java');
    INSERT INTO course VALUES(2,'python');
    INSERT INTO s_c VALUES(1,1,1);
    INSERT INTO s_c VALUES(2,1,2);
    INSERT INTO s_c VALUES(3,2,1);
    INSERT INTO s_c VALUES(4,3,2);
    INSERT INTO s_c VALUES(5,4,1);
    INSERT INTO s_c VALUES(6,4,2);
    
  • 连接查询

    连接查询可以一次性差询多张表,同时得到多张表中的数据,当你要获取的结果集中的数据来自于不同的表时,就需要使用连接查询来获取

    在使用连接查询时,既然需要多表同时进行查询,那么就需要书写多表的连接条件,此时才能建立起查询的关联关系,所以连接条件是必须要写的;书写连接条件是为了正确获取具有对应的关系的多表数据,防止产生冗余错乱的数据

    • 内连接查询

      先通过连接查询得到数据,在通过where除连接条件之外的条件对结果集进行筛选

      • 隐式内连接
      select 列名 from 表1,表2 where 关联关系 [and 筛选条件];
      
      • 显式内连接join…on…
      select 列名 from 表1 inner join 表2 on 关联关系 [where 筛选条件];
      

      关联关系:其实就是让两个表实现关联的表达式;关联关系的一般写法:表1.列名 = 表2.列名-->列名:关联列(外键列)

      案例:

      #查询学生信息以及对应的学生班级信息(隐式内连接)
      SELECT * FROM stu s,course c,s_c sc WHERE s.sid=sc.sid AND c.cid=sc.cid;#取别名,方便使用,别名的范围只在当前语句中使用,并且取别名就一定要用别名,用原名直接报错
      SELECT id,s.sid,sname,c.cid,cname FROM stu s,course c,s_c sc WHERE s.sid=sc.sid AND c.cid=sc.cid AND cname='java';
      #查询学生信息以及对应的学生班级信息(显式内连接)
      SELECT * FROM stu s JOIN s_c sc ON s.sid=sc.sid WHERE cid=1;
      
      • 内连接总结:
        1. 内连接前后表书写的顺序不会影响结果集中的数据,先写哪个表都可以

        2. 以后推荐使用显示内连接

          ​ 1. inner join 单词的意思就是内连接,所以sql语义更强,可读性更强

          ​ 2. on后面书写连接条件、where后面书写筛选条件,条件的分类更加明确

          ​ 3. 显示出现的时间要晚于隐式,所以选用先进的、较新的语法

        3. 内连接只能获取到多表去除错误数据(连接条件的作用)后的公共数据,也就是取交集

    • 外连接查询

      AB两个有关联的表,以一个表A为基准实现查询(A表中的数据,必须全部显示出来),另外一个表B显示与A表对应的所有数据,如果B表没有对应数据,则以null补齐数据

      • 左外连接(左连接)left join…on…

        特点:以一个左表为基准实现查询(必须全部显示出来),右表显示与左表对应的所有数据,如果右表没有对应数据,则以null补齐数据

        select 列名 from 左表 left join 右表 on 关联条件[where 条件...];
        

        案例:

        #
        SELECT * FROM stu s LEFT JOIN s_c sc ON s.sid=sc.sid WHERE cid=1;
        
      • 右外连接(右连接)right join…on…

        特点:以一个右表为基准实现查询(必须全部显示出来),左表显示与右表对应的所有数据,如果左表没有对应数据,则以null补齐数据

        select 列名 from 左表 right join 右表 on 关联条件[where 条件...];
        

        案例:

        #
        SELECT * FROM stu s RIGHT JOIN s_c sc ON s.sid=sc.sid WHERE cid=1;
        
      • 外连接总结
        1. 外连接可以依附于某一张表进行查询,该表中的数据都可以获取,如果不满足连接条件,另一张表中的数据全部补null

        2. 外连接因为表的位置不一样,会影响sql语句的执行语义,会改变依附的查询表,所以前后的顺序不能发生改变,与内连接完全不一样

        3. 左外连接与右外连接其实本质上是一致的,把关键字left join 换成 right join,再将表的位置一调换,结果没有区别

  • 高级查询

    • 模糊查询 like

      _:任意的一个字符

      %:任意个字符

    案例:

    #查询学生姓名中包含李的学生信息
    SELECT * FROM demo01 WHERE sname LIKE '%李%';
    #查询学生姓名中第二个字是三的学生信息
    SELECT * FROM demo01 WHERE sname LIKE '_三';
    #查询学生姓名只有两个字的学生信息
    SELECT * FROM demo01 WHERE sname LIKE '__';
    
    • 排序查询:order by 列名 desc(倒序)|asc(正序)(默认值)

      注:如果存在多个排序条件,那么使用逗号分隔开;如果有其他逻辑判断,通常whereorder by的前面

    案例:

    #按照学生年龄升序查询
    SELECT * FROM demo01 ORDER BY age ASC;
    SELECT * FROM demo01 ORDER BY age;
    #按照学生年龄降序查询
    SELECT * FROM demo01 ORDER BY age DESC;
    #按照学生年龄降序查询,查找性别为男的学生信息
    SELECT * FROM demo01 WHERE sex='男' ORDER BY age DESC;
    
    • limit m,n :截取查询(分页查询)[仅在mysql中使用此关键字]

      m:表示开始行的下标(下标从零开始),当开始的下标为0时,该值可以省略

      n:表示截取的长度,即截取的行数

    案例:

    #查询前3个学生信息
    SELECT * FROM demo01 LIMIT 0,3;
    SELECT * FROM demo01 LIMIT 3;
    #查询第2到5行的学生信息
    SELECT * FROM demo01 LIMIT 1,4;
    #查询学生性别为男中年龄最大的学生信息
    SELECT * FROM demo01 WHERE sex='男' ORDER BY age DESC LIMIT 1;
    

    ​ 分页解决了服务器查询数据的压力,解决了页面显示数据的压力

    • 聚合函数

      数据库有这么一些有特定功能的函数|方法,其中有一些函数返回的结果是一行或一列当中的一个值,这样的函数,我们称为聚合函数

      1. sum(字段):求和,列的类型为数字

      2. max(字段):最大值,列的类型为数字或日期

      3. min(字段):最小值,列的类型为数字或日期

      4. avg(字段):平均值,列的类型为数字

      5. count(字段):计数,统计,列的类型为任何类型或者任意列

        count函数如果传入了具体的某个字段,一旦该字段的值为null,则不计数,哪怕其余字段有值,所以为了避免这种情况,通常直接用count(*)来计数,当所有字段都为null时不计数,只要有一个不为null就计数

      #查询学生总人数
      SELECT COUNT(*) 总人数 FROM stu;
      #查询demo01中最大的年龄
      SELECT MAX(age) FROM demo01;
      #查询demo01性别为男的中最大的年龄
      SELECT MAX(age) FROM demo01 WHERE sex='男';
      
    • group by … having… 分组查询

      group by 列名 having 条件
      
  • 查询语句的关键字书写顺序:

    • 书写顺序

    select  字段列表、聚合函数  from  表名  where  分组前的条件  group  by  分组字段  having  分组后的条件  order  by  排序  limit  分页
    
    • 执行顺序(执行优先级)

    where > group by > 聚合函数 > having > order by > limit
    

    案例:

    #查询每个学生的选课数量
    SELECT sid,COUNT(*) FROM s_c GROUP BY sid;
    #查询每个学生的选课数量,并且sid降序排列
    SELECT sid,COUNT(*) FROM s_c GROUP BY sid ORDER BY sid DESC;
    #查询每个学生的选课数>1,并且sid降序排列
    SELECT sid,COUNT(*) FROM s_c GROUP BY sid HAVING COUNT(*)>1 ORDER BY sid DESC;
    SELECT sid,COUNT(*) a FROM s_c GROUP BY sid HAVING a>1 ORDER BY sid DESC;
    
  • 子查询

    查询语句中又有另外一个查询语句,将优先执行的查询用小括号括起来的查询,那么此查询就是子查询,往往子查询是将查询的结果作为父查询的条件来使用的

    select 列名 from 表名 where 列名 符号 (select 列名 from 表名 where [条件]);
    

    案例:

    #查询学生zs
    SELECT sid FROM stu WHERE sname='zs';
    #查询学生zs的选课信息
    SELECT * FROM s_c sc WHERE sid IN (SELECT sid FROM stu WHERE sname='zs');#最好用in来取代=
    
  • 备份和恢复

MySQL个人学习笔记-仅供参考相关推荐

  1. RewriteCond指令格式(个人学习笔记仅供参考)

    RewriteBase指令显式地设置了目录级重写的基准URL. RewriteCond指令格式 [说明]定义重写发生的条件 [语法]RewriteCond TestString CondPattern ...

  2. opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)

    #include <windows.h> #include <gl/gl.h> #include <gl/glut.h> #include<stdio.h&g ...

  3. opengl 观察变换与投影变化 水壶 (学习笔记-仅供参考)

    #include <GL/glut.h> #include <stdlib.h>void display(void) {glClearColor(0.0, 0.0, 0.0, ...

  4. 教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考

    教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考 这是老师给我们布置的任务,我在这里做一个简单的总结,话不多说,直接上图上步骤吧 首先,在菜单栏中,点击 B ...

  5. 自己整理的面试笔记(仅供参考 , 有错误请大家多多指教 , 谢谢)

    javaScript,jQuery,vue的区别: 1.javaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互,JavaScrip ...

  6. hive学习(仅供参考)

    hive搭建 Hive 什么是hive Hive的优势和特点 hive搭建 解压.改名 修改环境变量 添加hive-site.xml 将maven架包拷贝到hive 替换一下gua包 使环境变量生效 ...

  7. SSRF 攻击PHP-FPM(FastCGI 攻击):学习总结仅供参考

    利用条件: Libcurl版本:高于7.45.0 PHP-FPM:监听端口,版本高于5.3.3 知道目标机器上任意一个php文件绝对路径 一.FastCGI fastcgi其实是一个通信协议,和HTT ...

  8. 单链表操作2-单链表A拆分成奇数和偶数值单链表B和C(个人学习笔记,仅供参考)

    单链表A拆分成奇数和偶数值单链表B和C 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 在一个带头结点的单链表A中,头指针为a,设计算法SplitList ( ...

  9. 单链表操作10-带头结点的单链表逆置(个人学习笔记,仅供参考)

    带头结点的单链表逆置 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出 ...

最新文章

  1. CellRanger单细胞基因表达分析基础流程
  2. python【数据结构与算法】二分模板
  3. FreeRTOS 查询任务 剩余的栈空间的 方法
  4. HTML字符实体(常用特殊字符)
  5. C语言 neutralize函数,关于因子数据处理函数中的中性化函数的几个问题
  6. 机器学习基石笔记2——在何时可以使用机器学习(2)
  7. Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae
  8. win7IE10和win7IE11浏览器更新所需补丁全套【附安装流程】
  9. ASP.Net中控件的EnableViewState属性 (转)
  10. 计算机一级B考试总结500字,期中考试总结与反思500
  11. 机器学习——优化算法:牛顿法-伪代码描述算法
  12. 硕士阶段学习情况汇总
  13. linux 版本号 笔记本_2019 年最佳 Linux 笔记本电脑发行版 top10
  14. WPF 计算DataGrid每一列的合计数
  15. 男人婚后为何会对婚姻心生倦意?
  16. facebook-pop 概述
  17. 北航linux内核编译及烧录实验报告,北航操作系统实验Lab1笔记
  18. 解决CUDA error: no kernel image is available for execution on the device
  19. markdown符号使用
  20. 2013年5月11日 13:44:13

热门文章

  1. 艾妮记账本Web开发(开发版)
  2. Git 连接远程仓库
  3. 小黄鸟(HttpCanary)证书配置续集-vmospro虚拟机导入证书
  4. 法律网推荐(二) 用Pig进行数据预处理
  5. 如何快速找出单词的变位词
  6. python实现简单小游戏_用python开发一个有趣的猜数字小游戏(实现简单的GUI界面学习)...
  7. Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springfr
  8. 关于计算机硬件的小技巧,电脑硬件的日常维护技巧
  9. 如何判断手机是否处于漫游状态
  10. EPSON彩喷机和HP激光机计数器的清零