sql的基础应用和元数据的获取
1.SQL介绍
结构化的查询语言。关系型数据库中通用的一种命令,使用sql_mode规范sql语句的语法标准
2. SQL_mode,规范sql语句是确保数据有意义
mysql> select @@sql_mode;
ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
以上查询结果都是不符合语法规范
3.SQL的常用分类
DDL 数据定义语言
DCL 数据控制语言
DML 数据操作语言
DQL 数据查询语言
4. 字符集和校对规则介绍
字符集:常用utf编码三个字节定义一个汉字
utf8 : 最多允许字符长度为3字节
utfmb4 : 最多允许字符长度为4个字节
gbk :
mysql> show charset;
校对规则,排序规则
ABCD
mysql > show collation;
说明:字符集和校对规则可用作用与库与表级别的设定
5. 表的属性和列的属性介绍
表定义属性有:
存储引擎 : innoDB
字符集 &校对规则 utf8mb4
注释
列的定义属性
(1)数据类型 保证数据又意义
tinyint : 占用1Bytes=8bit长度 范围 -128~127 0- 255最多存储一个字节长度数字
int : 4Bytes, 0-2^32,-2^31~2^31-1,10位数
bigint : 8Bytes, 0-2^64,-2^63~2^63-1,20位数
(2) 字符串类型(万能)
char(64) 括号里定义最长的字符串长度,最大 允许255字节
varchar(64)最大允许65533字节长度
char与varchar区别
1. 定长 和 变长
2. 64代表了,最多可以存储字符的个数
3. 字节限制 255 , 65535字节
5. varchar 需要花费额外的1-2字节存储字符长 度
如何选择: 根据
1. 业务数据是定长还是变长,
2. 字符长度
大表: 数据类型选择会影响到查询的效率,同时选择 合适的数据类型也能节省磁盘
enum 类型格式为('山东省','河北省','北京市')
优点,查询速率快,省磁盘,但是不能用于变化的数据列
(3) 时间类型
datetime
timestamp
6.列属性的约束
not null 非空约束
unique key 唯一约束
primary key 主键约束非空且唯一,一张表只能有一个一般是 ID列,身份证列,学生证号。用于多个字段来定义唯一非空的列选此约束。
7.其他属性
auto_increment 自增长
default 默认值
comment 注释
8. SQL语句分类之DDL
主要作用于定义库表的属性。
8.1 对库的定义语言为增删改查
1. 增 create databases nbclass charset utf8mb4;
创库规范:
字符集必须设置
不要有大写字母 (开发容易不按规则创库)
不要有数字开头
库名需与业务有关,且不能太长
库名不能是关键字
2. 删 DROP database nbclass;只有root才有drop权限不要轻易使用。
3. 改 alter database nbclass charset utf8;及时生效主要修改的是库的字符集,
4. 查 show create database nbclass;
8.2 对表的定义 分为表属性和列属性
表属性:
1.存储引擎类型 innodb
2.字符集 &校对规则 /排序规则忽略大小写等
3.注释
列属性:
数据类型
约束
其他属性
增
use nbclass;
create table stumess(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(32) NOT NULL COMMENT '姓名',
age TINYINT NOT NULL DEFAULT 18 COMMENT '年龄',
sex ENUM('male','female','others') NOT NULL DEFAULT 'others' COMMENT '性别',
intime DATETIME NOT NULL DEFAULT NOW() COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';
建表规范牢记
1. 表名: 小写,业务相关,不能数字开头,不能太长, 不能是关键字.
2. 表属性: 字符集,存储引擎,注释
3. 列属性:
合适的数据类型(简短,合适的,完整的)
必须要有PK(id 自增长数字列).
每个列要非空,并设定默认值.
必须要有注释.
删
DROP TABLE xuesheng;
TRUNCATE TABLE xuesheng;
二者区别在于 前包联表结构和表行内容删除所有物理删除 后truncate 只删除表的段区页
改 修改前DSEC STU 来查看表结构方便修改
要求 在上表中**加入**一列数据手机号
alter table stu ADD shouji bigint not null comment '手机号'
-- 在name列后添加dizhi列
alter table stu ADD dizhi varchar(100) NOT null comment '地址' AFTER sname;
-- 在首列添加qq号列
ALTER TABLE stu ADD qq BIGINT NOT NULL UNIQUE COMMENT 'qq号' FIRST;
-- 删除列
ALTER TABLE stu DROP qq ;
ALTER TABLE stu DROP shouji;
alter table stu drop dizhi
修改表属性
alter table stu engine=innodb;
修改表名归档可用
alter table stu rename stumess;
-- 将sex列名改为gender,数据类型改为tinyint,加个注释(0代表nv,1代表男)
解第一步先 desc stu 查看表结构方便抄写未改动的列属性
alter table stu change sex gender tinyint not null default 1 comment '0nan,1nv'
查 show create table stumess;
9. SQL语句分类之DCL
主要用于
grant 授权
grant 权限 on 作用范围(库表)to 用户名@白名单 密码(identified by '123')
revoke 拿掉权限
revoke 权限 on 作用范围(库表)from 用户名@白名单
10. SQL语句分类之DML
DML 数据操作语言主要对表中数据行的操作
10.1 insert 数据插入行
多行录入录入数据前 desc +表名;查看表结构
inter into stumess(id,sname,age,gender,intime)
values(1,'zhangsan','18',1,11-11),(1,'lisi','18',1,11-12),..
简单写法,省略输入表结构默认按照原先表结构排列
inter into stumess
values(1,'zhangsan','18',1,11-11)
指定列输入:insert into stumess(id age);
10.2 delete 数据行删除
delete from stumess where id=5
注意:delete属于逻辑删除,磁盘空间不会立即释放大量使用delete会产生逻辑碎片。区别与truncate物理删除很快
10.3 update 数据修改
update stumess set age=28 where id=5
伪删除:用update实现伪删除将想要伪装的数据加一列 注释
11. SQL语句分类之DQL
最重要的sql查询语言
11.1 单独使用查询语言
- select &&datadir;
show variables like '%trx%' 模糊查询关键字 - 简易计算 select 5*5
- 函数查询 select now()查询当前时间
11.2 配合多子句
11.2.1 from
是必须项
select name,popu from city; 从city表中取出某列
11.2.2 where
可理解为判断条件
select * from city where population<1000000; <> 为不等于意思
where配合like语句使用
查询国家代号是CH开头的城市信息.
SELECT * FROM city
WHERE countrycode LIKE 'CH%';
**注意:** LIKE 语句 百分号不要出现在查询条件 前,因为查询不走索引.
-- where 配合逻辑连接符(and or)
--- 1. 中国城市人口大于500w的城市
SELECT * FROM city
WHERE countrycode='CHN' AND population>5000000 ;
--- 2. 中国或者美国城市信息
SELECT * FROM city
WHERE countrycode='CHN' OR countrycode='USA';
-- where 配合 in
--- 中国或者美国城市信息
SELECT * FROM city
WHERE countrycode IN ('CHN','USA');
-- where 配合 between and
--- 查询 人口数量在100w-200w之间的城市
SELECT * FROM city
WHERE population >= 1000000 AND population <= 2000000;
SELECT * FROM city
WHERE population BETWEEN 1000000 AND 2000000;
11.2.3 group by (分组) +聚合函数
聚合函数
MAX() 最大值
MIN() 最小值
AVG() 平均值
COUNT() 数量
SUM() 求和
GROUP_CONCAT() 列转行
说明,有group by子句,必然会有聚合函数
在业务查询中,需要对于表中数据按照数据特点进行分别统计是用group by 加 聚合函数实现。
重点 group by 执行原理: 先执行group by后面所按需求选择的列拿出来进行去重,排序。在返回到select后的条件进行函数计算,并将结果显示到屏幕。
例
--- 1. 统计世界的所有人口总和
SELECT SUM(population) FROM city ;
--- 2. 统计国家的总人口数量
SELECT countrycode, SUM(population) FROM city
GROUP BY countrycode ;
--- 3. 统计中国每个省的总人口数
SELECT countrycode,district , SUM(population)
FROM city
GROUP BY district;
--- 5. 统计中国每个省的城市名列表.
SELECT district,GROUP_CONCAT(NAME)
FROM city
WHERE countrycode='CHN'
GROUP BY district;
--- 6. 关于 GROUP BY 的限制
RROR 1055 (42000): Expression
-- #1 of SELECT list is not in GROUP BY clause and contains nonaggregated
-- column 'world.city.CountryCode' which is not functionally dependent
-- on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
--- sql_mode=only_full_group_by
1. 在 SELECT 后的条件,不在 GROUP BY 后
2. 在 SELECT 后的条件,不在函数里包裹
3. 如果select后列是唯一值时候,就不会报错
5. GROUP BY 的条件列是主键或者唯一键时.
总结: sql_mode=only_full_group_by 为了防止出现结果集1对多的关系.
11.2.4 having
后过滤 在....之后统计
--- 统计中国每个省的总人口数,只显示总人口大 于500w
SELECT district , SUM(population)
FROM city
WHERE countrycode='CHN'
GROUP BY district
HAVING SUM(population)>5000000;
11.2.5 order by 对结果进行排序
--- 查询中国所有的城市信息,并按照人口数排序 输出结果
SELECT * FROM city
WHERE countrycode='CHN'
ORDER BY population DESC ;
--- 统计中国每个省的总人口数,只显示总人口大 于500w,并按照总人口降序输出
SELECT district , SUM(population)
FROM city
WHERE countrycode='CHN'
GROUP BY district
HAVING SUM(population)>5000000
ORDER BY SUM(population) DESC ; 倒序
11.2.6 limit限制
取中国人口超100万的前五个省。
select distrit from city where countrycode='CHN' group by distrit having >1000000
order by populatiom limit 5;