SQL应用及元数据获取

2019/04/08 09:01

SQL介绍

==结构化查询语言(Structured Query Language)==

简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

  • MySQL-5.7版本后符合SQL-92标准的严格模式。
  • 数字不用加双引号,字符串要加

数据类型、表属性、字符集

数据类型

作用:保证数据的准确性和标准性。

种类

  • 数值类型
TINYINT  :-128~127

INT      :-2^31~2^31-1

说明:手机号是无法存储到INT的,一般是使用char类型来存储收集号。
数值类型
  • 字符类型
#char
固定长度字符串,存储效率高,不需要判断字符长度,直接分配空间,浪费不必要的资源。

#varchar
相比前者,存储效率低,需要判断字符长度,按需分配空间。

如何选择?
#大量插入(insert)操作时,推荐使用char去代替varchar。
#业务中,大量是查询类操作,数据量级又比较大的情况下,变长长度数据类型,可以考虑采用varchar,一方面节省空间,可以有效的减少索引树的高度,从而提高索引的优化查询的效果。

字符类型
  • 时间类型
#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.
TIMESTAMP会受到时区的影响。
时间类型
  • 二进制类型


    二进制类型

表属性

列属性

primary key   主键
#非空且唯一  

not null      非空   
#可以设置默认值

unique key    唯一键  
#列值不能重复  

unsigned      无符号  
#针对数字列(非负数等等)

其他属性

key            索引  
#建立索引,优化查询  

default        默认值  
#列中,无录入值时,默认使用default值  

auto_increment 自增长 
#针对数字列(默认从1开始,可以设定起始点与偏移量)

comment        注释  

字符集校对规则

字符集

  • utf-8
  • utf8mb4
    utf8mb4是utf8的超集,专门用来兼容四字节的unicode(emoji表情等等)

校对规则

大小写是否敏感   

SQL分类

DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据查询语言  #MySQL查询语句类型

DDL语句

库定义

  • 创建
#创建数据库
>create database school;   

#查看创建库的命令内容
>show create database school;

规范

  • 库名大小写统一(Windows不区分大小写,Linux区分大小写)
  • 建库时指定字符集
>create database db charset utf8mb4;  
  • 库名不能以数字开头
  • 见名知其意
  • 删除(禁止删库)
>drop database db;
  • 修改
#修改字符集为utf8(默认为latin1)
>alter database school charset utf8;

#查看字符集
>show charset;

#查看校对集
> show collation;

表定义

表规范

  • 表名小写
  • 不能是数字开头
  • 注意字符集和存储引擎
  • 表名和业务有关
  • 选择合适的数据类型
  • 每列要有注释
  • 每列设置为非空,否则设置默认值(0)

创建表

create table  table_name (

列1  属性(数据类型、约束、其他属性) ,

列2  属性,

列3  属性

)  

