一、SQL语句分类
1.DDL:数据库或表的结构操作
2.DML:对表的记录进行更新(增,删,改)
3.DQL:对表的记录的查询
4.DCL:对用户的创建及授权
二、DDL(数据库或表的结构操作)
1.数据库操作
(1)创建数据库
.创建数据库的语法
* 基本的语法:create database 数据库名称;
* 正宗的语法:create database 数据库名称 character set 编码 collate 校对规则;
.校对规则(了解):决定当前数据库的属性。
* utf8默认校对规则是utf8_general_ci
创建一个名称为mydb1的数据库。
* create database mydb1;
创建一个使用utf8字符集的mydb2数据库。
* create database mydb2 character set 'utf8';
创建一个使用utf8字符集,并带校对规则的mydb3数据库。
* create database mydb3 character set 'utf8' collate 'utf8_bin';
(2)查看数据库
. show databases; -- 查看所有的数据库
. use 数据库名称; -- 使用数据库
. show create database 数据库名称; -- 查询数据库的创建的信息
. select database(); -- 查询当前正在使用的数据库
(3)删除数据库
. drop database 数据库名称; -- 删除数据库
(4)修改数据库
. alter database 数据库名称 character set 'utf8' collate '校对规则';
2.数据类型
这里有一篇很详细的介绍了数据库类型的博文:https://www.cnblogs.com/whgk/p/6142780.html
(1)字符串型
VARCHAR :长度是可变的 例子:name varchar(8) ,存入数据hello,存入进去之后,name字段长度自动变成了5。
CHAR :长度是不可变的。 例子:name char(8) 存入数据hello,用空格来补全剩余的位置。
注意:
- 常用VARCHAR。
- CHAR 是固定长度的,所以处理速度比VARCHAR快的多,但是浪费空间。所以设计数据表的时候注意选择。
(2)大数据型
BLOB :字节(电影 mp3)
TEXT :字符(文本的内容)
注意:
- 并不常用该数据类型。
- 针对此类问题建议去了解 “数据库+文件系统” 这个概念。
(3)数值型
整数类型: TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
浮点数类型: FLOAT、DOUBLE
定点小数: DECIMAL
注意: - 这部分详细了解的话参考博客. https://www.cnblogs.com/whgk/p/6142780.html
(4)逻辑型
BIT 在Java中是true或者false,在数据库bit类型(1或者0)
(5)日期型
YEAR :只包含年份 (YYYY)
DATE :只包含日期(YYYY-MM-DD)
TIME :只包含时间(HH:MM:SS)
DATETIME :包含日期和时间(YYYY-MM-DD HH:MM:SS)。如果插入数据的时候,字符值为空,字段的值就是空了。
TIMESTAMP :包含日期和时间(YYYY-MM-DD HH:MM:SS)。如果插入数据的时候,设置字段的值为空,默认获取当前的系统的时候,把时间保存到字段中。
3.表结构操作(CURD)
(1)创建表
.语法:
create table 表名称(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束
);
.AUTO_INCREMENT:设置自增,但是只适用于INT字段。MYSQL表中只能有一个AUTO_INCREMENT字段,而且这个字段必须被定义为键。
.DEFAULT:为字段设定一个默认值。当插入记录时,没有传该字段的的值,MySQL会自动设置该字段默认值。
* name varchar(25) not null default 'QQ'
.注意:
* 创建表的时候,后面用小括号,后面分号。
* 编写字段,字段与字段之间使用逗号,最后一个子段不能使用逗号。
* 如果声明字符串数据的类型,长度是必须指定的。
* 如果不指定数据的长度,有默认值的。int类型的默认长度是11
(2)删除和查看表
.删除表语法:drop table 表名;
.查看标签
* desc 表名; -- 查询表的信息
* show tables; -- 查看当前数据库中所有的标签
* show create table 表名; -- 查看表的创建的信息
(3)修改表
.语法
* alter table 表名 add 新列名 类型(长度) 约束; -- 添加列
* alter table 表名 drop 列名; -- 删除列
* alter table 表名 modify 列名 类型(长度) 约束; -- 修改列的类型或者约束
* alter table 表名 drop index 列名; -- 删除unique约束。
* alter table 表名 add constraint 列名 约束; -- 给属性添加元素
* alter table 表名 change 旧列名 新列名 类型(长度) 约束; -- 修改列名
* rename table 表名 to 新表名; -- 修改表的名称
* alter table 表名 character set utf8; -- 修改表的字符集
4.约束
(1)约束是表中数据的限制条件,是为了保证表中记录的完整和有效。
(2)约束的种类
. not null -- 非空约束 name varchar(10) not null
. unique -- 唯一性约束 email varchar(64) unique
. primary key -- 主键约束 id int(4) primary key
* 自增长 auto_increment -- 可以帮助维护主键信息
. foreign key -- 外键约束
(3)关于约束的详细介绍请看博客:https://blog.csdn.net/w_linux/article/details/79655073
https://blog.csdn.net/apt1203jn/article/details/80314605#commentBox
三、DML(对表的记录进行更新(增,删,改))
1.MySQL插入插入中文数据乱码
.先把MySQL服务停止。
.找到MySQL安装文件的my.ini的配置文件
[client]
port=3306
[mysql]
default-character-set=gbk
.重启MySQL服务
2.插入数据
* insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3);
* insert into 表名 values (值1,值2,值3);
.注意事项
* 插入的数据与字段类型必须是相同的。
* 数据的大小范围在字段范围内
* 值与字段一一对应
* 字符串或者日期类型数据需要使用单引号
3.修改数据
.语法:update 表名 set 字段1=值,字段2=值 where 条件; where username = 'zcm';
.如果没有where条件语句,默认更新所有的数据。
.如果有where条件,默认更新符合条件的记录。
4.删除数据
.语法:delete from 表名 where 条件;
.如果没有where条件,默认删除所有的数据。
.truncate 表名:删除表中所有的数据。
delete from 表名: 也可以删除所有数据。
* 区别: truncate先把你整个表删除掉,默默创建一个空的表(和原来的表结构是一样的)。
* delete from 表名 一行一行的删除。(使用它)
* 事物的概念:事物提交和事物回滚。
四、DQL(查询数据)
1.查询数据
.语法
* select * from 表名; -- 查询所有列的记录
* select 字段1,字段2,字段3 from 表名; -- 查询字段123的记录
* DISTINCT -- 去除重复的数据
select distinct english from stu;
2.查询语句中使用运算和别名
. 在所有学生分数上加10分特长分。
* select name,(math+10) m,(english+10) e,(chinese+10) c from stu;
. 统计每个学生的总分。
* select name,(math+english+chinese) 总分 from stu;
. 使用别名表示学生分数
* select name,(math+english+chinese) 别名 from stu;
3.使用where 条件过滤
.查询姓名为聪聪的学生成绩
* select name,math,chinese from stu where name = '聪聪';
.查询英语成绩大于90分的同学
* select name,english from stu where english > 20;
.查询总分大于200分的所有同学
* select name,math+english+chinese from stu where (math+english+chinese) > 200;
4.where 子句中处出现的运算
. > < <= >= = <> 大于、小于、大于(小于)等于、不等于
. in 表示范围。
* select * from stu where math = 18; 查询出一条数据
* select * from stu where math in (78,18,99);
. like 模糊查询 -- 符合模糊的条件
* select * from stu where name like '张_'; 姓张的名称(只有两个)的记录
* select * from stu where name like '张%'; 姓张的名称(张飞 张翼德)的记录。
* select * from stu where name like '%张'; 末尾是张(聪聪张 XSDF张)
* select * from stu where name like '%张%'; 只要名称中包含张。
.is null 判断某一个字段记录是否为空
.and与 or或者 not非
* select * from stu where math > 80 or chinese > 80;
5.order by 对查询的结果进行排序
.排序的语法
* select * from 表名 where 条件 order by 列名 升序/降序;
.升序和降序
* order by 列名 asc;(升序,默认值)
* order by 列名 desc;(降序)
.order by 子句必须出现在select语句的末尾。
6. 聚集函数
.聚集函数:总计某一列数据总和。一列的个数。一列的平均数。一列中最大值和最小值。
.聚集函数来操作列的。
.聚集函数
* count -- 计数
* sum -- 求和
* ifnull 判断是否为空:语法:ifnul(xxx,0) 如果xxx为null,替换成0
* avg -- 平均值
* max -- 最大值
* min -- 最小值
.eg:
* 统计一个班级数学总成绩
select sum(math) from stu;
* 统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(english),sum(chinese) from stu;
* 统计一个班级语文、英语、数学的成绩总和
select sum(ifnull(math,0)+english+chinese) from stu;
select sum(math) + sum(english) + sum(chinese) from stu;
* 求班级英语最高分和最低分
select max(english) from stu;
select min(english) from stu;
7.分组(**)
.使用group by 字段 进行分组的。
select product,sum(price),count(*) from orders group by product;
select product from orders group by product having sum(price) > 100;
.注意:
Having和where均可实现过滤,但在having可以使用聚集函数,where不能使用聚集函数,having通常跟在group by后,它作用于分组
8.总结
select ... from ... where ... group by ... having ... order by ...
* 固定的顺序:如果没有上述的条件,把关键字去掉就ok。
后续知识点请访问:JavaWeb基础篇(七)--MySQL基础(二)