数据库语法

DDL–创建表

操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。

  • 查询当前数据库下所有表名称

    show databases;--单行注释 /*多行注释*/
    
  • 创建数据库

    create databases 数据库名称;
    
  • 删除

    drop databases 数据库名称;
    
  • 使用数据库

    select database();--查看当前使用的数据库
    
    use 数据库名称;
    

##DDl–操作表


查询表

  • 查询当前数据库下所有的表名称

    show tables;--先进入表(use 数据库名称)在使用
    
  • 查询表结构

    desc 表结构;
    

创建表

最后一行不加逗号

CREATE TABLE 表名 (
	字段名1 数据类型1,
	字段名2 数据类型2,
	
	字段名n 数据类型n
);

数据类型

  • 数值

    tinyint : 小整数型,占一个字节
    int  大整数类型,占四个字节
    eg  age int
    double  浮点类型
    使用格式: 字段名 double(总长度,小数点后保留的位数)
    eg  score double(5,2)
    
  • 日期

    date  日期值。只包含年月日
    eg birthday date 
    datetime  混合日期和时间值。包含年月日时分秒
    
  • 字符串

    char  定长字符串。
    优点:存储性能高
    缺点:浪费空间
    eg  name char(10) 如果存储的数据字符个数不足10个,也会占10个的空间
    varchar  变长字符串。
    优点:节约空间
    缺点:存储性能底
    eg  name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间
    

删除表

  • 删除表

    drop table 表名;
    
  • 删除表时判断表是否存在

    drop table if exists 表名;
    

修改表

  • 修改表名

    alter table 表名 rename to 新的表名;
    -- 将表名student修改为stu
    alter table student rename to stu;
    
  • 添加一列

    alter table 表名 add 列名 数据类型;
    -- 给stu表添加一列address,该字段类型是varchar(50)
    alter table stu add address varchar(50);
    
  • 修改数据类型

    alter table 表名 modify 列名 新数据类型
    -- 将stu表中的address字段名改为 addr,类型改为varchar(50)
    alter table stu change address addr varchar(50);
    
  • 修改列名和数据类型

    alter table 表名 change 列名 新列名 新数据类型;
    -- 将stu表中的address字段名改为 addr,类型改为varchar(50)
    alter table stu change address addr varchar(50);
    
  • 删除列

    alter table 表名 drop 列名
    -- 将stu表中的addr字段 删除
    alter table stu drop addr;
    

DML–数据操作

