【SQL基础学习】----基础篇(1)

前言:
存储数据的容器

    在内存中(数据存在易失性,断电即数据没了):
        数组
        集合

    磁盘(永久存储):
        文件(不易管理)
        数据库(持久化,易管理)

一、数据库基础介绍:

1. 数据库基本概念:
数据库(DataBase/DB):
    用于存储和管理数据的仓库。即保存一系列有组织的数据

其特点:
    1.持久存储(持久存储-->存储于文件)-->数据库为文件系统;
    2.方便存储和管理数据;
    3.使用同一方式操作数据库-->SQL


DBMS(database management system)用于操作DB
    DBMS分类:
        基于共享文件系统的DBMS(Access)
        基于客户机-服务器的DBMS
SQL(structure query language)用于和DB通信的语言,由DBMS支持

数据库(类)-->数据库软件(对象)
安装MySQL其实是安装MySQL的服务器软件,服务(没有界面的应用程序,属于后台)

MySQL服务器(MySQL服务器所在的软件):
    数据库就是一个文件夹,数据库中可以存放多张表(文件)

SQL:
    Structured Query Language:结构化查询语言(操纵所有关系型数据库的规则)

每一种数据库操纵的方式存在一些不一样的地方,成为“方言”


2. MySql的卸载:
    1.在mysql的my.ini文件中找到datadir 字段的值
    2.卸载mysql
    3.删除G:下的mysql目录(文件夹)


3. MySQL服务启动:
    1. 手动:任务管理器,点点戳戳
    2. cmd-->service.msc 打开服务的窗口
    3. 使用管理员身份打开cmd:
        输入:net start mysql :启动mysql的服务
        输入:net stop mysql : 停止mysql的服务

注:在linux环境下
    tip1:查看MySQL服务是否开启,则有以下命令:

systemctl status mysql.service

    tip2:查询MySQL端口号(其中默认netstat已安装):

netstat -anp|grep mysql


4. MySQL的登录与退出:

    登录:
        1.在cmd中输入:

mysql -uroot -hlocalhost –P端口号 –p密码

        2.在cmd中输入:

mysql -hip -uroot -p连接目标的密码

        3.在cmd中输入:

mysql --host=ip --user=root --password=连接目标的密码

        4.在linux环境下登录:

(Ubuntu非root账户下)sudo mysql -u root(账号名称) -p 密码
(CentOS的root账户下)mysql -u账号名称 -p密码

        5.自带客户端,输入root账号和密码

        6.以管理员省份进入cmd-->mysql -h 主机名称 -P 端口号 -u 用户名 -p 密码
 
    退出:
        1.直接叉cmd
        2.在cmd中输入:exit或者quit或ctrl+c

tip:二维表(字段{属性}+元组)-->数据库(二维表集合)

5.MySQL 数据库目录结构:
    1.MySQL安装目录:
        配置文件:my.ini
    2.MySQL数据目录:
        数据库:文件夹;
        表:文件;
        数据:数据记录
    3.mysql数据库结构:
        information_schema--保存源数据信息
        mysql--保存用户信息
        performance_schema--收集性能信息


6. SQL通用语法:
    1. sql语句可以单行或多行书写,以分号结尾。
    2. 可以是引用空格或者缩进来增强语句可读性
    3. MySQL 数据库的 sql 语句不区分大小写,关键字建议使用大写
    4. 注释:
        a. 单行注释:(单个空格)--(单个空格)注释内容 或 (单个空格)#注释内容
        b. 多行注释:/*注释*/
    5.MySQL常用命令
        查询列表可以是字段,常量,表达式,函数,也可以是组合
        查询结果是一个虚拟的表
        查看数据库中的数据库目录:

show databases;

        使用指定数据库:

use 数据库名称;

        查看数据库中存储的表:

show tables;

        查看其他库的表:

方式一:use 其他数据库名称;show tables;
                {此时所在库位置改变}
方式二:show tables from 其他数据库名称;
                {此时所在库位置不变}

        查看用户所在库:

