MySQL个人学习笔记-仅供参考

本文详细介绍了MySQL数据库的基础知识,包括数据库系统概念、数据库管理系统DBMS、数据库管理员DBA的角色,以及关系型数据库和非关系型数据库的区别。重点讲解了SQL语言,包括DDL、DML、DQL和DCL,以及数据类型、表结构操作和数据操作。此外,还涵盖了SQL语句的书写规范、数据库操作示例和约束。最后,讨论了表关系设计、连接查询、外连接和高级查询技巧,如分页、模糊查询、排序和聚合函数的使用。

简介

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

    数据库本质上就是个文件系统,而且存储的数据可以实现持久化存储
    • 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 '列名'

    • 外键约束:标记约束(列级约束)
      • 作用:

        外键是实现表与表关系设计的前提,也就是说,表之间想要产生关联,那就需要用到外键,使得表关系设计更加合理

      • 特点:

        外键必须为外表的主键;外键的值必须有对应值;外键的值可以为空;一个表中可以有多个外键;一般外键的名称与关联主键的名称一致

      • 外键约束的设置:

        格式:foreign key(外键) references 外表 (外表的主键)

        foreign key(key):当前表中的字段作为了外键

        references:关联、参照

        外表 (外表的主键):当前表中外键关联的是外表的主键

  • 表关系

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

    • 一对一

      设计方式:两张表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 条件
      
      • 什么时候用到分组:

        当你的需求中出现诸如:每个、每组的关键字时,此时就需要按照每个、每组后面的字段进行分组,获取数据

      • 分组查询的原理:

        先对数据进行分组,再对分组的数据使用聚合函数进行汇总,分组查询与聚合函数的使用是密不可分的

      • 注意:

        如果sql语句中有分组操作,那么selectfrom之间只能出现分组的列名;若还存在聚合函数,那么也可以出现在selectfrom之间

  • 查询语句的关键字书写顺序:

    • 书写顺序
    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来取代=
    
  • 备份和恢复

    • 通过dos命令行进行备份

      在没有登录数据库的情况下备份:mysqldump -uroot -p密码 要备份的数据库名 >备份文件的路径/文件名.sql

      注:备份的文件中不包含创建数据库的sql语句,所以在恢复数据时,需先创建数据库来接收

    • 通过dos命令行进行恢复

      在没有登录数据库的情况下还原:mysql -uroot -p密码 要还原到的数据库名 <已备份文件的路径/文件名.sql

      在登录数据库的情况下还原:首先登陆mysql -uroot -p密码,进入数据库use 数据库名,还原source 已备份文件的路径/文件名.sql

    • 通过可视化工具SQLYog进行备份

      鼠标右键点击数据库,选择备份/导出,选择备份数据库、转储到sql,在弹出页面选中结构和数据,包括"CREATE database"语句,选择导出到的路径与名字,最后点击导出,此时接收数据库备份的文件可以不用提前创建,会自动创建

    • 通过可视化工具SQLYog进行恢复

      在左侧数据库管理的区域,右键选择执行sql脚本,选择备份的文件,点击执行即可完成恢复

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值