1.DQL数据查询语言
作用:从数据表中提取满足特定条件的记录
简单语句查询
语法:
Selct 列名1,列名2… from 表名 where 条件;
1.1计算列
对从数据表中查出来的记录进行一定的运算之后显示出来
+,-,*./,%
例子:
//计算出售年份
Select 2022-s_age from stu;
1.2别名
如果在链接查询的多张表中存在相同名字的字段,我们可以使用表名.字段名来进行区分
Select s.* c.classname
F rom student s inner join classes c
On s.cid=c.cid;
1.3Distinct消除重复行
作用:在查询结果中消除重复行
Select distinct s_name from stu;
1.4条件查询
条件关系运算符
>,<,>=,<=,=,!=
Select * from stu where s_age>18;
区间查询(between and)
Select * from stu where s_age between 18 and 20;
条件逻辑运算符
And 并且 筛选多个条件同时满足的记录
Or 或者 筛选多个条件中至少满足一个条件的记录
Not 取反
1.5Null值判断
语法:
列名 is null;是空
列名 is not null;非空
1.6枚举查询
In(值1,值2,..);
1.7模糊查询
在where子句的条件中,我们可以使用like关键字来实现模糊查询
语法:
Select * from 表名 where 列名 like ’_a%’;
_表示任意单个字符
%表示任意多个字符
1.8分支结构查询
语法:
Case
When 条件1 then 结果1
When 条件2 then 结果2
When 条件3 then 结果3
Else 结果
End
注意:通过使用在case end进行条件判断,每条数据对应生成一个值.
经验:类似于java中的switch
SELECT employee_id , first_name , salary , department_id ,
CASE
WHEN salary>=10000 THEN 'A'
WHEN salary>=8000 AND salary<10000 then’B’
WHEN salary>=6000 AND salary<8000 then’C’
WHEN salary>=4000 AND salary<6000 then’D’
Else ‘E’
END as “LEVEL”
From yg;
2.函数
2.1时间函数
作用:当我们向日期类型的列添加数据时,可以通过字符串类型赋值(字符串格式必须为:yyyy-mm-dd hh:mm:ss)
Sysdate()当前系统时间(日,月,年,时,分,秒)
now()当前系统时间(日,月,年,时,分,秒)
2.2字符串函数
作用:通过sql指令对字符串进行处理
Concat(str1,str2,…)将多个字符串链接
Insert(str,pos,len,newstr)将str中指定pos位置开始len长度的内容替换为newStr
Lower(str) 将指定字符串转换为小写
Upper(str) 将指定字符串转换为大写
SUBSTRING(str,num,len) 将str字符串指定num位置开始截取len个内容
2.3聚合函数
Count():数量
Max():最大值
Min():最小值
Sum():求和
Avg():求平均数
3.排序查询order by
将查询到的满足条件的记录按照指定的列的值升序/降序排列
语法:
Select * from 表名 where 条件 order by 列名 asc|desc;
Asc:升序
Desc:按照指定的列降序
4.分组查询group by
分组:就是将数据表中的记录按指定的列进行分组
语法:
Select 分组字段/聚合函数 from 表名 where 条件
Group by 分组列名
[having 条件]
[order by 排序字段]
语句执行顺序:
- 先根据where条件从数据库查询记录
- Group by对查询记录进行分组
- 执行having对分组后的数据进行筛选
- 排序
Select s_age,count(s_id)
From stu
Group by s_age
Having count(s_id)>1
Order by s_age;
5.分页查询limit
当数据表中的记录比较多的时候,如果一次性全部查询相出显示给用户,用户的可读性就不太好,因此可以将这些数据分页进行展示
语法:
Select 查询的字段 From 表名
Where 条件
Limit param1,param2;
注意:
Param1:表示获取查询语句的结果中的第一条数据的索引(索引从0开始)
Param2:表示获取的查询记录的条数(如果剩下的数据条数<param2),则返回剩下的所有记录
6.表关联关系
6.1一对一关联
方案1:主键关联,两张数据表中主键相同的数据为相互对应的数据
方案2:唯一外键,在任意一张表中添加一个字段添加外键约束与另一张表主键关联,并且将外键列添加为唯一约束
6.2一对多
方案:在多的一端添加外键,与一的一端主键进行关联
6.3多对一
方案:在多的一端添加外键,与一的一端主键进行关联
6.4多对多
方案:需要额外创建一张关系表来维护多对多的关联,在关系表中滴定仪两个外键,分别与两个数据表的主键进行关联
7.外键约束
作用:将一个列添加外键约束与另一张表的主键进行关联后,这个外键约束的列添加的数据必须要在关联的主键字段中存在,保证了数据的完整性.
语法:
方式1:创建表时
Create table 表名(
字段名1 数据类型 [约束],
字段名2 数据类型 [约束].
Constraint 外键名称 foreign key (外键列名) references 主表(主表列名)
);
方式2:创建表后
Alter table 表名 add constraint 外键名称 foreign key(外键列名) references
主表(主表列名)
删除外键:
Alter table 表名 drop foreign key 外键名称;
例子:
创建班级表
create table classes(
class_id int primary key auto_increment,
class_name varchar(40) not null unique,
class_remark varchar(200)
);
创建学生表:
create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null, cid int,
constraint FK_STUDENTS_CLASSES
foreign key(cid) references classes(class_id)
);
级联
作用:当主表改变时,子表跟随改变
问题:当学生表中存在学生信息关联班级表的某条记录时,就不能对班级表的这条记录进行修改id和删除操作,
解决方案:在添加外键时,设置级联删除(ON DELETE CASCADE)级联修改(ON UPDATE CASCADE)
7.链接查询
在mysql中可以使用join实现多表的联合查询--;为链接查询,join按照其功能不同分为三个操作:
Inner join内连接,获取交集
作用:获取交集
语法:
Select … from 表1 inner join 表2 on 匹配条件 where 条件;
笛卡尔积
笛卡尔积:使用A中的每个记录一次关联B中的每个记录,笛卡尔积=A总数*B总数,
内连接条件
使用on设置两张表链接查询的匹配条件,查询结果只获取两种表中匹配条件成立的数据,任何一张表在另一张表如果没有找到对应匹配则不会出现在查询结果中
//使用where设置过滤条件,先生成笛卡尔积再从笛卡尔积中过滤数据(效率很低)
//使用On设置链接查询条件:先判断链接条件是否成立,如果成立两张表的数据组合生成一条结果记录
7.1Left join 左链接,获取左表与交集
左链接:显示左表中的所有数据,如果在右表中存在于左表记录满足匹配条件的数据,职责进行匹配;如果右表中不存在匹配数据,则显示为null;
语法:
Select * from 左表 left join 右表 on 匹配条件[where 条件];
7.2Right join 右链接,获取右边与交集
右连接:显示右表中的所有数据,如果在左表中存在于右表记录满足匹配条件的数据,职责进行匹配;如果左表中不存在匹配数据,则显示为null;
语法:
Select * from 左表 left join 右表 on 匹配条件[where 条件];
7.3子查询/嵌套查询
含义
子查询—先进行一次查询,第一次查询的结果作为第二次查询的条件(第二次查询是基于第一次查询的结果来进行的)
单行单列
多行单列
多行多列