select database();

        建表:

creat table 表名称(
      列名称 列类型,
      列名称 列类型
);

        查看表的结构:desc 表名称;
        查看表信息:select * from 表名称;
        在表中插入数据:insert into 表名称 (id,name) values(1,'john');
        修改表中数据:update 表名称 set name='lilei' where id=1;
        删除表中标数据:delete from 表名称 where id=1;
        查看mysql数据库的版本:
            方式一:在mysql客户端下,输入 select version();
            方式二:在cmd下,输入 mysql --version 或 mysql -V

tip:MySQL语法规范
    1.不区分大小写,但建议关键字大写,表名、列名小写
    2.每条命令最好用分号结尾
    3.每个关键字可以独占一行
    4.注释:
        单行注释:
            #注释文字
            -- 注释文字
        多行注释:
            /* 注释文字 */


SQL的分类:
    1) DDL(Data Definition language)数据定义语言
        用于定义数据库对象:数据库、表、列等。
            关键字:create、drop、alter等

    2)DML(Data Manipulation language)数据操作语言
        用于对数据库中表的数据进行增删改查。
            关键字:insert、delete、update等

    3)DQL(Data Query Language)数据查询语言
        用来查询数据库中表的记录(数据)。
            关键字:select、where等

    4)DCL(Data Control Language)数据控制语言
        用于定义数据库的访问权限和安全级别,及创建用户。
            关键字:GRANT,REVOKE 等

tip:在mysql中不区分字符串和字符,即""和''等价

二、数据库的增删改查基本操作(DDL操作数据库):

1. 操作数据库:CRUD
    C(CREATE):创建;
    R(RETRIEVE):查询
    U(UPDATE):修改
    D(DELETE):删除
    使用数据库


R(RETRIEVE)查询:

    查询所有数据库名称:
        show databases;

    查看某个数据库对应的字符集(查询某个数据库的创建语句):
        show create database 数据库名称;

    查询当前正在使用的数据库名称:
        select database();

    使用数据库:
        use 数据库名称;

    查看当前数据库设置的字符集:
        show variables like 'character_set_database';

    查看所有数据库设置的字符集:
        show variables like '%char%';


C(CREAT)创建:
    创建数据库:
        create database 数据库名称

    创建数据库,判断不存在,再创建:
        create database if not exists 数据库名称

    创建数据库,指定字符集
        create database 数据库名称 character set 字符集名

    练习:
        创建DB0数据库,判断是否存在,并指定字符集为gbk
            creat database if not exists db0 character set gbk


U(UPDATE):修改:
    修改数据库的字符集
        alter database 数据库名称 character set 字符集名称


D(DELETE):删除
    删除数据库:
        drop database 数据库名称

    判断数据库存在,存在再删除:
        drop database if exists 数据库名称;

三、数据库表格的基本操作(DDL操作表):

R(RETRIEVE)查询:
    查询某个数据库中所有的表名称:
        show tables;

    查询表结构  
        desc 表名


创建表
    语法:
        creat table 表名称(列名1 数据类型1,列名2 数据类型2,。。。列名N 数据类型N)
            注,最后一列无“,”号
    实例{
        创建表   
        creat table student(
            id int,
            name varchar(32),
            age int,
            score double(4,1),
            birthday date,
            insert_time timestamp
        )
    }

    复制一张表:
        create table 新表名 like 被复制的老表名

数据类型:
    1.int:整数类型:    
        age int   

    2.double:小数类型:   
        score double(5,2)    5指一共5位数,其中小数占2位  

    3.date: 日期只含年月日,yyyy-MM-dd  

    4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss   

    5.timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss      
        (若将来不给这个字段赋值或赋值为null,则默认使用当前的系统时间自动赋值)

    6.varchar:字符串:   name varchar(20) 姓名最大20个字符

删除表
    删除表:
        drop table 表名;   

    删除表:
        drop table if exists 表名;      


