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 ... FROM 表 WHERE 条件;
# 查找学生表所有数据
SELECT * FROM zy_student;
# 查找学生表的某个列
SELECT sno,sname FROM zy_student;
3、关于条件的使用方法
(1)运算符
=, !=, < ,<=, >, >=
——基本的比较运算符BETWEEN … AND …
——在两个数之间NOT BETWEEN … AND …
——不在两个数之间LIKE + 通配符%
——模糊查询
(2)多个条件的用法
存在多个条件时 用 AND OR
进行连接 ,对应 且 和或的关系。条件较多时,还可以用小括号()
进行包装 ,语法如下
SELECT 字段1, 字段2, … FROM 表
WHERE 条件1
AND/OR 条件2
AND/OR …; # 可以连接多个条件
# 举个例子 # 找出 课程编号A1 成绩大于60分的 编号
SELECT sno FROM zy_sc WHERE cno = 'A1' AND grade > 60;
(3)模糊查询
-
通配符
%
代表0个以上的所有字符 -
通配符
_
,代表1个字符 -
LIKE
和NOT 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 * FROM 表1 INNER JOIN 表2 ON 表1和表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:如果取别名,语句内所有的内容都要用别名表示,否则会报错
- 注意1:
-
尝试给字段取别名。举个例子
# 将字段的总数取别名为num SELECT count(*) AS num FROM zy_student;
三、外连接
- 在内连接中,表1和表2 是并列关系,在外连接中,是有主从关系区分的
- 简单理解,该语句会读取主表 的所有选取的字段数据,即使在从表没有对应的 字段值。
1、左外连接
-
概念:查询结果以左表为主,查询的数据左表的全部显示,右表的数据只显示有联系的,不存在的以null显示。
- 从左表中返回所有的值,即使右表中没匹配到
-
语法如下:
LEFT OUTER JOIN
SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 表1和表2的关系 (AND 表2的查询条件) WHERE 表1的条件...
-
如此命名后,以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中不符合实际使用场景,所以不使用。
- 目前阶段,掌握内连接 和 左外连接即可