添加数据

  1. 给指定列添加数据

    INSERT INTO 表名(列名1,列名2,) VALUES(1,2,);
    
  2. 给全部列添加数据

    INSERT INTO 表名 VALUES(1,2,);
    
  3. 批量添加数据

    INSERT INTO 表名(列名1,列名2,) VALUES(1,2,),(1,2,),(1,2,);
    INSERT INTO 表名 VALUES(1,2,),(1,2,),(1,2,);
    
  4. eg

    -- 给指定列添加数据
    INSERT INTO stu (id, NAME) VALUES (1, '张三');
    -- 给所有列添加数据,列名的列表可以省略的
    INSERT INTO stu (id,NAME,sex,birthday,score,email,tel,STATUS) VALUES (2,'李四','男','1999-11-
    11',88.88,'lisi@itcast.cn','13888888888',1);
    INSERT INTO stu VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
    -- 批量添加数据
    INSERT INTO stu VALUES
    (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1),
    (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1),
    (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
    

修改数据

  1. 修改表数据

    UPDATE 表名 SET 列名1=1,列名2=2, [WHERE 条件] ;
    

    1. 修改语句中如果不加条件,则将所有数据都修改
    2. 像上面的语句中的中括号,表示在写sql语句中可以省略这部分

    将张三的性别改为女

    1 update stu set sex = '女' where name = '张三';
    

    将张三的生日改为 1999-12-12 分数改为99.99

    update stu set birthday = '1999-12-12', score = 99.99 where name = '张三';
    

###删除数据

  1. 删除数据

     DELETE FROM 表名 [WHERE 条件] ;
    
    -- 删除张三记录
    delete from stu where name = '张三';
    -- 删除stu表中所有的数据
    delete from stu;
    

DQL–查询数据

SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定

基础查询

  • 查询多个字段

    SELECT 字段列表 FROM 表名;
    SELECT * FROM 表名; -- 查询所有数据
    
  • 去除重复记录

    1 SELECT DISTINCT 字段列表 FROM 表名;
    
  • 起别名

    AS: AS 也可以省略
    

    练习

  • 查询name、age两列

    select name,age from stu;
    
  • 查询所有列的数据,列名可用*代替

    select * from stu;
    
  • 去除重复记录

    select distinct address from stu;
    
  • 查询姓名、数学成绩、英语成绩。并通过as给math和english起别名(as关键字可以省略)

    select name,math as 数学成绩,english as 英文成绩 from stu;
    select name,math 数学成绩,english 英文成绩 from stu;
    
  • 范围查询

select * from emp where sal in(1500,3000,5000);

条件查询

  • 语法

     SELECT 字段列表 FROM 表名 WHERE 条件列表;
    

    练习

  • 查询年龄大于20岁的学员信息

    1 select * from stu where age > 20;
    
  • 查询年龄大于等于20岁的学员信息

    select * from stu where age >= 20;
    
  • 查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息

    select * from stu where age >= 20 && age <= 30;
    select * from stu where age >= 20 and age <= 30;
    

    上面语句中 && 和 and 都表示并且的意思。建议使用 and 。 也可以使用 between … and 来实现上面需求

    select * from stu where age BETWEEN 20 and 30;
    
  • 查询入学日期在'1998-09-01’ 到 ‘1999-09-01’ 之间的学员信息

    select * from stu where hire_date BETWEEN '1998-09-01' and '1999-09-01';
    
  • 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息

    select * from stu where age = 18 or age = 20 or age = 22;
    select * from stu where age in (18,20 ,22);
    
  • 查询英语成绩为 null的学员信息 null值的比较不能使用 = 或者 != 。需要使用 is 或者 is not

    select * from stu where english = null; -- 这个语句是不行的
    select * from stu where english is null;
    select * from stu where english is not null;
    

模糊查询

模糊查询使用like关键字,可以使用通配符进行占位: (1)_ : 代表单个任意字符

(2)% : 代表任意个数字符

  • 查询姓’马’的学员信息

    select * from stu where name like '马%';
    
  • 查询第二个字是’花’的学员信息

    select * from stu where name like '_花%';
    
  • 查询名字中包含 ‘德’ 的学员信息

    select * from stu where name like '%德%';
    

排序查询

  • 语法

    select字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2] ;
    
  • ASC : 升序排列 (默认值)

    DESC : 降序排列

    注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

  • 查询学生信息,按照年龄升序排列

    select * from stu order by age ;
    
  • 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列

    select * from stu order by math desc , english asc ;
    

聚合函数

  1. 概念

    将一列数据作为一个整体,进行纵向计算。

  2. 分类

    image-20240507192437814

  3. 聚合函数语法

    select 聚合函数名(列名) from ;
    

    注意:null 值不参与所有聚合函数运算

    练习

    • 统计班级一共有多少个学生(后面可以加条件查询语句)

      select count   from stu;
      select count(english) from stu;
      

      上面语句根据某个字段进行统计,如果该字段某一行的值为null的话,将不会被统计。所以可以在count() 来实现。 表 示所有字段数据,一行中也不可能所有的数据都为null,所以建议使用 count(*)

      1 select count(*) from stu;
      
    • 查询数学成绩的最高分

       select max(math) from stu;
      

###分组查询

  • 语法

    SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
    

    注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

    练习

    • 查询男同学和女同学各自的数学平均分

      select sex, avg(math) from stu group by sex;
      

      注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

    • 查询男同学和女同学各自的数学平均分,以及各自人数

      select avg(age) '年龄',count(*) '性别' from xsjbxxb group by xb;
      
    • 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组

      select sex, avg(math),count(*) from stu where math > 70 group by sex;
      
    • 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的

      select sex, avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
      

      执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过 滤。

      可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。

分页查询

  • 语法

    SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;
    
  • 从0开始查询,查询3条数据(这里0就是起始索引)

    select * from stu limit 0 , 3;
    
  • 公式

    起始索引 = (当前页码 - 1) * 每页显示的条数