MySQL简介及其常用语法

MySQL下载:

        链接:MySQL :: MySQL Community Downloads

什么是数据库?

        长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据“仓库”         

MySQL数据库的特点 

        开源免费,小巧但功能齐全

        可在Windows和Linux系统上运行

        操作方便,适用于中小型甚至大型网站应用

DDL语句操作数据库

         1. 查看数据库
            show databases;

        2. 创建数据库
            create database 数据库名;

        3. 删除数据库(危险操作)
            drop database 数据库名;

        4. 使用数据库
            use 数据库名;

DDL创建数据库表

 CREATE TABLE 表名 (
    字段名1 字段类型 [ 属性 ] [ 索引 ] [注释] ,
    字段名2 字段类型 [ 属性 ] [ 索引 ] [注释] , 
    … … 
     字段名n 字段类型 [ 属性 ] [ 索引 ] [注释]
    ) [ 表类型 ] [ 表字符集 ] ;
    [ ]  包含的内容可以省略;

常用字段类型

    char(M):
         固定长字符串,检索快但费空间, 0 <= M <= 255
    varchar(M):
         可变字符串0 <= M <= 65535
    tinyint【taɪni】:
         非常小的数据 有符值: -2 ^7 ~ 2^7-1,无符号值:0 ~ 28-1 1字节
    int :
        标准整数 有符值: -2^31 ~ 2^31-1,无符号值:0 ~ 2^32-1 4字节
    bigint:
         较大的整数 有符值: -2^63 ~2^63-1,无符号值:0 ~2^64-1 8字节
    Decimal(钱)【desɪml】:
        字符串形式的浮点数 decimal(m, d)
    DATETIME:
         YY-MM-DD hh:mm:ss 1000-01-01 00:00:00 至9999-12-31 23:59:59

数据库设计的三大范式

    一、什么是范式
            为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就叫做范式。
    二、约束作用
            数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
    三、三范式
            第一范式:确保每列保持原子性
            第二范式:确保表中的每列都和主键相关
            第三范式:确保每列都和主键列直接相关,而不是间接相关约束

DML数据操作语句和基本的DQL语句

增加数据(INSERT语句)
    INSERT INTO `表名` [(`字段1`,`字段2`,...`字段n`)] VALUES/VALUE ('值1','值2',...'值n')[,('值1','值2',...'值n')...];
增加数据(INSERT INTO SELECT )
    INSERT INTO table2(column_name,...)SELECT column_name,...FROM table1;
修改数据(UPDATE语句)
    UPDATE 表名 SET `字段名1` = '值1' [ , `字段名2` = '值2', …. ] [ WHERE 条件];
删除数据(DELETE语句)
    DELETE FROM 表名 [ WHERE 条件];    
删除数据(TRUNCATE语句)
    TRUNCATE [TABLE] 表名
    功能:清空某一张表内的全部数据,重置自增计数器;
    特点:由于没有条件约束,所以速度快,而且效率高。

查询语句语法规则
    SELECT [DISTINCT]
    {*|表1.*|[ 表1.字段1 [as 字段别名1]
    [, 表1.字段2[as 字段别名2]][, …]]}
    FROM 表1 [ as 表别名 ]
    [ left|right|inner join 表2 on 表之间的关系 ]
    [ WHERE ]
    [ GROUP BY ] 
    [ HAVING]
    [ ORDER BY]
    [ LIMIT {[ 位置偏移量,] 行数 }] ; 

GROUP BY分组
    对所有的数据进行分组统计;
    分组的依据字段可以有多个,并依次分组。
HAVING
    与GROUP BY结合使用,进行分组后的数据筛选
ORDER BY排序
    SELECT * FROM 表名 ORDER BY 字段名 [DESC|ASC]
LIMIT关键字(分页)
    SELECT * FROM 表名 LIMIT [n , m ] (n表示当前页页码,m表示当前页步长及显示数据条数)
MySql8新关键词OFFSET
    SELECT * FROM 表名 limit m offset n
    n 表示第一条记录的偏移量,m 表示显示记录的数量;

 表别名和字段别名 (AS可省略)
    SELECT 表别名.字段名1 AS 字段别名1, 表别名.字段名2 AS 字段别名2 FROM 表名 AS 表别名
DISTINCT(去重,当所有列的值都相等时)
    SELECT DISTINCT 字段名1, 字段名2... FROM 表名
WHERE条件子句
    SELECT * FROM 表名 [ WHERE 条件];
