1 SQL简介
SQL是一门操作关系型数据库的编程语言
SQL通用语法
- SQL语句可以以单行或多行书写,以分号结尾。只有在读取到分号后系统才会默认你已经输入执行语句
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 注释
单行注释:-- 注释内容 (两个横杠一个空格)或 #注释内容(MySQL特有)
多行注释:/* 注释 */
SQL分类:
- DDL 数据定义语言,用来定义数据库对象;数据库,表,列等
- DML 数据操作语言,用来对数据库中表的数据进行增删改
- DQL 数据查询语言,用来查询数据库表的记录(数据)
- DCL 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
1.1 DDL 数据定义语言
DDL--------------------------操作数据库
1、查询
- show databases;
2、创建
- 创建数据库
create database 数据库名称; - 创建数据库(判断,如果不存在则创建)
create database if not exists 数据库名称;
3、删除
- 删除数据库
drop database 数据库名称; - 删除数据库(判断,如果存在则删除)
drop database if exists 数据库名称;
4、使用数据库
- 查看当前使用的数据库
select database(); - 使用数据库
use 数据库名称;
DDL----------------------------------操作表
1、查询表:
- 查询当前数据库下所有表名称
show tables; - 查询表结构
desc 表名称
2、创建表
CREATE TABLE 表名(
字段名1 数据类型1,
字段名2 数据类型2,
…
字段名n 数据类型n
);
注意:最后一行末尾不能加逗号
mysql> create table tb_user(
-> id int,
-> username varchar(20),
-> password varchar(30)
-> );
MySQL支持多种类型,可分为三类
- 数值
- 日期
- 字符串
3、修改表
- 修改表名
alter table 表名 rename to 新的表名; - 添加一列
alter table 表名 add 列名 数据类型; - 修改数据类型
alter table 表名 modify 列名 新数据类型; - 修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型; - 删除列
alter table 表名 drop 列名;
4、删除表
- 删除表
drop table 表名; - 删除表时判断是否存在
drop table if exists 表名;
1.2 DML 数据操作语言
添加数据
- 给指定列添加数据
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,…)…;
修改数据
- 修改表数据
update 表名 set 列名1=值1,列名2=值2,…,[where 条件];
注意:如果修改语句中不加条件,则将所有数据都修改!
删除数据
- 删除数据
delete from 表名 [where 条件];
注意:删除语句中如果不加条件,则将所有数据都删除
1.3 DQL 数据查询语言(最重要)
1、基础查询
- 查询多个字段
select 字段列表 from 表名;
mysql> select name,age from stu;
select * from 表名; 查询所有数据 - 去除重复记录
select distinct 字段列表 from 表名;
mysql> select distinct address from stu; - 起别名
as:as 也可以省略
mysql> select name,score as 数学成绩 from stu;
2、条件查询
- 条件查询语法
select 字段列表 from where 条件列表
mysql> select * from stu where age>20;
mysql> select * from stu where age>20 and age<50;
mysql> select * from stu where age between 20 and 50;
like模糊查询,通过某些字段进行查询,无需完整信息,_表示一个通配字符,%可以表示多个通配字符
查询姓马成员
mysql> select * from stu where name like ‘马%’;
查询第二个字是花的成员
mysql> select * from stu where name like ‘_花%’;
查询名字中包含云的成员
mysql> select * from stu where name like ‘%云%’;
3、排序查询
- select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2]…;
排序方式:
ASC:升序排序(默认值)
DESC:降序排序
注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序。
按照分数进行升序排序
mysql> select * from stu order by score asc;
按照年龄降序排序
mysql> select * from stu order by age desc;
先按照成绩排列,成绩一样则按照年龄降序排列
mysql> select * from stu order by score asc,age desc;
4、分组查询
聚合函数概念:将一列数据作为一个整体,进行纵向计算。
聚合函数分类:
- count(列名):统计数量
- max(列名):最大值
- min(列名):最小值
- sum(列名):列求和
- avg(列名):列平均值
聚合函数语法
select 聚合函数名(列名) from 表名;
注意:null值不参与所有聚合函数计算
统计学生数
mysql> select count(name) from stu;
查询最高分
mysql> select max(score) from stu;
查询总分
mysql> select sum(score) from stu;
查询最低分
mysql> select min(score) from stu;
查询平均分
mysql> select avg(score) from stu;
- 分组查询语法
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
where和having区别
执行时机不一样:where是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
可判断的条件不一样:where 不能对聚合函数进行判定,having可以。
执行顺序:where>聚合函数>having
操作实例:
查询男同学和女同学各自的数学平均分
mysql> select sex,avg(math) from stu group by sex;
查询男同学和女同学各自的数学平均分,以及各自人数
mysql> select sex,avg(math),count() from stu group by sex;
查询男同学和女同学各自的数学平均分,以及各自人数,分数低于70分的不参与分组
mysql> select sex,avg(math),count() from stu where math>70 group by sex;
查询男同学和女同学各自的数学平均分,以及各自人数,分数低于70分的不参与分组,分组之后的人数大于2
mysql> select sex,avg(math),count() from stu where math>70 group by sex having count()>2;
5、分页查询
- 分页查询语法
select 字段列表 from 表名 limit 起始索引,查询条数目;
起始索引:从0开始。
计算公式:起始索引=(当前页码-1)*每页显示的条数
- 分页查询limit是MySQL数据库特有的
- Oracle分页查询使用rownumber
- SQL server分页查询使用top
实例:
从0开始查询,查询3条数据
mysql> select * from stu limit 0,3;
每页显示3条数据,显示第一页
mysql> select * from stu limit 0,3;
每页显示3条数据,显示第二页
mysql> select * from stu limit 3,3;
1.4 DQL小结
- select
指定字段列表 - form
指定表名列表 - where
条件列表 - group by
完成分组字段 - having
完成分组之后条件限定 - order by
排序字段 - limit
分页限定