第三章 - SQL基础及元数据获取
SQL的介绍
SQL的定义:结构化查询语句
SQL的作用:对库和表进行操作
SQL的常用分类
- DDL 数据定义语言(Data Definition Language)
 - DCL 数据控制语言(Data Control Language)
 - DML 数据操作语言(Data Manipulation Language )
 - DQL 数据查询语言(Data Query Language)
 
表的核心属性介绍
列的属性
数据类型
## 数值类型
  - tinyint  极小整数数据类型(0-255)
  - INT      常规大小的整数数据类型
## 字符类型
  - CHAR 	  固定长度字符串、最多为255个字符
  - VARCHAR   可变长度字符串、最多为65535个字符
  - ENUM      有一个固定的合法值组成的枚举(相当组成个选项列表)
- 时间类型
  - DATETIME	范围从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
  - TIMESTAMP   范围从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
             	注意:TIMESAMP会受到时区的影响
## 二进制类型
   一般不使用(MYSQL不适合存储图片,视频等)
   neo4J 专门用来做图片视频的存储
约束((一般建表时添加))
primary key  #主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
not null	 #非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
unique key	 #唯一键
列值不能重复
其他属性
unsigned   #无符号
针对数字列,非负数。
key   #索引
可以在某列上建立索引,来优化查询,一般是根据需要后添加
default	#默认值
列中,没有录入值时,会自动使用default的值填充
auto_increment	#自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
comment	#注释
表的属性
存储引擎
默认存储引擎:INNoDB
字符集
GBK       //一个中文字符占用2个字节
UTF8	  //一个中文字符占用3个字节
utf8mb4   //一个中文字符占用4个字节长度  
UTF8与UTF8MB4区别:
UTF8MB4支持emoji  支持音标
校对规则(collation)
校对规则是跟着字符集走的.
例如: utf8mb4
utf8mb4_general_ci     --> 通用的校对,默认值,大小写不区分(默认规则)
utf8mb4_bin			  --> 大小写区分
-- 查看字符集校对规则
show collation;
-- 修改字符集校对规则
alter database world charset utf8mb4 collate utf8mb4_bin;
SQL基础操作-DDL
库的定义
建库
create database school;
create schema sch;
CREATE DATABASE test CHARSET utf8;
create database xyz charset utf8mb4 collate utf8mb4_bin;
--
建库规范:
	库名使用小写
	库名不能是数字开头
	库名要和业务有关
	建库时要添加字符集
--
删库
drop database test;
改库
alter database test charset utf8mb4;
查库
show databases;		//查看所有库
show create database test;	//查看单个库
表定义
建表
-- 建表格式:
create table  表名(
列名1  数据类型  约束  其他属性,
列名2  数据类型  约束  其他属性,
列名n  数据类型  约束  其他属性,
)engine=innodb charset=utf8mb4;
USE school;
CREATE TABLE stu(
id      INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname   VARCHAR(255) NOT NULL COMMENT '姓名',
sage    TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
sgender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
sfz     CHAR(18) NOT NULL UNIQUE  COMMENT '身份证',
intime  TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间'
) ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';
 #DEFAULT NOW()  当前时间的意思
 #ENGINE 指定使用的表结构   