LIKE 关键字
    SELECT * FROM 表名 WHERE 字段 LIKE 条件;
IN 关键字
    SELECT * FROM 表名 WHERE 字段 IN (值1,值2...);
NULL 值查询
    SELECT * FROM 表名 WHERE 字段 IS NULL

    SELECT * FROM 表名 WHERE 字段 IS NOT NULL

常用的聚合函数

        函数名                 返回值
    AVG(col)           返回指定列的平均值
    COUNT(col)     返回指定列中非NULL值的个数
    MIN(col)           返回指定列的最小值
    MAX(col)          返回指定列的最大值
    SUM(col)         返回指定列的所有值之和

高级DQL数据查询语句

多表联查
    非等值查询:SELECT * FROM 表1,表2
    等值查询:SELECT * FROM 表1,表2 WHERE 表1.字段1 = 表2.字段2...
连接查询
    SELECT * FROM 表1 LEFT|right|INNER JOIN 表2 ON 条件
    LEFT JOIN:从左表(表1)中返回所有的记录,即便在右(表2)中没有匹配的行。
    RIGHT JOIN:从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
    INNER JOIN:在表中至少一个匹配时,则返回记录。
UNION(两个查询的并集)
    语法:
    select A.field1 as f1, A.field2 as f2 from
    union 
    (select B.field3 as f1, field4 as f2 from B)
    order by 字段 desc/asc
    注意:
    1列名不一致时,会以第一张表的表头为准,并对其栏目。
    2会将重复的行过滤掉。
    3如果查询的表的列数量不相等时,会报错。
    4在每个子句中的排序是没有意义的,mysql在进行合并的时候会忽略掉。
    5如果子句中的排序和limit进行结合是有意义的。
    6可以对合并后的整表进行排序
UNION ALL(表的并集,不过滤重复值)
    语法:
    select A.field1 as f1, A.field2 as f2 from
    union all
    (select B.field3 as f1, field4 as f2 from B)
    order by 字段 desc/asc
子查询
    where 子查询
    -- 查询id最大的一个学生(使用where子查询实现)
    select * from student where sid = (select max(sid) from student)
    -- 查询每个班下id最大的学生(使用where子查询实现)
    select * from student where sid in (
     select max(sid) from student group by classid
    )
    -- 子查询(where 子查询)学过张三老师课程的学生
    select * from student where sid in(
          select sid from sc where cid = (
               select cid from course where tid=(
                  select tid from teacher where tname ='张三'
              )
        )
    )
    -- 没学过张三老师课程的学生信息
    select * from student where sid not in(
          select sid from sc where cid = (
               select cid from course where tid=(
                  select tid from teacher where tname ='张三'
              )
        )
    )
from 子查询
    -- 查询大于5人的班级名称和人数(不使用子查询)
    select classname,count(sid) from class
    left join student on class.classid = student.classid
    group by classname having count(sid) > 5
    -- 查询大于5人的班级名称和人数(使用from型子查询)
    select classname,c from class
    left join (select classid,count(sid) c from student
    group by classid) t
    on class.classid = t.classid
    where c > 5
exists 子查询
    -- 学生表中有性别为外星人的同学就查询出所有的老师
    select * from teacher
    where exists (select * from student where ssex = '外星人')    
any, some子查询:
    表示满足其中任意一个条件
    假设any内部的查询语句返回的结果个数是三个,
        如:result1,result2,result3,那么,
            select ...from ... where a > any(...);
        ->相当于:
            select ...from ... where a > result1 or a > result2 or a > result3;
    some 是 any的别名,所以用法是一样的,可以替代使用
all 子查询
    假设any内部的查询语句返回的结果个数是三个,
    select ...from ... where a > all(...);
    ->
    select ...from ... where a > result1 and a > result2 and a > result3;
流程控制函数,语句
    函数            语句    
    IF(value,value1,value2)    如果value 的值为TRUR 返回value1,否则返回value2
    IFNULL(value,value1,value2)    如果value 的值不为NULL 返回value1,否则返回value2
case when then end语句
    (1)简单Case函数
    select stuid,stuname, 
        case stusex
            WHEN 1 THEN '男' 
            WHEN 0 THEN '女' 
            ELSE '其他' 
        end ,
        stuaddress from student;
    (2) Case搜索函数
    select stuid,stuname,
        case 
        WHEN stusex = 1 THEN '男'
        WHEN stusex = 0 THEN '女'
        ELSE '其它' 
        END,
        stuaddress from student

 

你可能感兴趣的:(mysql,数据库)