数据库常识

136 阅读8分钟

数据存储形式:

内存/文件/第三方服务器/数据库服务器/

数据库:

  1. 数据库是按照一定的形式来组织,存储数据,目的为了对数据操作——增删改查      
  2. 类型:关系型数据库、非关系型数据库
  3. 关系型数据库逻辑结构

Server    ->     Database         ->      Table       ->     Row   ->      Column服务器   ->      数据库          ->      数据表      ->      行    ->        列一个项目一个数据库

  1. 常见关系型数据库:MySQL  SQL Server  Oracle  DB2  SQLite  PostgreSQL
  2. mysql登录: 命令:mysql -u root -p     密码:123456
  3. SQL命令的两种执行方式
    • 交互模式:客户端输入一行,点击回车,服务器端执行一行,适用于临时性的查看数据。
    • 脚本模式:把要执行的多行SQL命令写在一个脚本中,一次性的提交给服务器执行,适用于批量的操作数据。 mysql -u root -p123456 < 文件地址
  4. mysql常用管理命令:
    • mysql -u root -p  登录数据库;
    • show databases;  显示服务器上当前所有的数据库;
    • quit;                    退出链接;
    • use 数据库名;    进入指定的数据库;
    • show tables;      当前数据库中所有的数据表;
    • desc 表名称;     描述表中有哪些表头
  5. 注释: # -- 单行注释  /*  */ ---多行注释

