sql简介
英文: Structured Query Language,简称SQL
结构化查询语言,一门操作关系型数据库的编程语言
定义操作所有关系型数据库的统一标准
对于同一个需求,每一种数据库操作的方式可能会存在-一些不一样的地方, 我们称为“方言”
sql通用语法
1、SQL语句可以单行或多行书写,以分号结尾
2、MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
3、注释
单行注释:-- 注释内容 或#注释内容(MySQL特有)
多行注释:/*注释内容*/
sql分类
DDL(Data Definition Language)数据定义语言,用来定义数据库对象:数据库,表,列等
DML(Data Manipulation Language)数据操作语言,用来对数据库中表的数据进行增删改
DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录(数据)
DCL(Data Control Language)数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
简单的说就是
DDL:操作数据库,表等
DML:对表中的数据进行增删改
DQL:对表中的数据进行查询
DCL:对数据库进行权限控制
DDL
操作数据库
查询全部数据库名称
show databases;
创建数据库(一般使用第二种)
create database 数据库名称; -- 创建数据库,如果数据库存在,会报错
create database if not exists 数据库名称; -- 如果数据库存在会报错,一般先判断数据库是否存在,如果不存在就创建
删除数据库(一般使用第二种)
drop database 数据库名称;-- 直接删除数据库,如果数据库不存在,会报错
drop database if exists 数据库名称; -- 判断数据库是否存在,如果存在就删除,如果数据库不存在,不会报错
使用数据库
use 数据库名称;
查看当前使用的数据库
select database();
操作表
查询表
查询当前数据库中所有表名称
show tables;
查询当前表的整体结构
desc 表名称;
创建表
create table 表名(
字段名称1 数据类型1,
字段名称2 数据类型2,
……
字段名称n 数据类型n
); -- 最后一行数据后没有,
create table tb_user(
id int;
username varchar(20),
password varchar(20)
);
数据类型一览表
删除表
drop table 表名; -- 直接删除表,如果表不存在会报错
drop table if exists 表名;-- 删除表时判断表是否存在,如果存在就删除,不存在也不会报错
修改表
修改表名
alter table 表名 rename to 新表名;
添加一列
alter table 表名 add 列名 数据类型;
修改数据类型
alter table 表名 modify 列名 新数据类型;
修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型;
删除列
alter table 表名 drop 列名;
DML添加修改删除表数据
添加数据
给指定列添加数据
insert into 表名(列名1,列名2,...列名n) values (值1, 值2,...值n); -- 列名和值需要一一对应
给所有列添加数据
insert into 表名 values(值1,值2,...值n); -- 有多少列,就需要多少值
批量添加
insert into
表名(列名1,列名2...)
values(值1,值2...),(值1,值2...),(值1,值2...)...;
修改数据
update 表名 set 列名1 = 值1,列名2 = 值2....[where 条件] -- 如果update语句没有加where条件,则会将表中所有数据都修改
删除数据
delete from 表名 [where 条件] -- 如果delete语句中没有加where条件,则会将表中的数据都删除
DQL
首先创建学生表,然后再进行下一步操作
-- 新建数据库
create database if not exists db;
-- 使用数据库
use db;
-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math double(5,2), -- 数学成绩
english double(5,2), -- 英语成绩
hire_date date -- 入学时间
);
-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date)
VALUES
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
Select
字段列表
From
表名列表
Where
条件列表
Group by
分组列表
Having
分组后条件
Order by
排序字段
Limit
分页限定
基础查询
查询全部
select * from stu;
-- 查询全部 *代表了全部关键字,但是真正使用时会将*更换为各个字段名称,效率更高
select distinct 字段名 from 表名;
-- 去除重复数据,关键字distinct
select 字段名称1 as 别名1, 字段名称2 as 别名2 from 表名;
-- 起别名使用as关键字,或者用一个空格隔开
条件查询
使用一个一个的例子来熟悉这一用法
基础语法:select 字段列表 from 表名称 where 条件;
-- 查询年龄大于20岁的信息
Select * from stu where age > 20;
-- 查询年龄大于等于20岁的信息
select * from stu where age >= 20;
-- 查询年龄大于等于20岁并且年龄小于等于30岁的学员信息的信息
-- 并且一般不使用&& 而使用and,同理,或者一般使用or;
-- between and 包含边界
select * from stu where age >= 20 && age<=30;
select * from stu where age >= 20 and age<=30;
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岁的学员
select * from stu where age = 18;
-- 查询年龄不等于18岁的学员
-- 不等于可以使用!= 也可使用<>来表示
select * from stu where age != 18;
select * from stu where age <> 18;
-- 查询年龄等于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值的比较不能使用 = null 或者 != null,需要使用is null或者is not null
select *from stu where English is not null;
-- 模胡查询;通配符: _单个任意字符 %代表任意字符
-- 查询姓马的学员
Select * from stu where name like ‘马%’;
-- 查询第二个字是花的学员
Select * from stu where name like ‘_花%’;
-- 查询包含德的学员信息
Select * from stu where name like ‘%德%’;
排序查询
语法
select
字段名称
from 表名 [where 条件]
order by
排序字段1[排序规则1],排序字段2[排序规则2]....
排序规则:
ASC:升序排序(默认!!!)
DESC:降序规则
如果有多个排序条件,当前面的条件值一样时,才会根据第二条件进行排序
按照年龄的升序排序
select * from stu order by age asc;
按照数学成绩降序排序
select * from stu order by math desc;
按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math asc, english desc;
聚合函数
聚合函数:将一列作为一个整体,进行纵向计算,null值不参与聚合函数的运算
count(列名),返回的结果集中的行数,统计的列名不能为空,一般取主键或者*
-- 统计班级一共有多少学生
select count(id) from stu;
Max(列名),返回当前列的最大值
-- 查询数学成绩的最高分
select max(math) from stu;
有关min 最小值 sum 总数 avg 平均就不一一介绍了
练习题可以参考一下
-- Min
-- 查询数学成绩的最低分
Select min(math) from stu;
-- Sum
-- 查询数学成绩的总分
Select sum(math) from stu;
-- Avg
-- 查询数学成绩的平均分
Select avg(math) from stu;
分组查询
基础语法
select
字段列表
from
表名 [where 分组之前的条件限定]
group by
分组字段名称 [having 分组之后的条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无意义
执行顺序:where > 聚合函数 > having
Where 和having的区别
(1) 执行时机不一样:where是分组之前限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤
(2)可判断的条件不一样;where 不能对聚合函数进行判断,having可以
-- 查询男女同学各自数学平均分
Select sex, avg(math) from stu group by sex;
-- 查询男女同学各自数学平均分,以及各自人数
Select sex, avg(math), count(*) from stu group by sex;
-- 查询男女同学各自数学平均分,以及各自人数:要求低于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;
分页查询
基础语法:
select 字段列表
from 表名
limit 起始索引,每页显示的条目;
起始索引从0开始
起始索引 =(当前页码-1)*每页显示的条数
-- 从0开始查询,查询3条数据
Select * from stu limit 0, 3;
-- 每页显示3条数据,查询第1页数据
Select * from stu limit 0, 3;
-- 每页显示3条数据,查询第2页数据
Select * from stu limit 3, 3;
-- 每页显示3条数据,查询第3页数据
Select * from stu limit 6, 3;
注意:
分页查询limit是MySQL数据库的方言
Oracle分页查询使用rownumber
SQL Server分页查询使用top
推荐:
学完了单表的查询,来试着做几个题练一练?(来源于力扣)