修改表
    1.修改表名:
        alter table 表名 remame to 新表名   

    2.修改表的字符集:
        alter table 表名 character set 字符集名称

    3.添加一列:
        alter table 表名 add  列名 数据类型  

    4.修改列名称,类型:
        alter table 表名 change 列名 新列名 数据类型    
        alter table 表名 modify 列名 新数据类型

    5.删除列:
        alter table 表名 drop 列名

四、对表中数据进行操作(

        DML:增删改表中数据、

        DQL查询表中记录、

        DQL查询表中记录

)

DML:增删改表中数据

数据的添加:
    语法:
        insert into 表名(列名1,列名2,列名3....列名n);

    注:
        列名和值要一一对应;
        若表名后不定义列名,则默认给所有列添加值;
        除了数字类型,其他类型需要使用引号(单双均可)引起来


删除数据:
    语法:
        delete from 表名 [where 条件]

    注:
        若不加条件,则删除表中所有记录(表在,记录不在);     
        若要删除所有记录,可以采用:    
            1. delete from 表名;
                -----不推荐,因为有多少条记录就会执行多少次操作,效率低下     
            2. truncate table 表名;
                ----先删除表然后再创建一张一模一样的空表
                删除表:
                    truncate table 表名(表删除,记录不在,然后再创建一个一模一样的空表)

修改数据:
    语法:
        update 表名 set 列名1=值1,列名2=值2, ...,列名N=值N [where 条件]

    若不加条件,则会将表中所有记录全部修改

DQL查询表中记录

语法:

    select 字段列表(逗号隔开)  
    from 表名列表(逗号隔开)      
    where 条件列表(逗号隔开)      
    group by 分组字段    
    having  分组之后的条件     
    order by 排序     
    limit 分页限定


一、基础查询

    0.在查询指定字段前,首先要确定使用的数据库,即在查询语句前加:

  USE 数据库名称


    1.多个字段的查询: 

    1.语法:
        SELECT 
            查询列表
        FROM 
            表名;

    其中:
        1.查询列表包含:表中字段、常量值、表达式、函数
        2.查询结果是一个虚拟表格
        3.“ * ”可以代表所有列

    2.去除重复:
        distinct    
            仅仅只有两个结果集完全一样才使用   

    3.计算列:
        一般可以使用四则运算计算列的值(一般只会计算数据型计算)

ifnull(表达式1,表达式2):如果表达式1为空则用表达式2替代  

    4.起别名:

as :as也可以省略

    5.判断某个字段或表达式是否为空,若不为空则返回其值,若为空则返回自己设定的预定值:

IFNULL(某个字段或表达式,自己设定的预定值)

    6.判断某个字段或表达式的值是否为NULL,若是NULL则返回1,若不是NULL则返回0

ISNULL(某个字段或表达式)

    7.实例:

{

    1.查询表中的单个字段:
        SELECT 
            属性名称 
        FROM 
            表名称;

    2.查询表中多个字段(查询属性顺序与表中存储的属性顺序无关):
        SELECT 
            属性名称1,
            属性名称2,
            属性名称3,
            ...
        FROM 
            表名称;

    3.查询表中所有字段:
        SELECT 
            属性名称1,
            属性名称2,
            属性名称3,
            ...(所有属性)
        FROM 
            表名称;

        <==等价于==>

        SELECT 
            *
        FROM 
            表名称;

    4.查询常量值(数值直接写,字符串和字符使用''将其引起来):
        SELECT 
            常量;


    5.查询表达式:
        SELECT 
            表达式

    6.查询函数(调用一个指定函数并显示其执行结果):
        SELECT 
            函数(实参列表);
        注:MySQL中的函数必须有返回值,调用的时候相当于执行了该函数的函数体,用时查询出对应的返回值

    7.起别名(
        1.好处易于理解;若查询字段有重名情况,可以看出此字段属于那张表格
        2.当别名中存在关键字或注释符号是,使用""将别名引起来
    ):
        SELECT  
            查询列表
        AS
            别名
        FROM 
            表名;

        <==等价于==>

        SELECT  
            查询列表
        
            别名
        FROM 
            表名;

    8.去重:
        SELECT
        DISTINCT  
            单个字段名称
        FROM 
            表名;

    9.+号的作用(在mysql中+号仅作为运算符):
        SELECT 数值+数值 
            数值之和结果为数值

        SELECT '数值'+数值 
            字符数值与数值之和结果为数值

        SELECT '字符'+数值 
            字符与数值之和结果为数值,将字符转换为0

        SELECT null+数值 
            只要见null,结果一定为null

    10.concat的使用(用于连接字符串,属性拼接):
        SELECT
        CONCAT('属性1','属性1','属性1'...)
        AS
            别名
        FROM 
            表名;
}
​