SQL语法规范:

  • 一条SQL语句可以跨越多行,以英文的分号结尾。
  • 假如某一条语句出现语法错误,则此条语句以及后边所有的语句不会再执行。
  • SQL命令不区分大小写,习惯上数据库关键字用大写,非关键字用小写。
  • SQL命令可以使用单行注释(#......)和多行注释(/……/),注释的内容不会被服务器所执行。

常用的SQL命令

    # 丢弃指定的数据库,如果存在的话
       DROP DATABASE IF EXISTS <数据库名>
    # 创建新的数据库
       CREATE DATABASES <数据库名>
    # 进入数据库
       USE <数据库名>
    # 创建保存数据的表
       CREATE TABLE <数据表名>(
           <表头名> <列类型>,
           <表头名> <列类型>,
           <表头名> <列类型>
      );
     # 插入数据
        INSERT INTO <数据表名>  VALUES(……);
        INSERT INTO <数据表名>(列名称,列名称,……)  VALUES(……);
     # 更新数据
        UPDATE <数据表名> SET <列名> = <数据值>  WHERE  <列名> = <数据值>
     # 删除数据
        DELETE FROM <数据表名> WHERE <列名> = <数据值>
     # 查询数据
       SELECT * FROM <数据表名>;

标准SQL语句分类

  • DDL:Data Define Language 定义数据结构
    • CREATE - 创建数据库/DROP – 丢弃数据库/ALTER – 更改列的数据类型
  • DML:Data Manipulate Language 操作数据
    • INSERT – 插入数据/UPDATE – 更新数据/DELEET – 删除数据
  • DQL:Data Query Language 查询数据
    • SELECT- 查询数据
  • DCL:Data Control Language 控制用户权限
    • GRANT – 授权/REVOKE – 收权

解决MySQL存储中文乱码

  •  SQL脚本另存为的编码
  •  客户端链接服务器端的编码(SET NAMES UTF8)
  •  服务器连接创建数据库使用的编码(CHARSET=UTF8)

MySQL中的列类型

数值型:

  • TINYINT —— 微整型 —— 占1个字节(8个二进制位) —— -128 ~ +127
  • AMALLINT —— 小整型 —— 占2个字节(16个二进制位) —— -32768 ~ 32767
  • INT —— 整数 —— 占4个字节(32个二进制位) —— -2147483648~2147483647
  • BIGINT —— 大整型 —— 占8个字节(64个二进制位)
  • FLOAT —— 单精度浮点数 —— 占4个字节 —— 3.4E38 —— 可能产生计算误差
  • DOUBLE —— 双精度浮点数 —— 占8个字节 —— 可能产生计算误差
  • DECIMAL(M,D) —— 定点小数,不会产生计算误差 —— M:总的有效位数(不包括小数点),D:小数点后的有效数。
  • BOOL —— 布尔型 —— TRUE/FALSE —— 真正存储的时候会变成TINYINT,TURE和FALSE会变成1和0,使用的时候也可以直接插入1和0。

日期时间型:

  • DATE——日期型——‘YYYY-MM-DD’
  • TIME——时间型——‘HH:MM:SS’
  • DATATIME——日期时间型——‘YYYY-MM-DD HH:MM:SS’

字符串类型:

  • VARCHAR(M) —— 变长字符串 —— M最大65535,不会产生空间浪费
  • CHAR(M) —— 定长字符串 —— M最大值255,可能存在空间浪费,操作速度比较快 —— 用于存储固定长度,例如手机号或者身份证号等
  • TEXT(M) —— 大型变长字符串 —— M最多2G

列约束:

MySQL在插入数据的时候,进行特定的验证;只有满足条件在允许插入,否则被认为是非法插入。

主键约束:

  • 声明了主键约束的列上值不能出现重复,并且不允许为NULL
  • 一个表格中只能有一个主键,通常加在编号列
  • 表中查询的记录会按照编号的从小到大排序,加快查找速度

使用方法:在列类型后面加 —— PRIMARY KEY

查看主键约束:desc <数据表名> ---显示的表格里key的值为PRI

非NULL约束:

  • 声明了非空约束的列上,不允许使用NULL

使用方法:在列类型后面加 —— NOT NULL

查看非NULL约束:desc <数据表名> ---显示的表格里NULL的值为NO

唯一约束:             

  • 声明了唯一约束的列上不能插入向重复的值,允许使用NULL,并且可以使用多个NULL

使用方法:在列类型后面加 —— UNIQUE

查看唯一约束:desc <数据表名> ---显示的表格里key的值为UNI

默认值约束

  • 可以使用DEAFULT关键字声明的默认值,有两种数据插入方法:
  • INSERT INTO <数据表名> VALUES(1,DEFAULT,……);
  • INSERT INTO <数据表名>(列名1,列名2……) VALUES(数值,数值,……); --- 给特定的列插入值,其他的列全部使用默认值            

使用方法:在列类型后面加 —— DEFAULT  ‘默认值‘

查看唯一约束:desc <数据表名> ---显示的表格里Default的值为默认值

检查约束

  • 检查约束可以对插入的数据进行自定义的验证
  • MYAQL不支持检查约束,会降低数据的插入速度

使用方法:在列类型后面加 —— CHECK(检查声明)    eg: CHECK (score >= 0 AND score <= 100)

外键约束

  • 声明了外键约束的列上,取值必须在另一个表主键列上出现过,两者的列类型保持一致,允许使用NULL。

使用方法: FOREIGN KEY(列名) REFERENCES <数据表名>(主键列名)

查看外键约束:desc <数据表名> ---显示的表格里KEY的值为MUL

自增列:AUTO_INCREMENT

  • 自动增长,假如一个列声明了自增列,无需手动赋值,赋值为NUL,会自动获取当前的最大值,然后加1插入。
  • 只适用于整数型的主键列,允许手动赋值

使用方法:在列类型后面加 —— AUTO_INCREMENT

查看自增列:desc <数据表名> ---显示的表格里Extra的值为auto_increment

查询:

  1. 查询特定的列:select <列名1>,<列名2> from <数据表名>

  2. 查询所有的列:select * from <数据表名>

  3. 给列起别名:select <列名> as <别名> from <数据表名>

    • 在起别名的时候,AS关键字是可以省略的,保留空格
  4. 显示不同的记录/合并相同的项(去重):select distinct <列名> from <数据表名>

  5. 查询时执行计算:select <列名 + 计算公式> from <数据表名> eg : select salary *12 from emp;

  6. 查询结果集排序:select * from <数据表名> order by <列名> asc/desc;  —— asc 升序,desc 降序

    • Order by 可以按照数值、日期时间、字符串排序、默认是升序排列(ASC)
  7. 条件查询:select * from <数据表名> where <条件>    eg : select * from emp where eid = 5;

    • 比较运算符:>、<、>=、<=、=、!=、(is null)、(is not null)、and、between…and…、or、[IN(值1,值2,……)]、[not in (值1,值2,……)]
  8. 模糊条件查询:select * from <数据表名> where <列名> like ……;  

    • _ 代表占一个字符  %代表占多个字符
  9. 分页查询:select * from <数据表名> limit start,count;    eg:select * from emp limit 0,5;

    • start:开始的值 = (当前页码 – 1 ) * 每页的数据量,count:每页的数据量
  10. 复杂查询:

    • 聚合函数:count 总数量/sum 总和/avg 平均值/max 最大值/min 最小值/year 获取日期中的年份/month 取日期中的月份/
      • eg: 查询出1991年出生的员工有哪些 —— select * from emp where year(birthday) = 1991;
    • a.聚合查询:select count(<列名>) from <数据表名>; —— 不包括null数据       
      • eg:select count(eid) from emp;
      • select count(*) from <数据表名>; —— 包括null数据;
    • b.分组查询:只能查询分组条件个聚合函数
    • c.子查询:把一个查询语句的结果作为另一个查询语句的条件。
      • eg: 查询出研发部所有的员工有哪些 —— select * from emp where deptid = (select did from dept where dname=”研发部”);
      • 步骤1:查询出研发部门的编号(10)  select did from dept where dname = “研发部”;
      • 步骤2:查询出研发部的员工  select * from emp where deptid = 10;
  11. 多表查询:select <列名1>,<列名2> from <数据表1>,<数据表2> where <主键> = <外键>