文章目录
零.基本知识
1.什么是SQL
- SQL:操作数据库的一门语言
2.SQL的一些特点:
书写:
- 可以多行书写,以分号(; )结尾
- 不区分大小写,虽然语法大小写都可以,但是建议用大写
注释:
- 单行注释:
- _ :_+空格+注释类容 【这里一定要加空格,不然要报错】
- #: # +注释类容
- 多行注释:/* …*/
3.SQL的分类【以下详解】
- DDL:用来定义数据库对象,操控数据库和表
- DML:用来增删改表中的数据
- DQL:用该查询表中的数据
- DCL:用来访问授权
4. 数据库的数据类型
-
int:整数类型
例如:age int; -
double:小数类型
例如:score double(5,2) #最大长度为5,保留小数点后两位 -
data:日期,只有年月日。yyyy-MM-dd
-
datatime:日期,年月日时分秒。yyyy–MM-dd HH:mm:ss
-
timestamp:时间戳类型,yyyy–MM-dd HH:mm:ss
- 这个注意:如果不给这个字段赋值,或者赋值为null,默认使用当前系统时间给他赋值
-
varchar:字符串
例如:name varchar(20) #最大为20字符
一.DDL:操控数据库和表
1.数据库操作
创建
-
创建数据库:
create database 数据库名称; -
创建数据库,判断不存在,再创建
create database if not exists 数据库名称 -
创建数据库,并且制定字符集(默认utf8)
create database 数据库名称 character set 字符集名 -
宗和练习,创建mydata2数据库,并且判断是否存在,然后制定字符集为gbk
查询
- 查询所有数据库名称
show database - 查询某个数据库的字符集,查询某个数据库的创建语句
show create database 数据库名称
修改
- 修改数据库的字符集
alter database 数据库名称 character set 字符集名
删除
- 删除数据库
drop database 数据库名称【危险:删库跑路】 - 先判断有没有,再删除
drop database if exists 数据库名称
使用数据库
- 查询当前正在使用的数据库
select database(); - 使用数据库
use 数据库名称
2.表操作
创建
-
语法:
create table 表名称(
列名1 数据类型1,
列名2 数据类型2,
…
列名n 数据类型n
);
注意最后一行不要逗号(,) -
练习:创建学生信息表
复制
- 例如:create table stu like students;
- 含义把students的内容复制给stu
查询
- 查询某个数据库中所有表名称
show tables - 查询表结构
desc 表名称
修改
- 修改表名
alter table 表名 rename to 新表名 - 修改表的字符集
alter table 表名 character set 字符集名称 - 添加一列
alter table 表名 add 列名 数据类型 - 修改列名称,类型
alter table 表名 change 列名 新列名 新数据类型【改名称和类型】
alter table 表名 modify 列名 新数据类型【只改类型】 - 删除列
alter table 表名 drop 列名
删除
- 直接删除
drop table 表名 - 最好先判断再删除
drop table if exists 表名;
二.DML:操作表数据
1.添加数据
- 语法:
insert into 表名(列名1,列名2…) values(值1,值2…) - 注意:
- 1.在添加字符串和日期类型的时候【除了数字类型其他的都要】,要用引号括起来(单双都可以)
- 2.如果表名后不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2…) 【必须都添加,不知道的就写null】
- 练习:添加2个学生进去
** 特别注意:这里可能会出现中文字符无法写入报错的问题,原因是mysql的默认字符集没有设置为utf8- 处理方法文章
https://blog.csdn.net/u012004128/article/details/79911869
2.删除数据
- 语法:
delete from 表名 where 条件; 【表示把满足where条件的列删除】 - 例如:
delete table students where age=18;【把满足age=18的列删除】 - 注意:
倘若不写where的类容,那么会直接把表中的所有数据删除【但是这样会执行很多次delete语句,不高效】
使用:truncate table 表名;【删除表,然后创建一个一模一样的空表】
3.修改数据
- 语法:
update 表名 set 列名1=值1,列名2=值2,… where 条件;【把瞒住where条件的列,用前面的替代方式替代】 - 注意:
如果不添加where条件,就认为修改表中全部数据 - 例如:
update students set age=90 where name=‘张三’;
三.DQL:访问表数据
1.基础查询
- 1.多个字段查询
select 字段名1,字段名2,字段名3… from 表名;
注意:
如果查询所有字段,则可以使用来代替字段列表 - 2.去除重复
distinct - 3.计算列
- 一般可以使用四则运算计算一些列的值(一般只会进行数值型计算)
- ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
- 表达式1:判断这个是否为null
- 表达式2:如果1是null,则被替换为2
- 4.起别名:
as:也可以省略
2.条件查询
-
1.where字句后跟的条件
-
2.运算符
>、<、<=…<>【不等于,和!=相同】
between…and…【在这个闭区间内】
in(元素1,元素2…)【在in里面的集合内查找】
like- 模糊查询,占位符
_:单个任意字符
%:多个任意字符
is null
and 、 &&
or 、 ||
not 、 ! - 模糊查询,占位符
3.排序查询
- 语法:order by 字句
order by 排序字段1 排序方式1,排序字段2 排序方式2.....
- 排序方式:
asc:升序,默认的
desc:降序 - 注意:
如果有多个排序条件,则当前边的条件一样时,才会判断第二条件
4.聚合函数
- 1.count:计算个数
- 一般选择非空的列:主键
- count(*):计算有多少列【只要有一项不为null就算】
- 例如:
select count(*) from Student
- 2.max:计算最大值
- 3.min:计算最小值
- 4.sum:计算和
- 5.avg:计算平均值
- 注意:
集合函数的计算,排除了null值
解决方案- 选择不包含非空的列计算
- IFNULL函数
例如:
select count(ifnull(score,0)) from studens;【表示冲students表中获取所有分数的和】
5.分组查询
-
语法:
group by 分组字段; -
注意:
1.分组之后查询的字段:分组字段、聚合函数【不要其他的】2.where和having的区别?
-
where在分组之前进行限定,如果不满住条件,则不参与分组。having在分组之后进行限定,如果不满住,则不被1查询出来
-
where后不可以跟聚合函数,having可以进行聚合函数的判断
-
6.分页查询
-
语法:
limit 开始的索引位置,每页可查询的条数 -
公式:
开始的索引=(当前的页码-1)*每页可显示数 -
注意:
分页是一个”方言“【只有mysql能用limit语句,其他数据库有其他语句】