zoukankan      html  css  js  c++  java
  • 第三章

    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;
    

    多表连接总结

    1. 多表连接中,小表驱动大表
    2. 通过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';
    
  • 相关阅读:
    游戏引擎架构
    前瞻设计:创新型战略推动可持续变革(全彩)
    解放创意——自由人的自由联合
    python2中的__init__.py文件的作用
    python导入模块时的执行顺序
    json使用
    JQuery基本语法(部分)
    谷歌开发者工具使用
    pythonseleniumAPI
    静态、自适应、流式、响应式四种网页布局的区别
  • 原文地址:https://www.cnblogs.com/lpcsf/p/12076141.html
Copyright © 2011-2022 走看看