基础1
1.sql语句
1. 语言分类
数据定义语言:简称DDL,用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
数据操作语言:简称DML,用来对数据库中表的记录进行操作。关键字:insert,delete,update等
数据查询语言:简称DQL,用来查询数据库中表的记录。关键字:select,from,where等
数据控制语言:简称DCL,用来定义数据库的访问权限和安全级别,及创建用户。
2. sql语句的通用语法
1.SQL语句可以单行或多行书写,以分号结尾
2.可使用空格和缩进来增强语句的可读性:基本上一个单词就一个空格
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
例如:SELECT * FROM user。
4.- 同样可以使用/**/的方式完成注释 #
/ *我是一个注释 */ #我也是一个注释 -- 我也是一个注释
3. sql中的数据类型
int(整数长度): 整数类型 double: 小数类型 decimal(m,d): 指定整数位与小数位长度的小数类型
date: 日期类型, 格式为yyyy-MM-dd,包含年月日,不包含时分秒 2020-01-01
datetime: 日期类型,格式为 YYYY-MM-DD HH:MM:SS,包含年月日时分秒 到9999年
timestamp: 日期类型,时间戳 从1970年到2038年
varchar(字符串长度): 文本类型, M为0~65535之间的整数
2.mysql中语句
1. DDL之数据库操作:database
1.创建数据库: create database 数据库名字 charset utf8
2.查看数据库: show database /show databases
2.删除数据库: 1.关键字:drop 2.语法:drop database 数据库名字
3.使用数据库: use 数据库名;
2. DDL之表操作: table
1.创建表: 关键字:create table
语法:
create table 表名(
列名 数据类型(长度) [约束],
列名 数据类型(长度) [约束],
列名 数据类型(长度) [约束]
);
注意:a.如果定义完一个列之后,后面还有其他的列,需要加,
b.如果定义最后一个列了,就不用加,
c.一张表应该有一个主键(约束), primary key
当一列设置成主键了,此列中的数据唯一,不能重复
一个主键可以代表一条数据(好比是身份证)
2.删除表: 1.关键字:drop table 2.语法:drop table 表名
3.查看表: show tables 查看表结构: desc 表名
4.修改表结构: alter table 表名 add 列名 类型(长度) [约束]; 作用:添加列.
alter table 表名 modify 列名 类型(长度) [约束];
作用:修改列的类型,长度及约束.
alter table 表名 drop 列名; 作用:修改表_删除列.
rename table 表名 to 新表名; 作用:修改表名
3. DML之数据操作语言
1.插入数据:1.关键字:insert into values
2.语法: insert into 表名(列名,列名) values (具体的值,具体的值)
2.删除数据: 1.关键字:delete from
2.语法:delete from 表名-> 一次全删除
delete from 表名 where 条件-> 按照条件删除
3.修改数据: 1.关键字:update set
2.语法:update 表名 set 列名 = 值 -> 是将指定的列所有的数据全部修改
update 表名 set 列名 = 值 where 条件 -> 根据条件修改数据
3.约束
1. 主键约束:
1. 主键约束:primary key
1.主键列中的数据有什么特点:
a.数据唯一,不能重复 b.不能为NULL c.一个主键相当于一个人的身份证,代表一整条数据
2.注意:每张表中都应该有一个主键列,代表一条数据
添加方式1:在创建表时,在字段后面直接指定(重点)
添加方式2:在constraint约束区域,去指定主键约束 (添加表语句的最后一行)
添加方式3:通过修改表结构的方式 :
1.格式:ALTER TABLE 表名 ADD PRIMARY KEY (字段列表)
2. 联合主键: 1.什么是联合主键:多个列结合称之为是一个主键
2.特点:数据不能完全一样,不能为NULL
3.格式: PRIMARY KEY (xing,ming) (主键的第二种添加方式)
3. 删除主键约束: ALTER TABLE 表名 DROP PRIMARY KEY->删除主键约束
4. 自增长约束
1. 基本操作: 字段名 字段类型 PRIMARY KEY AUTO_INCREMENT
1.关键字:auto_increment
2.使用:一般和primary key 一起使用
3.注意:a.主键能代表一条数据 b.自增长列,只能自动维护此列中的数据,可以自动编号,但是不能代表一条数据
4.想让主键自增长的类重新编号:TRUNCATE TABLE `user`; -- 删除所有数据,摧毁表结构
5.自增长和主键的删除顺序:先自后主
2. truncate和delete区别
相同点:都可以删除数据
不同点:
如果delete的是主键自增长的数据,那么删除之后,再添加会继续往下编号,不会重新编号
如果truncate,会将所有的数据干掉,摧毁表结构,主键自增长的列数据会重新编号
5. 非空约束
1.关键字: NOT NULL
2.特点: 此列的数据不能为NULL
6. 唯一约束
1.关键字:UNIQUE
2.特点: UNIQUE修饰的列中的数据不能重复
3.唯一约束和主键约束也是有区别的
相同点:列中的数据都是唯一的
不同点:唯一约束:不能代表一条数据,而且表中可以有多个列都是唯一约束
主键约束:能代表一条数据,而且一个表中必须有一个主键,只能有一个主键
4.简单查询
1. 关键字: select from where
语法: a.select * from 表名 -> 查询所有列的数据
b.select 列名,列名 from 表名-> 查询数据,指定只展示哪几列
c.select 列名,列名 from 表名 where 条件
3.注意: 我们查询出来的结果也是呈表格的形式展现,但是查询出来的表是一张伪表,这个表不能修改的,是只读的
4.起别名:列名 as 别名(as可省略) 格式:飘飘或者啥也不加
2. 条件查询
比较运算符< <= >= = <> 大于、小于、大于(小于)等于、不等于
BETWEEN ...AND... 显示在某一区间的值(含头含尾)
字段 IN(set) 显示在in列表中的值,例:in(100,200) 查询id为1,3,7的商品: id in(1,3,7)
列名 LIKE ‘张pattern’ 模糊查询,Like语句中,% 代表零个或多个任意字符,_ 代表一个字符, 例如:`first_name like '_a%';` 比如:查询姓张的人:name like '张%' 查询商品名中带香的商品: pname like '%香%' 查询第二个字为想的商品: like '_想%' 查询商品名为四个字的商品:like ''
IS NULL 判断是否为空
逻辑运行符 and (与) 多个条件同时成立 全为true,整体才为true
or(或) 多个条件任一成立 有真则真
not(非) 不成立,例:`where not(salary>100);`
3. 排序查询
1.关键字: order by 排序规则
asc:升序 order by后面没写默认是升序
desc:降序
2.问题:先排序还是先查询? 先走查询,得到结果之后再排序
3.注意: order by最后写,也最后执行
4.语法:select 列名 from 表名 order by 排序字段 asc|desc-> 查询之后要指明对哪一列进行排序
书写sql语句关键字的顺序: select from where group by having order by
执行顺序: from where group by having select order by
基础2
1.聚合查询
1. 关键字:聚合函数
count(列名):统计表中有多少条数据
sum(列名):对指定列求和
avg(列名):对指定列做平均值
max(列名):求指定列中的最大值
min(列名):求指定列中的最小值
语法: select 聚合函数(列名) from 表名 [where 条件]
注意:纵向查询,结果是单值
2. 分组查询(大致可以理解为去重复)
1.关键字: group by 列名
2.语法:select 列名,列名... from 表名 group by 分组字段 having 分组后的条件
3.分组小技巧: 相同的为一组 不同的单独为一组
4.注意:分组查询都是和聚合函数结合使用
3. 分页查询
1.语法: select * from 表名 limit (m,n)
m:每页的起始位置 -> 表中的第一条数据看做是0位置
n:每页显示条数
2.如何快速计算每页的起始位置
(当前页-1)*每页显示条数
3.分页其他参数计算
后台计算出页码、页数(页大小)
分页需要的相关数据结果分析如下,
注意:下面是伪代码不用于执行
int curPage = 2; -- 当前页数
int pageSize = 5; -- 每页显示数量
int startRow = (curPage - 1) * pageSize; -- 当前页, 记录开始的位置(行数)计算
int totalSize = select count(*) from products; -- 记录总数量
int totalPage = Math.ceil(totalSize * 1.0 / pageSize); -- 总页数
总页数 = (总记录数/每页显示条数)向上取整
2. 数据库的备份与还原
1. 命令操作备份
mysqldump -u用户名 -p密码 数据库名>生成的脚本文件路径
生成的脚本文件路径:指定备份的路径,写路径时最后要指明备份的sql文件名,命令后不要加;
2. 命令操作还原
mysql -uroot -p密码 数据库名 < 文件路径
注意:我们利用命令备份出来的sql文件中没有单独创建数据库的语句,所以如果利用命令去还原的话,需要我们自己手动先创建对应的库命令后不要加;
3.数据库范式
1. 第一范式: 确保每列保持原子性 (数据库表中的所有字段值都是不可分解的原子值)
2. 第二范式: 要求数据库表中的每个实例或行必须可以被惟一的区分
3. 第三范式: 非主键之间不能相互依赖
4.多表之间的关系
1. 一对一: 比如人和身份证号
2. 一对多: 分类表和商品表
主表:分类表 -> 主表中的数据约束着商品表 从表:商品表
关系:从分类表出发,往商品表看 -> 一个分类对应多个商品 -> 一对多
从商品往分类表看 -> 多个商品属于一个分类 -> 多对一
结论:从主表往从表看是一对多,反过来是多对一,结果就是一对多关系
3. 多对多: 商品表和订单表
从商品表往订单表看:一个商品可以在多个订单中 -> 一对多
从订单表往商品表看:一个订到中可以包含多个商品 -> 一对多
正着看,反着看都是一对多,结果就是多对多
5.创建外键约束
1. 格式:alter table 从表 add [constraint 外键名称(自定义)] foreign key 从表(外键列名) references 主表(主键列名)
6.多表查询
1. 交叉查询 语法: select * from 表A,表B
注意: 交叉查询查询的结果是有"笛卡尔乘积"现象
2. 内连接查询
1.关键字:inner join on -> inner可以省略
2.语法:
显示内连接:select * from 表名A join 表B on 条件
隐式内连接:select 列名 from 表A,表B where 条件
3. 外连接
1.关键字: outer join on -> outer可以省略
2.分类:
左外连接:left join on
右外连接:right join on
3.语法:
select * from 左表 left/right join 右表 on 条件
4.如何分清谁是左表,谁是右表
join左边的是左表
join右表的是右表
5.左外连接,右外连接,内连接区别:
a.左外连接:查询的是和右表的交集,以及左表的全部
b.右外连接:查询的是和左表的交集,以及右表的全部
c.内连接:只查询交集
4. union联合查询实现全外连接查询
联合查询是将多条查询语句的查询结果合并成一个结果并去掉重复数据。
union的语法:
查询语句1 union 查询语句2 union 查询语句3 ...
5. 子查询: 一条查询语句作为另外一条查询语句的条件使用
6. 子查询作为伪表使用: 1.查询出来的结果是以表的形式呈现,这个表是只读权限,这个查询出来的表就是一张伪表
7.mysql函数(了解)
1. 字符串函数
1 .字符串函数列表概览
CONCAT(S1,S2,......,Sn) 连接S1,S2,......,Sn为一个字符串
CONCAT_WS(separator, S1,S2,......,Sn) 连接S1一直到Sn,并且中间以separator作为分隔符
UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母
LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母
TRIM(s) 去掉字符串s开始与结尾的空格
SUBSTRING(s,index,len) 返回从字符串s的index位置其len个字符
2.字符串连接函数
concat(str1, str2, ...) 字符串连接函数,可以将多个字符串进行连接
concat_ws(separator, str1, str2, ...) 可以指定间隔符将多个字符串进行连接;
3.字符串大小写处理函数
upper(str) 得到str的大写形式
lower(str) 得到str的小写形式
4.移除空格函数: trim(str) 将str两边的空白符移除
更多推荐
MySQL基础(适合新手入门)
发布评论