建表规范:
1.表名小写,无数字开头,与业务有关
2.必须要有主键,一般是一个自增长的无关列
3.选择合适的数据类型,字符长度要适中
4.每个列都非空,并设置默认值
5.每个列必须要有注释
6.必须设置存储引擎和字符集
删表
-- 表定义和数据全部删除
drop table stu;
-- 清空表的区,数据清空,表定义保留
truncate table stu;
改表
-- 在表中插入一列(默认最后列)
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT 'qq号';  //在stu表中添加qq列
-- 在指定列后插入一列--AFTER
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname; //在sname后添加wechat列(after)
-- 在第一列前插入一列-- FIRST
ALTER TABLE stu ADD num INT NOT NULL COMMENT '数字' FIRST;
-- 删除列
ALTER TABLE stu DROP wechat;
-- 修改列的数据类型的属性 -- MODIFY
ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL;
-- 修改列名称(数据类型需要指定) -- CHANGE
ALTER TABLE stu CHANGE sgender sg CHAR(1) NOT NULL DEFAULT 'n' ;
查表
-- 查看表结构
desc xs;
-- 查看单张表
show create table xs;
-- 查看当前库中所有表
show tables;
复制表结构
CREATE TABLE ceshi LIKE stu;  //将stu表结构复制到ceshi
SQL基础操作-DCL
权限回收
-- revoke 权限 on 范围  from 用户;
revoke delete on zhihu.* from zhihu@'10.0.0.%';
用户授权
-- grant 权限 	no 对象	to 用户
grant all on *.* to admin@'10.0.0.%' identified by '123456';
grant all on *.* to admin1@'10.0.0.%' identified by '123456' with grant option;
//with grant option:超级管理员才具备的,给别的用户授权的功能
SQL基础操作-DML
插入表数据 -- INSERT
USE school //进入指定库
-- 插入一条数据-最简单写法
INSERT INTO student VALUES(1,'oldguo','22654481',18);
-- 插入一条数据(标准) //推荐
INSERT INTO student(sno,sname,sage,ssex)
VALUES (2,'zhang3',18,'m');
-- 插入多条数据 //推荐
INSERT INTO student(sno,sname,sage,ssex)
VALUES
(3,'zhang4',18,'m'),
(4,'li4',18,'m'),
(5,'wang5',19,'f');
-- 针对性录入数据
INSERT INTO student(sname,sage,ssex)
VALUES ('zhang3',18,'m');
修改表数据 - UPDATE
-- 语法格式
UPDATE 表名 SET 列名='值'  where 列名='值' AND 列名='值'  //UPDATE一定要加where条件,多个条件加AND
-- 将student表中名字li4为zhang1
update student set sname='zhang1' where sno=3;
-- 将1号学员的1001课程分数修改为89
update sc  set score=89 where sno=1 and cno=1001;
删除表数据 -- DELETE
-- 删除1号学员的所有成绩信息(sno为1)
delete from sc_bak where sno=1;
使用update代替delete -- 伪删除
1.额外添加一个状态列
alter table student add status enum(1,0) default 1;
2.使用update
update student set status='0' where sid=1;
3.应用查询存在的数据(业务语句查询语句进行调整)
select * from student where status=1;
SQL基础应用 - DQL
SELECT 语句应用
SELECT (单表)的执行逻辑
select 列1,列2
from
where
group
having
order by
limit
SELECT 单独使用的情况(MySQL独家)
-- SELEECT @@参数
SELECT @@datadir;
SELECT @@port;
SELECT @@socket;
SELECT @@innodb_flush_log_at_trx_commit;
SHOW VARIABLES LIKE 'innodb%';
-- select 函数()
SELECT NOW();
SELECT DATABASE();
SELECT USER();
SELECT 12*12;
SELECT CONCAT('HELLO  WORD');
SELECT CONCAT(USER,'@',HOST) FROM mysql.user;
SELECT GROUP_CONCAT(USER,'@',HOST) FROM mysql.user;
FROM 子句应用
以下操作使用world库,world说明

