常用的SQL语句(SQL语句详细版,以MySQL为例) 太过爱你忘了你带给我的痛 2023-09-23 21:25 76阅读 0赞 ## 常用的SQL语句(SQL语句详细版,以MySQL为例) ## 注意:SQL大小写都可以使用 ### 1、DDL:操作数据库 ### 操作数据库主要就是对数据库的增删查操作。 #### 1.1 查询所有的数据库 #### show databases; #### 1.2 创建数据库 #### * **创建数据库** create database 数据库名称; * **创建数据库(判断,如果不存在则创建)** create database if not exists 数据库名称; #### 1.3 删除数据库 #### * **删除数据库** drop database 数据库名称; * **删除数据库(判断,如果存在则删除)** drop database if exists 数据库名称; #### 1.4 使用数据库 #### 数据库创建好了,要在数据库中创建表,得先明确在哪儿个数据库中操作,此时就需要使用数据库。 * **使用数据库** use 数据库名称; * **查看当前使用的数据库** select database(); ### 2、DDL:操作表 ### 操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。 #### 2.1 查询表 #### * **查询当前数据库下所有表名称** show tables; * **查询表结构** desc 表名称; #### 2.2 创建表 #### * **创建表** create table 表名 ( 字段名1 数据类型1, 字段名2 数据类型2, … 字段名n 数据类型n ); 例如: create table tb_user ( id int, username varchar(20), password varchar(32) ); #### 2.3 表的数据类型 #### MySQL 支持多种类型,可以分为三类: * 数值 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个,那就数据字符个数是几就占几个的空间 ##### 创建表案例: ##### 需求:设计一张学生表,请注重数据类型、长度的合理性 1. 编号 2. 姓名,姓名最长不超过10个汉字 3. 性别,因为取值只有两种可能,因此最多一个汉字 4. 生日,取值为年月日 5. 入学成绩,小数点后保留两位 6. 邮件地址,最大长度不超过 64 7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符 8. 学生状态(用数字表示,正常、休学、毕业...) 语句设计如下: create table student ( id int, name varchar(10), gender char(1), birthday date, score double(5,2), email varchar(15), tel varchar(15), status tinyint ); #### #### #### 2.4 删除表 #### * **删除表** drop table 表名; * **删除表时判断表是否存在** drop table if exists 表名; #### 2.5 修改表 #### * **修改表名** 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字段的类型改为 char(50) alter table stu modify address char(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; ### 3、DML:操作表中的数据 ### DML主要是对数据进行增(insert)删(delete)改(update)操作。 #### 3.1 添加数据 #### * **给指定列添加数据** insert into 表名(列名1,列名2,…) values(值1,值2,…); * **给全部列添加数据** insert into 表名 values(值1,值2,…); * **批量添加数据** insert into 表名(列名1,列名2,…) values(值1,值2,…),(值1,值2,…),(值1,值2,…)…; insert into 表名 values(值1,值2,…),(值1,值2,…),(值1,值2,…)…; * **练习** 为了演示以下的增删改操作是否操作成功,故先将查询所有数据的语句介绍给大家: select * from stu; -- 给指定列添加数据 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); #### 3.2 修改数据 #### * **修改表数据** update 表名 set 列名1=值1,列名2=值2,… [where 条件] ; > 注意: > > 1. 修改语句中如果不加条件,则将所有数据都修改! > 2. 像上面的语句中的中括号,表示在写sql语句中可以省略这部分 * **练习** * 将张三的性别改为女 update stu set sex = '女' where name = '张三'; * 将张三的生日改为 1999-12-12 分数改为99.99 update stu set birthday = '1999-12-12', score = 99.99 where name = '张三'; * 注意:如果update语句没有加where条件,则会将表中所有数据全部修改! update stu set sex = '女'; 上面语句的执行完后查询到的结果是: #### 3.3 删除数据 #### * **删除数据** delete from 表名 [where 条件] ; * **练习** -- 删除张三记录 delete from stu where name = '张三'; -- 删除stu表中所有的数据 delete from stu; ### 4、DQL:数据的查询 ### **完整语法** select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组后条件 order by 排序字段 limit 分页限定 #### 4.1 基础查询 #### ##### 4.1.1 语法 ##### * **查询多个字段** select 字段列表 from 表名; select * from 表名; -- 查询所有数据 * **去除重复记录** select distinct 字段列表 from 表名; * **起别名** as: as 也可以省略 ##### 4.1.2 练习 ##### * 查询name、age两列 select name,age from stu; * 查询所有列的数据,列名的列表可以使用\*替代 select * from stu; * 查询地址信息 select address 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; #### 4.2 条件查询 #### ##### 4.2.1 语法 ##### select 字段列表 from 表名 where 条件列表; * **条件** 条件列表可以使用以下运算符 <table> <thead> <tr> <th>符号</th> <th>功能</th> </tr> </thead> <tbody> <tr> <td>></td> <td>大于</td> </tr> <tr> <td><</td> <td>小于</td> </tr> <tr> <td>>=</td> <td>大于等于</td> </tr> <tr> <td><=</td> <td>小于等于</td> </tr> <tr> <td>=</td> <td>等于</td> </tr> <tr> <td><> 或 !=</td> <td>不等于</td> </tr> <tr> <td>between… and…</td> <td>在某个范围之内(都包含)</td> </tr> <tr> <td>in(…)</td> <td>多选一</td> </tr> <tr> <td>like 占位符</td> <td>模糊查询 _单个任意字符 %多个任意字符</td> </tr> <tr> <td>is NULL</td> <td>是NULL</td> </tr> <tr> <td>is NO NULL</td> <td>不是NULL</td> </tr> <tr> <td>and 或 &&</td> <td>并且</td> </tr> <tr> <td>or 或 ||</td> <td>或者</td> </tr> <tr> <td>not 或 !</td> <td>非,不是</td> </tr> </tbody> </table> ##### 4.2.2 条件查询练习 ##### * 查询年龄大于20岁的学员信息 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岁的学员信息 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值的比较不能使用 = 或者 != 。需要使用 is 或者 is not select * from stu where english = null; -- 这个语句是不行的 select * from stu where english is null; select * from stu where english is not null; ##### 4.2.3 模糊查询练习 ##### > 模糊查询使用like关键字,可以使用通配符进行占位: > > (1)\_ : 代表单个任意字符 > > (2)% : 代表任意个数字符 * 查询姓’马’的学员信息 select * from stu where name like '马%'; * 查询第二个字是’花’的学员信息 select * from stu where name like '_花%'; * 查询名字中包含 ‘德’ 的学员信息 select * from stu where name like '%德%'; #### 4.3 排序查询 #### ##### 4.3.1 语法 ##### select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …; 上述语句中的排序方式有两种,分别是: * ASC : 升序排列 **(默认值)** * DESC : 降序排列 > 注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序 ##### 4.3.2 练习 ##### * 查询学生信息,按照年龄升序排列 select * from stu order by age ; * 查询学生信息,按照数学成绩降序排列 select * from stu order by math desc ; * 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列 select * from stu order by math desc , english asc ; #### 4.4 聚合函数 #### ##### 4.4.1 概念 ##### 将一列数据作为一个整体,进行纵向计算。 现有一需求让我们求表中所有数据的数学成绩的总和。这就是对math字段进行纵向求和。 ##### 4.4.2 聚合函数分类 ##### <table> <thead> <tr> <th>函数名</th> <th>功能</th> </tr> </thead> <tbody> <tr> <td>count(列名)</td> <td>统计数量(一般选用不为null的列)</td> </tr> <tr> <td>max(列名)</td> <td>最大值</td> </tr> <tr> <td>min(列名)</td> <td>最小值</td> </tr> <tr> <td>sum(列名)</td> <td>求和</td> </tr> <tr> <td>avg(列名)</td> <td>平均值</td> </tr> </tbody> </table> ##### 4.4.3 聚合函数语法 ##### select 聚合函数名(列名) from 表; > 注意:null 值不参与所有聚合函数运算 ##### 4.4.4 练习 ##### * 统计班级一共有多少个学生 select count(id) from stu; select count(english) from stu; 上面语句根据某个字段进行统计,如果该字段某一行的值为null的话,将不会被统计。所以可以在count(\*) 来实现。\* 表示所有字段数据,一行中也不可能所有的数据都为null,所以建议使用 count(\*) select count(*) from stu; * 查询数学成绩的最高分 select max(math) from stu; * 查询数学成绩的最低分 select min(math) from stu; * 查询数学成绩的总分 select sum(math) from stu; * 查询数学成绩的平均分 select avg(math) from stu; * 查询英语成绩的最低分 select min(english) from stu; #### 4.5 分组查询 #### ##### 4.5.1 语法 ##### select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤]; > 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义 ##### 4.5.2 练习 ##### * 查询男同学和女同学各自的数学平均分 select sex, avg(math) from stu group by sex; > 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义 select name, sex, avg(math) from stu group by sex; -- 这里查询name字段就没有任何意义 * 查询男同学和女同学各自的数学平均分,以及各自人数 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; **where 和 having 区别:** * 执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。 * 可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。 #### 4.6 分页查询 #### 接下来我们先说分页查询的语法。 ##### 4.6.1 语法 ##### select 字段列表 from 表名 limit 起始索引 , 查询条目数; > 注意: 上述语句中的起始索引是从0开始 ##### 4.6.2 练习 ##### * 从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; 从上面的练习推导出起始索引计算公式: 起始索引 = (当前页码 - 1) * 每页显示的条数
还没有评论,来说两句吧...