#建表举例  
USE db_name;
CREATE TABLE student_info (
id INT PRIMARY KEY NOT NULL  AUTO_INCREMENT COMMENT '学生学号',
sname VARCHAR(64) NOT NULL COMMENT '学生姓名',
gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '学生性别',
phone  CHAR(11) UNIQUE KEY NOT NULL COMMENT '手机号',
age  TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '学生年龄',
time TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4;

删除表(禁止使用)

drop table t1;

修改表属性

#在student表的最后加上QQ列
ALTER TABLE school.student ADD qq VARCHAR ( 64 ) UNIQUE KEY NOT NULL COMMENT 'QQ';
DESC stutdent;

#在sname后加微信列
ALTER TABLE school.student ADD Wechat VARCHAR ( 64 ) UNIQUE KEY NOT NULL COMMENT '微信' AFTER sname;
DESC student;

#插入在第一列  
ALTER TABLE school.student ADD num INT FIRST;
DESC student;

#修改sname数据类型
ALTER TABLE student MODIFY sname VARCHAR ( 32 );
DESC student;

#修改sname列名改为sn,数据类型改为varchar(50)
ALTER TABLE student CHANGE sname sn VARCHAR ( 50 );
DESC student;

删除列

#删除num列
ALTER TABLE student DROP num;

表属性查询

#查看表内容
show table_name;

#
desc table_name;  

#查看表所有内容的前4行
select * from table_name where id<5; 

#复制source表结构,并创建新的空表
create table source_table_name like new_table_name;

DCL语句

#授予权限
grant

#回收权限
revoke

DML语句

对表中数据进行增、删、改。

INSERT语句

#在学生表插入一行数据
DESC student;
INSERT INTO student(sn,gender,phone,age)
VALUES('zs','m',  '110'  ,18);
SELECT * FROM student;
#省事的插入方法
INSERT INTO student
VALUES(2,'ls','f','190',18,NOW());
SELECT * FROM student;

#一次性录入多行数据
INSERT INTO student(sn,gender,phone,age)
VALUES('w5','f','120',19),('m6','m','119',20),('m66','f','1190',27);
SELECT * FROM student;
INSERT INTO student(sn,phone,age)
VALUES('w55','1200',17);

UPDATE语句

#更改第7行'sn'列为'zhao4'
UPDATE student SET sn='zhao4' WHERE id=7;
注意:update语句必须要加where。

DELETE语句 (删除)

#删除第7行信息
delete from student where id=7;

伪删除:用update来替代delete,最终保证业务中查不到(select)即可。
#添加状态列
alter table student add state tinyint not null default 1;
#使用update替代delete
update student set state=0 where id=6;
select * from xuesheng;
#业务查询时,加入状态判断
select * from student where state=1;

DQL语句

SELECT语句

  • MySQL独有参数
#查看配置文件信息
select @@basedir;
select @@socket;
  • MySQL内置函数
#查看系统当前时间
select now();    

#查看MySQL当前登陆用户
select user();  

#查看当前所在数据库
select database();
  • from
#查看city表中某一列信息 
SELECT NAME,population FROM world.city;

#查看student表的所有信息
select * from  student;
  • where
#查询中国所有城市
select * from city where countrycode='CHN';  

#查询以'US'开头的列(%不可以在最前方)
select * from city where countrycode like 'US%';

#查看中国和美国的城市信息
select * from city where countrycode='CHN' or countrycode='USA';

#同时模糊查找
select * from city where countrycode like 'US%' or countrycode like 'CH%';

group by + 常用聚合函数

作用:根据by后面的条件进行分组,方便统计,by后面跟单列或者多列。

  • 常用聚合函数
max()       #最大值
min()       #最小值
avg()       #平均值
sum()       #总和
count()     #个数
  • GROUP BY + 聚合函数口诀与实例
遇到统计想函数  
形容词前 GROUP BY  
函数中央是名词     
列名select后添加  

#统计世界上每个国家的总人口数.
USE world  
SELECT countrycode ,SUM(population)  FROM  city GROUP BY countrycode;  

#统计中国各个省的总人口数量  
SELECT district,SUM(Population) FROM city WHERE countrycode='chn' GROUP BY district;    

#统计世界上每个国家的城市数量  
SELECT countrycode,COUNT(id)  FROM city GROUP BY countrycode;
  • having
where|group|having  
#统计中国每个省的总人口数,将总人口数小于100w  
SELECT district,SUM(Population)FROM cityWHERE countrycode='chn' GROUP BY districtHAVING SUM(Population) < 1000000 ;  

order by + limit

#查看中国所有城市,并按人口数进行排序(从大到小)
SELECT * FROM city WHERE countrycode='CHN' ORDER BY population DESC;


#统计中国各省总人口数,按照总人口从大到小排序  
select district as 省份,sum(population) as 总人口
from city
where countrycode='chn'
group by district 
order by 总人口 DESC;


#取第3名到第7名
select district as 省份,sum(population) as 总人口
from city
where countrycode='chn'
group by district 
order by 总人口 DESC
limit 2,5;

select district as 省份,sum(population) as 总人口
from city
where countrycode='chn'
group by district 
order by 总人口 DESC
limit 5 offset 2;
  • distinct (去重)
SELECT countrycode FROM city ;
SELECT DISTINCT(countrycode) FROM city  ;

join (多表连接查询)

#查询一下世界上人口数量小于100人的城市名和国家名  
SELECT b.name ,a.name ,a.populationFROM   city  AS aJOIN   country AS bON     b.code=a.countrycodeWHERE  a.Population<100  

#查询城市shenyang,城市人口,所在国家名(name)及国土面积(SurfaceArea)
SELECT a.name,a.population,b.name ,b.SurfaceAreaFROM city  AS a JOIN country AS bON a.countrycode=b.codeWHERE a.name='shenyang';


#多表连接口诀  
数据来自多张表,优先想到多表连接join ON  
关联表写join两端  
on条件写两表的关联列  
所有查询条件select后,注意表名和别名
where过滤条件写最后

union(all)

主要用来优化 in 和 or 语句

SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'

子查询

#查询人口少于100人的城市所在的国家名字  
select name,population,countrycode from city where population <100;  
A,B,CAAA BBB CCCselect name from country where code in (select countrycode from city where population <100;)  

#优化思路  
1.改写为join  
2.利用临时表

information_schema tables

DESC information_schema.TABLES

TABLE_SCHEMA    ---->库名  
TABLE_NAME      ---->表名  
ENGINE          ---->引擎  
TABLE_ROWS      ---->表的行数  
AVG_ROW_LENGTH  ---->表中行的平均行(字节)  
INDEX_LENGTH    ---->索引的占用空间大小(字节)  


#查询整个数据库中所有库和所对应的表信息  
SELECT table_schema,GROUP_CONCAT(table_name) FROM information_schema.tablesGROUP BY table_schema;  

#统计所有库下的表个数  
SELECT table_schema,COUNT(table_name)FROM information_schema.TABLESGROUP BY table_schema  

#查询所有innodb引擎的表及所在的库   
SELECT table_schema,table_name,ENGINE FROM information_schema.`TABLES`WHERE ENGINE='innodb';  

#统计world数据库下每张表的磁盘空间占用  
SELECT table_name,CONCAT((TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024," KB")  AS size_KBFROM information_schema.tables WHERE TABLE_SCHEMA='world';  

#统计所有数据库的总的磁盘空间占用   
SELECTTABLE_SCHEMA,CONCAT(SUM(TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024," KB") AS Total_KBFROM information_schema.tablesGROUP BY table_schema;  

mysql -uroot -p123 -e "SELECT TABLE_SCHEMA,CONCAT(SUM(TABLE_ROWS*AVG_ROW_LENGTH+INDEX_LENGTH)/1024,' KB') AS Total_KB FROM information_schema.tables GROUP BY table_schema;"  

#生成整个数据库下的所有表的单独备份语句模板语句  
mysqldump -uroot -p123 world city >/tmp/world_city.sql  
SELECT CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp/",table_schema,"_",table_name,".sql" )  
FROM information_schema.tables  
WHERE table_schema NOT IN('information_schema','performance_schema','sys')  
INTO OUTFILE '/tmp/bak.sh' ;  
CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp/",table_schema,"_",table_name,".sql" )  

#107张表,都需要执行以下2条语句  
ALTER TABLE world.city DISCARD TABLESPACE;  
ALTER TABLE world.city IMPORT TABLESPACE;  
SELECT CONCAT("alter table ",table_schema,".",table_name," discard tablespace")  
FROM information_schema.tables  
WHERE table_schema='world'INTO OUTFILE '/tmp/dis.sql';

show 命令

#查看数据库
show databases;

#查看表
show tables;

#查看某个数据库里面的表 
show tables from db_name;

#查看建库语句
show create db_name;

#查看建表语句  
show create table db_name.table_name;

#查看用户授权信息   
show  grants for  root@'localhost';

#查看字符集
show  charset;

#查看校对集  
show collation;  

#查看数据库连接情况  
show processlist; 

#查看表索引  
show index from table_name;

#查看所有配置信息  
show variables;

#查看数据库状态  
show status;  

#查看所有存储引擎
show engines;  

#查看所有二进制日志
show binary logs;

#查看部分配置信息
SHOW variables LIKE '%lock%';   

#查看InnoDB引擎相关的状态信息  
show engine innodb status\G
  
#查看主库状态  
show master status

#查看从库状态
show slave status \G

#查看表的列定义信息
desc  (show colums from city)        

show语句帮助
http://dev.mysql.com/doc/refman/5.7/en/show.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容