SELECT * FROM city;    //查看city的所有信息
SELECT NAME,countrycode FROM city;    //查看city的name和countrtcode列
where 子句应用
-- 等值查询
SELECT * FROM city WHERE CountryCode='CHN';     //查询中国所有城市的信息
-- 不等值查询 (>,<,<=,>=,<>)
SELECT * FROM city WHERE Population<100;        //查询人口数据小于100人的城市
SELECT * FROM city WHERE countrycode!='CHN';    //查询不是中国的城市(尽量不要使用,可能不走索引)
SELECT * FROM city WHERE countrycode<>'CHN';    //查询不是中国的城市(尽量不要使用,可能不走索引)
-- 模糊查询
SELECT * FROM city WHERE CountryCode LIKE 'CH%';    //查询国家代号为CH开头的城市信息
-- 逻辑连接符(and,or)
SELECT * FROM city WHERE countrycode='CHN' AND Population>5000000;    //查询中国城市人口超过500W的城市信息
SELECT * FROM city WHERE district='shandong' OR District='hebei';     //查看山东省或河北的城市信息
-- 配合between and 使用
SELECT * FROM city WHERE Population BETWEEN 1000000 AND 2000000;    //查询人口数在100W-200W区间的城市信息(包含头尾,)
-- 配合 in 使用
SELECT * FROM city WHERE district IN ('shandong','hebei');    //查询山东省或河北的城市信息
-- 配合 not in 使用
SELECT * FROM city WHERE countrycode NOT IN ('CHN','USA');    //查询不是中国或美国的城市信息
group by + 常用聚合函数
作用
根据 by后面的条件进行分组,方便统计,by后面跟一个列或多个列
常用的聚合函数
COUNT()	 -- 计数
AVG()	 -- 平均值
SUM()	 -- 求和
MIN()	 -- 最小值
MAX()	 -- 最大值
group_concat()	-- 列转行
举个例子
-- 统计每个国家的城市个数
SELECT countrycode,COUNT(id) FROM city
GROUP BY countrycode;
-- 统计每个国家的总人口数
SELECT countrycode,SUM(Population) FROM city
GROUP BY countrycode;
-- 统计各个国家的城市名列表
SELECT countrycode ,GROUP_CONCAT(NAME)
FROM city
GROUP BY countrycode
having 子句使用
-- 统计中国,每个省的,城市个数,省总人口数
--  只显示人口总数大于800w的省
SELECT District,COUNT(NAME),SUM(Population) FROM city
WHERE countrycode='CHN'
GROUP BY District
HAVING SUM(Population)>8000000;
order by 子句
ORDER BY 语句用于对结果集进行排序。
默认升序,DESC 降序
-- 以上例子,将人口数进行排序输出
SELECT district, COUNT(NAME),SUM(population)
FROM  city
WHERE countrycode='CHN'
GROUP BY district
HAVING  SUM(population)>8000000
ORDER BY SUM(population) DESC ;
-- 查询中国所有城市信息,并以人口数降序输出
SELECT * FROM city WHERE countrycode='CHN'
ORDER BY population  DESC ;
limit 应用
-- 查询中国所有城市信息,并以人口数降序输出,只显示前五名
SELECT * FROM city WHERE countrycode='CHN'
ORDER BY population  DESC
LIMIT 5 ;
-- 跳过前N行,显示M行(N和M代表的是数字)
LIMIT M  offet N
LIMIT N,M
distinct -去重复
-- 查询所有的国家代号信息
SELECT  DISTINCT countrycode FROM city ;
union 与 union all
-- 中国或美国城市信息
SELECT * FROM city
WHERE countrycode IN ('CHN' ,'USA');
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'
说明:一般情况下,我们会将 IN 或者 OR 语句 改写成 UNION ALL,来提高性能
UNION     去重复
UNION ALL 不去重复
join 多表连接查询
多表连接查询通过表之间的关联字段,一次查询多表数据。
多表连接类型
- 内连接
 - 外连接
 - 全连接
 - 笛卡尔
 
内连接的类型
- 传统连接(where)
 - 自连接
 - join uing
 - join on
 
join on的语法
-- 两张表连接
select xxxx
from A
join B
on A.xxx = B.yyy
-- 多张表连接
select xxx
from A
Join C
on A.xx=C.yy
join B
on C.aa=B.bb
多表连接联系
--- 5.1 查询人口数量少于100人的城市所在:国家名,国土面积,城市名,人口数
USE world;
DESC city;
DESC country;
SELECT
country.name ,country.SurfaceArea,city.name,city.Population
FROM city
JOIN country
ON city.CountryCode=country.code
WHERE city.Population<100;
--- 5.2 统计zhang3学习了几门课程
SELECT student.sname,COUNT(sc.cno)
FROM student
JOIN sc
ON student.sno=sc.sno
WHERE student.sname='zhang3';
--- 5.3  统计zhang3学习课程名称
SELECT student.sname,GROUP_CONCAT(course.cname)
FROM student
JOIN sc
ON student.sno=sc.sno
JOIN course
ON sc.cno=course.cno
WHERE student.sname='zhang3';
--- 5.4 oldguo老师教了学生的个数
SELECT teacher.tname,COUNT(student.sno)
FROM teacher
JOIN course
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student
ON sc.sno=student.sno
WHERE teacher.tname='oldguo';
--- 5.5 每位老师所教课程的平均分,并按平均分排序
SELECT teacher.tname,AVG(sc.score)
FROM teacher
JOIN course
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno
GROUP BY teacher.tno
ORDER BY AVG(sc.score) ;
--- 5.6 查询oldguo所教的不及格的学生姓名
SELECT teacher.tname,student.sname,sc.score
FROM teacher
JOIN course
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student
ON sc.sno=student.sno
WHERE teacher.tname='oldguo' AND sc.score<60;
--- 5.7 查询所有老师所教学生不及格的信息
SELECT teacher.tname,GROUP_CONCAT(student.sname)
FROM teacher
JOIN course
ON teacher.tno=course.tno
JOIN sc
ON course.cno=sc.cno
JOIN student
ON sc.sno=student.sno
WHERE sc.score<60
GROUP BY teacher.tname;
多表连接总结
- 多表连接中,小表驱动大表
 - 通过