二、条件查询
    特点:
        where子句后跟条件   

    几个常用符号:
        通配符(占位符):
            %{任意多个字符}
            _{任意单个字符}
        转义符用于将目标字符中的特殊符号转换成普通字符串:
            \
            属性 LIKE '任意字符_目标字符' ESCAPE'任意字符'

    1.语法:

        SELECT
            查询列表
        FROM
            表名
        WHERE
            筛选条件;

    2.执行顺序:表名-->筛选条件-->查询

    3.分类:
        A、按条件表达式进行筛选
            条件运算符:>,<,=,!=,<>,>=,<=,安全等于<=>
        B、按逻辑表达式筛选
            作用:用于连接条件表达式
            逻辑运算符:
                “&&”与“and”与“交”:交见假则假
                “||”与“or”与“并”:并见真则真
                “!”与“not”与“非”:非取反

        C、模糊查询
            like
            特点:
                1.一般和通配符搭配使用,既可以查字符型也可以判断数值型
                实例一

{
    SELECT
        *(属性名称1,属性名称2...)
    FROM
        表名称
    WHERE
        属性 LIKE '%目标字符%'(或'_目标字符_');
}


            between and
                特点:包含临界值,两个临界值不能颠倒
                实例一:查询属性值在属性1和属性2中的信息

{
    SELECT
        *(属性名称1,属性名称2...)
    FROM
        表名称
    WHERE
        属性名称 BETWEEN 数值1 AND 数值2;
}

                实例二:查询属性值不在属性1和属性2中的信息

{
    SELECT
        *(属性名称1,属性名称2...)
    FROM
        表名称
    WHERE
        属性名称 NOT BETWEEN 数值1 AND 数值2;
}


            in
                含义:判断某字段的值是否属于in列表中的某一项
                特点:
                    使用in提高语句简洁度
                    in列表值类型必须统一或兼容
                    由于IN等价于=,所以在IN修饰的语句中不能使用通配符
                实例一

{
    SELECT
        *(属性名称1,属性名称2...)
    FROM
        表名称
    WHERE
        属性名称1=目标值1 OR 属性名称1=目标值2 OR ...;
    或{
        属性名称1 IN(目标值1,目标值2,...)
    }
}


            is null或is not null
                判断属性是否为空或是否不为空(仅用于判断NULL值):
                实例一

{
    SELECT
        *(属性名称1,属性名称2...)
    FROM
        表名称
    WHERE
        属性1 IS NULL(或 IS NOT NULL)
}

            安全等于:
                <=>意义上是“=”或“IS”
            作用:
                用于判断null值
                用于判断普通值

            小节is null和<=>
            IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
            <=>    :既可以判断NULL值,又可以判断普通数值,可读性较差

    4.实例:

        实例一:

查询符合某个条件的信息、案例一{
    SELECT
        *(属性名称1,属性名称2...)
    FROM
        表名称
    WHERE
        属性名称 >(>、<、=、!=、<>、>=、<=)条件;
    或{
            属性名称1 >(>、<、=、!=、<>、>=、<=)
        AND(OR,NOT)
            属性名称2 >(>、<、=、!=、<>、>=、<=);
    }或{
            属性名称 BETWEEN 数值1 AND 数值2;
    }
}

        实例二:

