【Java知识点整理】 MySQL02 学习SQL语句(增删改查,联表查询)

SQL语句

一、SQL语句的注意点

  • 不区分大小写*(与java区分*
  • 一条SQL可以多行,但是以分号结束
  • 字符串以单引号表示,不要用双引号*(与java区分*
  • 如果有关键,用反引号``表示
SQL语句规范
  • 语句用大写 CREATE TABLE
  • 字段名/ 表用 用小写 studnet age
2、⭐️SQL语句的分类
  • DDL 数据定义语言 Data Definition Language
    • 创建数据库、创建表、删除表、修改表
  • DML 数据操作语言
    • 插入数据、删除数据、修改数据、查询数据
  • DCL 数据控制语言
    • 创建用户,权限操作
  • TPCL 事务控制操作语言
    • 事务

二、MySQL的数据类型

表包含列(字段),列就是类似Java的属性。数据库的字段也有数据类型or 字段类型:

MySQL对应的字段类型Java的数据类型
int 整数int
float小数float
varchar(长度) String
char(长度) String
clob/blob类型
时间类
date 年月日 (日期)
time 时分秒 (时间)
datetime 年月日+时分秒
timestamp 时间戳

①:varchar是 变长字符串。长度是可变的,会根据实际占用的长度变化的,varchar的最大长度大概是5000左右

②:char是 定长字符串。长度是固定的,会在不足的位置上自动补充空格

  • 两者的对比是哪个,char速度更快,用于长度固定的场景,平常用的比较多的是varchar

③:clob/blob是二进制存储文件等数据,最大可以存2个G的内容

④:timestamp 时间戳:目前使用较少了,用long长整型保存。用要储存的时间距离1970-1-1 0:0:0的毫秒数,存储在long内,再转换为当前时间。

  • 这种方法可以节约空间,以前空间硬盘很贵,现在用比较多的就是datatime来表示时间

三、操作数据库

  • 创建数据库 CREATE DATABASE + 设置字符集和排序规则

  • 删除语句库 DROP DATABASE

  • 举例:

    # 创建数据库
    CREATE DATABASE 数据名  SET 编码 COLLATE 排序编码
    # 举个 例子
    CREATE DATABASE `JX2205db` CHARACTER SET 'utf8' COLLATE 'utf8_bin';
    # 字符集目前采用utf8 ,排序规则也采用 utf8_bin
    
    # 删除数据库
    DROP DATABASE jx2205db;  
    

四、操作表格

  • 创建表:表包含列(字段)

    • 主键/关键字:primary key ——唯一标识是不能重复的字段,而且一般在第一个字段命名;
    • 用括号包含多个字段,每个字段声明时用逗号隔开,最后一个字段无需逗号
  • 删除表

  • 修改表,比如新增字段,但是表里有数据时就无法修改了(用的比较少一般就是删表重新添加)

  • 举例:

    # 创建表
    CREATE TABLE 表名
    (
    字段1   类型1  primary key;	# 关键字
    字段2   类型2,
        .....	# 注意最后的字段无需逗号
    ); #注意分号结尾
    
    ## ====举个例子=====
    CREATE TABLE student
    (
        stuid varchar(20) PRIMARY key,  # 关键字
        stuname varchar(20),
        age int,
        brithday date
    );
    
    # 删除表
    DROP TABLE student;
    
    
    # 新增字段   
    ALTER TABLE 表名 add 字段名 类型;  
    # 举个例子
    ALTER TABLE student add phone varchar(20);  #在学生表添加一个电话字段
    

五、操作数据(DML)

1、 插入数据 INSERT INTO
INSERT INTO 表名(字段1,字段2……) VALUES (1,值2 ……)
# 举个例子
use jx2205db; # 选中数据库
INSERT INTO student(stuid , stuname , age) VALUES ('jx220523' , 'zhc' , 27); 
INSERT INTO student(stuid , stuname , age) VALUES ('jx220524' , 'ss' , 21); 
INSERT INTO student(stuid , stuname , age) VALUES ('jx220525' , '2321' , 25); #插入数据
  • 注意,添加多条数据时,关键字的字段值必须不一样
  • 表名后面括号的内容可以不写,但是容易出错,建议都写上
2、删除数据 DELETE FROM
DELETE FROM 表名 WHERE 字段=;  # 条件
# 举个例子
DELETE FROM student WHERE stuname = 'zhc'; # 删除stuname为zhc的数据
DELETE FROM student; # 删除所有数据
  • 注意 ,如果没有WHERE加条件,就会将整个表的数据删除
3、修改数据 UPDATE+SET
UPDATE 表名 SET 字段1=1 , 字段2=2 .... WHERE 字段=;
# 举个例子
UPDATE student SET stuname='正常' , age=30 WHERE stuid = 'jx220523';# 替换id=23的数据
UPDATE student SET stuname='正常' , age=30;    # 替换所有的数据
  • 注意,如果没有WHERE设置条件,就会全部替换
4、查找数据 SELECT

六、⭐️数据查询详解

1、查询分类
  • 单表查询
  • 连表查询
  • 分组查询
  • 嵌套查询等

目前主要学习单表和连表,后续还需要学习剩下的

2、单表查询 :SELECT 字段/列名 FROM 表名 WHERE 条件
  • 星号*代表所有的列偷懒行为不建议使用,公司的表内容很多,会浪费查询资源
  • WHERE条件可以不写,不写的情况表示所有行
# 查找
SELECT 列名1,列名2 ... FROMWHERE 条件;

# 查找学生表所有数据
SELECT * FROM zy_student;
# 查找学生表的某个列
SELECT sno,sname FROM zy_student;
3、关于条件的使用方法
(1)运算符
  • =, !=, < ,<=, >, >=——基本的比较运算符
  • BETWEEN … AND …——在两个数之间
  • NOT BETWEEN … AND …——不在两个数之间
  • LIKE + 通配符%——模糊查询
(2)多个条件的用法

存在多个条件时 用 AND OR进行连接 ,对应 且 和或的关系。条件较多时,还可以用小括号()进行包装 ,语法如下

SELECT 字段1, 字段2,FROMWHERE 条件1
    AND/OR 条件2
    AND/OR;    # 可以连接多个条件
# 举个例子 # 找出 课程编号A1 成绩大于60分的 编号
SELECT sno FROM zy_sc WHERE cno = 'A1' AND grade > 60;
(3)模糊查询
  • 通配符% 代表0个以上的所有字符

  • 通配符_,代表1个字符

  • LIKENOT LIKE ——配合通配符可以进行模糊查询,没有通配符时和=的作用一样

  • 举个例子

    # 查找名字 以 “小”字开头 的学生
    SELECT * FROM zy_student WHERE SNAME LIKE '小%';
    
(4)查询空Null
  • 首先要先分清楚 空字符串‘’ 和 没有数据Null区别

    空字符串是有内容,只是里面的内容是空的

    没有数据相当于空指针,里面是没有内容的

  • is null——查询数据为空的内容 || is not null 查询不为空的内容

  • = ‘’——查询空字符串的内容 || !='' 查询不是空字符串的内容

4、排序查询结果 ORDER BY
  • 语法 ORDER BY 列 ASC / DESC

    • asc 升序 默认 desc 降序
  • 举例

    # 按成绩升序查询
    SELECT * FROM zy_sc ORDER BY grade;
    SELECT * FROM zy_sc ORDER BY grade ASC;
    # 按成绩降序序查询
    SELECT * FROM zy_sc ORDER BY grade DESC;
    
5、分页查询结果 LIMIT
  • 语法LIMIT 开始的下标,条数

  • 开始的下标是从0开始计数,类似数组的下标

  • 举个例子

    LIMIT 0,5;  #查询前面5行
    LIMIT 5,5;  #查询 从第5行开始5个行,即第五行到第9行
    

在条件书写规范上,先写排序,再写分页。举个例子

# 查询成绩最低的5个学生
SELECT * FROM zy_sc ORDER BY grade ASC LIMIT 0,5;
  • 条件呢?
6、 统计查询结果——统计函数
  • 行的个数 count(*)——是固定用法吗?

  • 求和 sum(列)

  • 平均值 avg(列)

  • 最大值 最小值 max(列) 和 min(列)

  • 举个例子

    # 求成绩表的行数
    SELECT count(*) FROM zy_sc;
    # 求学生的平均成绩
    SELECT avg(grade) FROM zy_sc;
    

联表查询

一、联表分类.

  • 内连接
    • 默认的连接
  • 外连接
    • 左外
    • 右外
    • 全外

二、内连接

  • 内连接可以理解为:集合的交集运算

  • 语法如下:

    SELECT *  FROM1
    INNER JOIN2  ON1和表2的关系
    WHERE 条件...
    
    • 其中默认内连接时,INNER可以不写
  • 关系一般是指外键关系,相当于表1.字段 = 表2.字段

  • 举个例子

    # 查询小王的成绩 ,小王名字在学生表内,成绩在成绩表内
    SELECT *
    FROM zy_student
    INNER JOIN zy_sc ON zy_student.sno = zy_sc.sno  
    # 讲两张表通过外键sno进行连接
    WHERE zy_student.sname = '小王'
    
    • 注意1:联表查询时不能全用星号*,会导致出现重复的字段

      • 解决方法:查询指定的字段即可。修改为:SELECT zy_student.* , zy_sc.grade ...
    • 注意2:联表查询也可以三张表进行查询。

      • 具体用法:当INNER JOIN 第三张表时,只需要第三张表和前两张表的任意一张进行关联即可。举个例子

        # 查询小王的成绩 还要知道学科对应的名称
        SELECT zy_student.* , zy_sc.grade , cname
        FROM zy_student
        INNER JOIN zy_sc ON zy_student.sno = zy_sc.sno
        INNER JOIN zy_course on zy_sc.cno = zy_course.cno
        # 第三张表和第二章表进行关联
        WHERE zy_student.sname = '小王'
        
    • 注意3:联表查询时,查询的字段如果在多个表出现,必须用表名.字段的方式进行查询,否则会报错

##小知识点:给表名或字段名取别名
  • 语法表名(字段名) AS 别名。举个例子

    # 尝试将表名取别名
    SELECT a.* , b.grade , c.cname
    FROM zy_student AS a  
    # 学生表取别名为a
    INNER JOIN zy_sc  b ON a.sno = b.sno
    # 成绩表 取名为b
    INNER JOIN zy_course c on b.cno = c.cno
    # 学科表取名为c
    WHERE a.sname = '小王'
    
    • 注意1:AS 可以取消
    • 注意2:如果取别名,语句内所有的内容都要用别名表示,否则会报错
  • 尝试给字段取别名。举个例子

    # 将字段的总数取别名为num
    SELECT count(*) AS num FROM zy_student;
    

三、外连接

  • 在内连接中,表1和表2 是并列关系,在外连接中,是有主从关系区分的
  • 简单理解,该语句会读取主表 的所有选取的字段数据,即使在从表没有对应的 字段值。
1、左外连接
  • 概念:查询结果以左表为主,查询的数据左表的全部显示,右表的数据只显示有联系的,不存在的以null显示

    • 从左表中返回所有的值,即使右表中没匹配到
  • 语法如下:LEFT OUTER JOIN

    SELECT *
    FROM1
    LEFT OUTER JOIN2 ON1和表2的关系 (AND2的查询条件)
    WHERE1的条件...
    
    • 如此命名后,以join作为参照物,表1就是左表,表2就是**右表k*

    • 语法中的OUTER可以省略

    • 查询的条件为什么要在ON后面和AND使用?

      • 当查询的条件在表2时,就需要在ON后面
      • 如果查询的条件在表1,就可以直接写在WHERE后面
    • 举个例子,查询A1课程所有同学的成绩

      SELECT *
      FROM zy_student a
      INNER JOIN zy_sc b ON a.sno = b.sno AND b.cno = `A1`;
      # 查询的条件在表2 所以要写在ON后面
      
2、右外连接
  • 效果类似左外连接,查询结果的数据以右表为主
  • 语法:RIGHT OUTER JOIN
3、全外连接

是集合的乘积(笛卡尔乘积),在mysql中不符合实际使用场景,所以不使用。

  • 目前阶段,掌握内连接 和 左外连接即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xcong_Zhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值