left join强制选定驱动表 
AS 别名
表别名
表别名一般是在from的表的别名,或者join后的表的别名。在where, group by ,select 后的列,having,order by
SELECT a.tname,GROUP_CONCAT(d.sname)
FROM teacher  AS a
JOIN course   AS b
ON a.tno=b.tno
JOIN sc AS c
ON b.cno=c .cno
JOIN student AS d
ON c.sno=d.sno
WHERE c.score<60
GROUP BY a.tname;
列表名
列别名一般是在select后的列,定义的别名。结果集显示会以别名形式展示,在having和order by中可以调用列别名。
SELECT a.tname AS 讲师,AVG(c.score) AS 平均分
FROM teacher AS a
JOIN course  AS b
ON a.tno=b.tno
JOIN sc AS c
ON b.cno=c.cno
GROUP BY a.tno
ORDER BY 平均分 ;
元数据获取
基表: 数据字典信息(列结构frm),系统状态,对象状态
元数据获取方式
- information_schema
 - show 语句
 
show 语句(MySQL独家)
show databases;           		-- 查看所有数据库名
show tables;   		      		-- 查看当前库下的表名
show tables from world;   		-- 查看world数据库下的表名
show create database      		-- 查看建库语句
show create table         		-- 查看建表语句
show grants for root@'localhost' 	-- 查看用户权限信息
show charset				-- 查看所有的字符集
show collation				-- 查看校对规则
show full processlist			-- 查看数据库连接情况
show status				-- 查看数据库的整体状态
show status	like '%lock%'		-- 模糊查看数据库的整体状态
show variables 				-- 查看数据库所有变量情况
show variables 	like '%innodb%'		-- 查看数据库所有变量情况
show engines				-- 查看所有支持存储引擎
show engine innodb status  		-- 查看所有innodb存储引擎状态情况
show binary logs			-- 查看二进制日志情况
show binlog events in 			-- 查看二进制日志事件
show relaylog events in 		-- 查看relay日志事件
show slave status 			-- 查看从库状态
show master status 			-- 查看数据库binlog位置信息
show index from				-- 查看表的索引情况
information_schema 虚拟库
创建视图
information_schema ---> VIEWS 视图
CREATE VIEW test AS SELECT
country.name AS co_name,country.SurfaceArea,city.name AS ci_name,city.Population
FROM city   JOIN country
ON city.CountryCode=country.code
WHERE city.Population<100;
VIEWS 视图: TABLES
存储整个数据库中,所有表的元数据的查询方法
use information_schema;
desc tables;
常用的
TABLE_SCHEMA 	-- 表所在的库
TABLE_NAME      -- 表名
TABLE_TYPE      -- 表类型
ENGINE          -- 表的存储引擎
TABLE_ROWS      -- 表的行数
AVG_ROW_LENGTH  -- 平均行长度/用于计算真正的存储空间表的行数
INDEX_LENGTH    -- 索引的长度
举个例子
-- 1. 查询 world 数据库下的所有表名
show tables from world;
-- 2. 查询整个数据库下的所有表名
SELECT table_name FROM information_schema.tables;
-- 3. 查询所有InnoDB引擎的表
SELECT table_schema,table_name,ENGINE FROM information_schema.tables
WHERE ENGINE='innodb';
-- 4. 统计每张表的实际占用空间大小情况(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)
SELECT
table_name ,
AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH
FROM information_schema.tables;
-- 5. 统计每个库的空间使用情况大小情况
SELECT
table_schema,
SUM(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024/1024  AS total_mb
FROM information_schema.tables
GROUP BY table_schema
-- 6. 对MySQL的数据库进行分库分表备份
-- mysqldump -uroot -p123  world city >/backup/world_city.sql
SELECT CONCAT("mysqldump -uroot -p123456 ",table_schema ," ",table_name ," >/backup/",table_schema,
"_",table_name,".sql")
FROM information_schema.tables INTO OUTFILE '/tmp/bak1.sql';
-- 7. 模仿模板语句,批量生成对world数据库下的表操作的语句
-- alter table world.city discard tablespace;
SELECT CONCAT("alter table ",table_schema,".",table_name," discard tablespace;")
FROM information_schema.tables
WHERE table_schema='world'
INTO OUTFILE '/tmp/discard.sql';
												
											第三章 - SQL基础及元数据获取的更多相关文章
- CentOS 7.4 初次手记:第三章 CentOS基础了解
		
第三章 CentOS基础了解... 36 第一节 语言编码.终端... 36 I 查看语言编码... 36 II Tty?.pts/?. 36 第二节 bash/sh command. 38 I 查找 ...
 - 数据库整理(三) SQL基础
		
数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动:  ●定义和修改.删除关 ...
 - 第一章 SQL基础
		
第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...
 - Struts2框架学习第三章——Struts2基础
		
本章要点 — Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 — WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合To ...
 - 第三章SQL编程
		
本章目标: 1.使用变量 2.输出语句 3.数据类型转换 4.逻辑控制语句 5.批处理 一.变量 1.什么是变量呢? 变量是存储数据的容器 T-SQL中的变量分为局部变量和全局变量 2.局部变量 局部 ...
 - Intel汇编语言程序设计学习-第三章 汇编语言基础-上
		
汇编语言基础 3.1 汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov eax,5 ;5送EAX寄存器 add ...
 - 0003-20180422-自动化第三章-python基础学习笔记
		
3章 内容回顾: 1. 计算机组成 2. 程序编译器 3. 变量 4. 条件 5. 循环 6. py2与py3区别 - 默认编码, - 除法, - input ,raw_input 7. 位,字节关系 ...
 - MySQL学习(三) SQL基础查询
		
其实在数据库最经常用的当属查询操作 基本语法 SELECT [ALL | DISTINCT | DISTINCTROW ] 字段列表 AS 字段别名 [FROM 表名 WHERE 条件表示式 GROU ...
 - 《Java从入门到失业》第三章:基础语法及基本程序结构(四):基本数据类型(字符编码和char型)
		
3.6.4字符编码 咦?怎么好像有东西乱入了?不是讲基本数据类型么?哈哈,因为还剩下最后一个char型了,因为char型会牵涉到Unicode编码相关,因此我决定先科普一下字符集编码. 我儿子现在上小 ...
 
随机推荐
- MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引
			
一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
 - Python之路【第二十九篇】:django ORM模型层
			
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
 - FMX 隐藏任务栏  xe10
			
找了好多信息,测试好些,xe10 隐藏只要以下命令 隐藏 ShowWindow(ApplicationHWND, SW_HIDE); 显示 ShowWindow(ApplicationHWND, S ...
 - delphi xe6 窗口 visible 不能隐藏 解决
			
delphi xe6 窗口 visible 不能隐藏 解决 在工程代码里面加上 Application.ShowMainForm := false;
 - Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot
			
需求缘起:有人在群里@我:请教群主大神一个问题,spring boot + freemarker 怎么获取contextPath 头疼死我了,网上没一个靠谱的 .我就看看之前博客中的 [Spri ...
 - 一个非常有趣的爬虫小练习带ocr识别的
			
有个小的想法,想找一找 形近字 .百度一搜索,百度文库有一个,收费4元.而且我觉得字数不是太多.想自己弄一个,于是找到了 这个网站 http://www.fantiz5.com/xingjinzi/ ...
 - 【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序
			
在C#的List集合操作中,有时候需要针对List集合进行排序操作,如果是对List集合按照元素对象或者元素对象的某个属性进行倒序排序的话,可以使用OrderByDescending方法来实现,Ord ...
 - Leetcode刷题python
			
Two Sum 两数==target 方法二更好 题1,对时间复杂度有要求O(n),所以维护一个字典,遍历过的数值放在字典中,直接遍历时候查找字典中有没有出现差,查找字典时间复杂度是O(1),所以O( ...
 - LCD 驱动 S3C2440A
			
LCD Control 1 Register 以16BPP为例 LCD Control 2 Register LCD Control 3 Register LCD Control 4 Register ...
 - MySQL优化——MySQL 生产环境下 my.cnf 优化配置
			
MySQL 5.6/5.7 参数文件优化配置[client]port = 3306socket = /data/mysql/tmp/mysql.sockdefault-character-set = ...