年薪的查询:{
SELECT
    salary*12*(1+IFNULL(commission_pct,0)AS 年薪
}

DQL查询表中记录

三、排序查询
    1、语法:

SELECT 查询列表
FROM 表
【WHERE 筛选条件】
ORDER BY 排序列表 【asc|desc】

        order by 子句    
        order by  排序字段1 排序方式1,排序字段2, 排序方式2...
        order by字句中可以支持单个字段、多个字段、表达式、函数、别名
        order by字句一般放在查询预计最后面,但limit字句除外,
        含有order by字句的简单查询中的执行顺序为,先找表,再按条件查表,查完表再进行排序

    排序方式:    
        ASC:升序,默认的       
        DES:降序    

        若有多个排序条件,则满足第一个排序条件基础上才会进行后面条件的执行

    按照A属性排名,若A属性值一样,则按照B属性排名

SELECT * 
FROM 表 
ORDER BY A ASC, B ASC

        2、案例:

案例一

{
    查询所有信息,要求数值属性1从高到低(从低到高)进行排序
        SELECT * 
        FROM 表 
        ORDER BY 数值属性1 DESC(或ASC,若是采用ASC那么ASC可以省略不写)
}

案例二

{
    含筛选条件查询
    查询所有信息,要求数值属性1在目标数值之上,以属性2从小到大进行展示
        SELECT * 
        FROM 表
        WHERE 数值属性1>=目标数值
        ORDER BY 属性2 ASC
}

案例三

{
    按表达式排序
    查询所有信息,按表达式进行排序
        SELECT *,表达式 AS 别名
        FROM 表
        ORDER BY 表达式 DESC
}

案例四

{
    按别名排序
    查询所有信息,按表达式进行排序
        SELECT *,表达式 AS 别名
        FROM 表
        ORDER BY 别名 DESC
}

案例五

{
    #按函数排序:
    #按照某一属性的长度进行排序
        SELECT LENGTH(属性A) '属性A别名',查询列表
        FROM 表
        ORDER BY LENGTH(属性A) DESC;

}

案例六

{
    #查询表中信息,要求先按照属性A升序排序,再按照属性B降序排序【按多个字段排序】
        SELECT *
        FROM 表
        ORDER BY 属性A ASC,属性B DESC;
}

常见函数:

概念:类似java中的方法,C语言中的函数,将一组逻辑语句封装在方法体中,对外暴露方法名称
好处:1、隐藏实现细节、2.提高代码重用性
调用实例:
    SELECT 函数名称(实参列表)
    【FROM 表】
特点:只关心函数名称和函数功能
分类:
    1.单行函数:如concat、length、ifnull等
    2.分组函数:功能:做统计使用(又称统计函数、聚合函数、组函数)

常见函数小节:

一、单行函数

字符函数:{length,concat,substr,instr,trim,upper,lower,lpad,rpad,replace}
数学函数:{round,ceil,floor,truncate,mod}
日期函数:{now,curdate,curtime,year,month,monthname,day,hour,minute,second,str_to_date,date_format}
其他函数:{version,database,user}
控制函数:{if,case}

一、字符函数:
length 获取参数值的字节个数
    统计目标字符串长度:SELECT LENGTH('目标字符串');  
    查看客户端字符集:SHOW VARIABLES LIKE '%char%';

concat 拼接字符串
    查询全名:SELECT CONCAT(last_name,'_',first_name) 姓名 FROM 表;

upper、lower
    将小写字符串转换为大写字符串:SELECT UPPER('小写目标字符串');
    将大写字符串转换为小写字符串:SELECT LOWER('小写目标字符串');

substr、substring 截取特定字符串
索引从1开始
    截取从指定索引处后面的所有字符{输出“倚天屠龙记”中的“屠龙记”}:SELECT SUBSTR('倚天屠龙记',3) out_put;
    截取从指定索引处指定字符长度的字符{输出“倚天屠龙记”中的“倚天”}:SELECT SUBSTR('倚天屠龙记',1,2) out_put;

instr返回子串第一次出现的索引,如果找不到返回0
    返回子串第一个字符在父字符串中的位置: SELECT INSTR('小明考上大学','大学') AS out_put;

trim删除前后指定空格或字符
    删除字符串“   张三丰   ”中多余的空格:SELECT TRIM('   张三丰   ')AS out_put;
    保留字符串“aaa张aa三丰aaa”中“张aa三丰”:SELECT TRIM('a' FROM 'aaa张aa三丰aaa')AS out_put;

lpad用指定的字符实现左填充指定长度
    SELECT LPAD('章程',10,'*') AS out_put;

rpad用指定的字符实现右填充指定长度
    SELECT RPAD('章程',10,'*') AS out_put;

replace替换
    SELECT REPLACE('小明用败家之眼','败家之眼','外星人') AS out_put

二、数学函数:
round 四舍五入(不计正负号条件下)
    SELECT ROUND(1.45)
    SELECT ROUND(1.567,2)

ceil 向上取整,返回>=该参数的最小整数
    SELECT CEIL(1.02)

floor 向下取整,返回=<该参数的最大整数
    SELECT CEIL(-1.02)

truncate 截断
    小数点后保留1位:SELECT TRUNCATE(1.69,1)

mod 求余{mod(a,b)=a-a/b*b}
    SELECT MOD(10,3)

三、日期函数:
now 返回当前系统日期+时间
    SELECT NOW();

curdate 返回当前系统日期不包含时间
    SELECT CURDATE();

curtime 返回当前时间不含日期
    SELECT CURTIME();

获取指定的年、月、日、时、分、秒
SELELCT YEAR(NOW()) 年;
SELELCT MONTH(NOW()) 月;
SELELCT MONTHNAME(NOW()) 月;
...

str_to_date将日期各式的字符串转换成指定格式的日期
    SELECT STR_TO_DATE('9_13_1999','%m-%d-%Y') AS out_put;

date_format:将日期转换成字符
    SELECT DATE_FOEMAT('2022/6/6','%Y年%m月%d日') AS out_put;

四、其他函数
SELECT VERSION();版本号
SELECT DATABASE();查询当前使用的数据库
SELECT USER();查询当前用户

五、流程控制函数
if函数(实现if else的效果)
    SELECT IF(10>5,'大','小');

case函数的使用:
1、与switch case等效{
    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1;
    when 常量2 then 要显示的值2或语句2;
    ...
    else 要显示的值N或语句N;
    end

    实例一{
        查询员工工资,要求
        部门号=30,显示工资为1.1倍
        部门号=40,显示工资为1.2倍
        部门号=50,显示工资为1.3倍
    
        SELECT salary 原始工资 department_id,
        CASE department_id
        WHEN 30 THEN salary*1.1
        WHEN 40 THEN salary*1.2
        WHEN 50 THEN salary*1.3
        ELSE salary
        END AS 新工资
        FROM employees;
    }
}
2、类似于多重if{
    case
    when 条件1 then 要显示的值1或语句1;
    when 条件2 then 要显示的值2或语句2;
    。。。
    else 要显示的值n琥珀语句n
    end

    实例一{
        查询员工的新工资情况
        如果工资>2w,显示A级别
        若工资>1.5w,显示B级别
        若工资>1w,显示C级别
        否则显示D级别

        SELECT salary,
        CASE
        WHEN salary>20000 THEN 'A'
        WHEN salary>15000 THEN 'B'
        WHEN salary>10000 THEN 'C'
        ELSE 'D'
        END AS 工资级别
        FROM employees;
    }
}

二、分组函数

分类:sum 求和;avg 均值;max 最大值;min 最小值;count 计算个数

1.简单使用
    SELECT 聚合函数(列名) FROM 表      
        注:
            聚合函数的计算会排除NULL的值

SELECT SUM(字段1) FROM 表1;
SELECT AVG(字段1) FROM 表1;
SELECT MAX(字段1) FROM 表1;
SELECT MIN(字段1) FROM 表1;
SELECT COUNT(字段1) FROM 表1;

SELECT SUM(字段1),AVG(字段1),MAX(字段1),MIN(字段1),COUNT(字段1) FROM 表1;

2.参数支持哪些类型:
    1.sum、avg一般用于处理数值型
    2.max、min、count可以处理任何类型
    3.5个分组函数均忽略null值

3.可以和distinct搭配实现去重运算
    SELECT SUM(DISTINCT 字段1),SUM(字段1) FROM 表1;
    SELECT COUNT(DISTINCT 字段1),COUNT(字段1) FROM 表1;

4.count函数的单独介绍:
    计算字段1这一列中所有值:SELECT COUNT(字段1) FROM 表1
    统计表1中不为空的总行数:{SELECT COUNT(*) FROM 表1}或{SELECT COUNT(1) FROM 表1}  
    效率:
        myisam存储引擎下,count(*)的效率最高
        innodb存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些
    一般使用count(*)作为统计行数

5.和分组函数一同查询的字段要求是group by后的字段

tip1:查看日期间的差值(以天为单位):DATEIFF(MAX(日期字段1),MIN(日期字段1))

tip2:若出现null还要将其记录则可以:
        1.选择非空列(主键) ;
        2.SELECT 聚合函数(IFNULL(列名,0)){
            其中聚合函数为count时,可以写为count(*)
        } FROM 表

分组查询
    语法:
        group by 分组字段
    注:       
        1.分组之后查询的字段:
            分组字段,聚合函数       
        2.where和having的区别:      
            where{
                在分组之前进行限定,
                如果不满足条件,
                则不参与分组。where后不更聚合函数
            }    

            having{
                在分组之后进行限定,
                如果不满足结果,
                则不会被查询出来。
                having后可以跟着聚合函数的判断
            }

分组查询实例:
    按照性别分组,分别查询男、女同学平均分:
        SELECT 性别,
        AVG(学科属性) FROM 表 GROUP BY 性别属性    

    按照性别分组,分别查询男、女同学平均分,人数:
        SELECT 性别,
        AVG(学科属性),
        COUNT(主键) FROM 表 GROUP BY 性别属性   

    按照性别分组,分别查询男、女同学平均分,人数 要求:分数低于70分的人数不参与分组:
        SELECT 性别,
        AVG(学科属性),
        COUNT(主键) FROM 表 WHERE 学科属性 > 70 GROUP BY 性别属性

    按照性别分组,分别查询男、女同学平均分,人数 要求:分数低于70分的人数不参与分组,分组之后人数要大于两个人:
        SELECT 性别,
        AVG(学科属性),
        COUNT(主键) FROM 表 WHERE 学科属性 > 70 GROUP BY 性别属性 HAVING COUNT(主键) >2   

    按照性别分组,分别查询男、女同学平均分,人数 要求:分数低于70分的人数不参与分组,分组之后人数要大于两个人:
        SELECT 性别,
        AVG(学科属性),
        COUNT(主键) 人数{在聚合函数后起名字} FROM 表 WHERE 学科属性 > 70 GROUP BY 性别属性 HAVING 人数{利用名字做判断} >2  

分页查询
    语法:
        limit 开始的索引(可以从0开始),每页查询的条数

    公式:
        开始的索引=(当前页码-1)*页面显示的条数

    分页操作是一个“方言”

    实例:
        表中每页显示3条记录           
            SELECT * FROM 表 LIMIT 开始的索引(可以从0开始),3

五、约束

约束
    概念:      
        对表中的数据进行限定,保证数据的正确性、有效性和完整性        
            保证数据是合理的
    约束分类:   
        1.主键约束:primary key  
        2.非空约束:not null     
        3.唯一约束:unique   
        4.外键约束:foreign key

非空约束(非空列的值不能为空):not null
    添加方式
        1. 创建表时添加非空约束         
            CREATE TABLE 表( 属性1 类型1,  属性2 类型2 NOT NULL -- 属性2是非空

        2. 创建完表后添加非空约束   
            ALTER TABLE 表 MODIFY 指定属性 属性类型 NOT NULL

        删除非空约束:
            ALTER TABLE 表 MODIFY 原有非空属性 新类型

唯一约束:UNIQUE  -- 唯一属性列其值不能重复,但在mysql中NULL可以在UNIQUE限定下出现多个
    唯一约束的添加:
        1.创建表时添加唯一约束   
            CREATE TABLE 表(属性1 类型1,属性2 类型2 UNIQUE

    在创建表之后添加唯一约束(先查看目标属性列中是否有(在mysql中除了NULL)重复值,有则处理重复值,再进行):
        ALTER TABLE 表 MODIFY 非唯一约束属性列 UNIQUE

    删除唯一约束:ALTER TABLE 表 DROP INDEX 含有唯一约束的属性列

主键约束
    1.注意:
        1.含义:非空且唯一;
        2. 一张表只能有一个字段为主键;
        3。 主键就是表中记录的唯一标识

    2.主键的添加:   
        A.在创建表时,添加主键约束:
            CREATE TABLE 表( 属性1 类型1 PRIMARY KEY, {-- 给属性1添加主键} 属性2 类型2)

        B.表创建完后,添加主键:
            ALTER TABLE 表 MODIFY 属性1,类型1 PRIMARY KEY

    主键的删除:
         ALTER TABLE 表 DROP PRIMARY KEY

自动增长:
    1. 概念:
        若某一列是数值类型的,使用AUTO_INCREMENT可以读取上一个值来完成值的自动增长,常和主键一起使用

    2. 主键的添加:   
        A.在创建表时,添加自动增长:
            CREATE TABLE 表1( 属性1 类型1 PRIMARY KEY AUTO_INCREMENT, {-- 给属性1添加主键} 属性2 类型2);
            INSERT INTO 表1 VALUES(NULL{属性1的值},属性2的值)

        B.表创建完后,添加自动增长:
            ALTER TABLE 表 MODIFY 属性1,类型1 AUTO_INCREMENT

        删除自动增长:
            ALTER TABLE 表 MODIFY {含有自动增长的}属性 类型

数据冗余,常见表现为:
    在一张表中非主键的单个属性列中,重复的部分太多,从而造成在若要修改重复的内容,只能一条记录一条记录地修改这样十分不方便。为解决此问题,要做一个表的拆分,将表拆分之后,将拆分的表通过外键进行关联。因此在创表的时候先创外键表,再建主键表外键约束:foreign key让表与表产生关系,从而保证数据的正确性(完整性)

    1. 在创建表时可以添加外键         
        语法:   
            CREATE TABLE 表(
                ...,
                外键列,
                CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCE 主表名称(主表列名称)
            );        

    2. 在创建完表后添加外键:
        ALTER TABLE 表 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCE 主表名称(主表列名称)

    删除外键: ALTER TABLE 表 DROP FOREIGN KEY 外键名称

外键值可以为NULL但不可以为不存在的值。

存在一个主表,一个外表,主表中的外键为外表中的主键。当外表中的主键值要进行修改时,直接对外表进行操作是不可以的,首先要将主表中的外键值设置为NULL,然后再对外表直接进行修改,当外表中的主键值修改完毕后,再将主表中的外键值从NULL修改为相应值。但这一操作十分麻烦,为解决这一麻烦,引入级联操作(但要谨慎使用)

级联操作
    1.添加级联操作(在创建时添加级联更新和删除,其中更新或删除可以单独使用):        
        语法:
            ALTER TABLE 表
            ADD CONSTRAINT 外键名称
            FOREIGN KEY (外键字段名称)
            REFERENCES 主表名称(主表列名称)
            ON UPDATE CASCADE ON DELETE CASCADE

    2.分类:
        A.级联更新:ON UPDATE CASCADE
        B.级联删除:ON DELETE CASCADE

以上是今日小节,不喜勿喷,感谢理解

相关链接:

【SQL基础学习】----基础篇(2)_lixxkv的博客-CSDN博客

你可能感兴趣的:(sql,mysql)