欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql数据库基础

程序员文章站 2023-02-20 14:24:52
mysql数据库什么是mysql?MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一MySQL 是开源的,所以你不需要支付额外的费用。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Pyth...

mysql数据库

  • 什么是mysql?
    • MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
    • MySQL 是开源的,所以你不需要支付额外的费用。
    • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
    • MySQL 使用标准的 SQL 数据语言形式。
    • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
    • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
    • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
    • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
  • 什么是数据库?
    • 是按照数据结构来组织、存储和管理数据的仓库。使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。
  • 关系型数据库
    • 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
  • RDBMS 即关系数据库管理系统的特点:
    • 1.数据以表格的形式出现
    • 2.每行为各种记录名称
    • 3.每列为记录名称锁对应的数据域
    • 4.许多行和列组成一张表单
    • 5.若干的表单组成database
  • RDBMS 术语
    • 数据库: 数据库是一些关联表的集合。
    • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
    • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
    • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
    • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
    • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
    • 外键:外键用于关联两个表。
    • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
    • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
    • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

mysql数据库操作

  • 针对数据库的增删改查:

    • 创建数据库
        #语法
        CREATE DATABASE 数据库名 
    
        mysql> CREATE DATABASE DD1
        >>> Query OK, 1 row affected (0.00 sec)
        
        CREATE DATABASE 数据库名 charset = "指定编码格式" 
    
    • 查询数据库
    #语法
        SHOW DATABASES  #查询所有数据库
    
        SHOW DATABASES;
    >>>
        +--------------------+
        | Database           |
        +--------------------+
        | db1                |
        | DBT1               |
        | DD1                |
        | information_schema |
        | mysql              |
        | performance_schema |
        | sys                |
        | testdb2            |
        +--------------------+
        8 rows in set (0.01 sec)
    
    
    • 删除数据库
        #语法  
        DROP DATABASE 数据库名; 
    
    >>>
        sql> DROP DATABASE DD1;
        Query OK, 0 rows affected (0.01 sec)
    
  • 针对表的增删改查

    • 增加表

      create table t1(id int,name char(4))
      
    • 查询表

      show tables # 查看当前库下的所有表名
      
    • alter table t1 rename t2
      
    • drop table t1
      
  • 针对表的增删改查

    在操作表之前一定要用use语句选择你要操作的数据库

    • 创建数据表
    #语法
        CREATE TABLE table_name(
            字段名1,数据类型[列级别的约束条件][默认值]
            字段名2,数据类型[列级别的约束条件][默认值]
            字段名2,数据类型[列级别的约束条件][默认值]
            ·····
        );
    >>
    mysql> CREATE TABLE tb_tese(id int,name char);
    Query OK, 0 rows affected (0.01 sec)
    
    • 查询数据表
    #语法
        DESCRIBE 表名
    >>>
        mysql> DESCRIBE tb_tese;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int     | YES  |     | NULL    |       |
    | name  | char(1) | YES  |     | NULL    |       |
    +-------+- --------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    • 删除数据表
    #语法
    DROP TABLE 表名
    >>>
    mysql> DROP TABLE tb_tese;
    Query OK, 0 rows affected (0.01 sec)
    
    • 修改数据表
    #语法
    ALTER TABLE 旧表名 RENAME 新表名 
    >>>
    mysql> ALTER TABLE tb_tase RENAME tb_alter;
    Query OK, 0 rows affected (0.01 sec)
    #插曲新表名,看看是否可以查询得到
    mysql> DESC tb_alter ;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int     | YES  |     | NULL    |       |
    | name  | char(1) | YES  |     | NULL    |       |
    | age   | char(1) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
  • 针对数据的增删改查

    • 查询数据
    #语法
    SELECT * FROM 表名
    >>
    mysql> select * from tb_alter;
    +------+--------+------+
    | id   | name   | age  |
    +------+--------+------+
    |    1 | 张三   |   14 |
    +------+--------+------+
    1 row in set (0.00 sec)
    
    • 新增数据
    #语法
    INSERT INTO 表名(字段名1,字段名2···) VALUES (values1,values2···)
    >>>
    mysql> INSERT INTO tb_alter (id,name,age) values(1,"张三",14);
    Query OK, 1 row affected (0.00 sec)
    
    • 修改数据
    #语法
    UPDATE table_name SET field1=new-value1, field2=new-value2
    >>>
    mysql> UPDATE tb_alter SET name = "lisi";
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    • 删除数据
    #语法
    DELETE FROM 表名 WHERE ClAUSE
    >>>
    mysql> DELETE FROM tb_alter WHERE ID = 1;
    Query OK, 1 row affected (0.00 sec)
    
    
    

mysql数据类型

  • 数值类型
    • MySQL支持所有标准SQL数值数据类型。
      这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
      关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
      BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
      作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
  • 字符串类型
    • 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
  • 日期和时间类型
    • 表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    • 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时

mysql的约束

主键约束 :又称为主码,是表中一列或者多列的祝贺,主键约束(PRimary Key Constrint)要求主键列数据唯一,并且不能为空。主键能够唯一标识表中的兔兔爱葫芦,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度,主键和记录之间的关系如同身份证和人之间的关系,他们之间是一一对应的。主键分为两种类型:单字段主键和多字段主键

  • 单字段主键是指主键有一个字段组成,SQL语句格式分为以下两种情况

    • 在定义的列的同时定义主键

      字段名 数据类型 PRIMARY KEY[默认值]

      CREATE TABLE tb_tmp
      (
          id  int(11) PRIMARY KEY,
          name varchar(30),
          age int(11),
      )
      
    • 在定义所有列之后指定主键

      [CONSTRAINT <约束名>] PRIMARY KEY [字段名]

      CREATE TABLE tb_emp1
      (
          id  INT(11),
          name VARCHAR(30)
          PRIMARY KEY(id)
      )
      
  • 多字段联合主键是指主键由多个字段联合组成

    PRIMARY KEY[字段1,字段2,···,字段n]

    CREATE TABLE tb_emp2
    (
        id INT(10),
        name VARCHAR(25),
        depid INT(10),
        PRIMARY KEY(id,depid)
    )
    

外键约束:外键是用来在两个表的数据库之间建立连接,他可以是一列或者多列,一个表可以有一个或者多个外键,外键对应的是参照完整性,一个表的外键可以为空值,若补位空值,则每一个外键值必须邓毅另一个表中主键的哪个值

  • 外键:是表中的一个字段,他可以不是本表的主键,但对应另外一个表的主键。外键的主要作用是保证数完整性,定义外键后不能删除在另一个表中有关联联系的

  • 主表(父表):对于两个有关联关系的表而言,相关联字段中主键所在的哪个表是主表

  • 从表(从表):对于两个有关联关系的表而言,相关联字段中外键所在的哪个表是从表

  • 创建外键的语法规则:

    CONSTRAINT <外键名> FOREIGN KEY 字段名1 REFERENCES<主表名> 主键列1

        CREATE TABLE tb_emp2
    (
        id INT(10),
        name VARCHAR(25),
        depid INT(10),
        CONSTRAINT fk_emp2_depid FOREIGN KEY depid REFERENCES tb_emp1 id
        ON UPDATE CASCADE id    #同步更新
        ON DELETE CASCADE id    #同步删除
    
        ##上述语句执行后就是在表tb_emp上添加了一个名叫fk_emp2_depid的外键约束,外键名称为deptid,它依赖于tb_emp1表中的主键id
    )
    

    子键的外键必须关联附表的主键,切挂念字段的数据类型必须陪陪,如果类型不一样,则创建子表时就会出现错误提示

非空约束:非空约束(NOT NULL Constraint)是指字段的值不能玩诶空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错

  • 语法规则:

    字段名 数据类型 NOT NULL

    CREATE TABLE tb_emp2
    (
        id INT(10),
        name VARCHAR(25) NOT NULL,
        depid INT(10),
        PRIMARY KEY(id,depid)
    )
    

唯一性约束:要求该列为一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者级列都不出出现重复值

  • 语法规则

    (1)字段名 数据类型 UNIQUE

     CREATE TABLE tb_emp2
    (
        id INT(10),
        name VARCHAR(25)NOT NULL UNIQUE,
        depid INT(10),
        PRIMARY KEY(id,depid)
    )
    

    (2)CONSTRAINT 约束名 UNIQUE 字段名

      CREATE TABLE tb_emp2
    (
        id INT(10),
        name VARCHAR(25)NOT NULL,
        depid INT(10),
        PRIMARY KEY(id,depid)
        CONSTRAINT UU UNIQUE(name)
    )
    

默认约束:指定某列的默认值。如果男性同学较多,性别就可以默认为“男”。如果插入一条新纪录是没有为这个字段赋值,那么系统就会自动为这个字段赋值为“男”

  • 语法规则

    字段名数据类型 DEFAULT 默认值

     CREATE TABLE tb_emp2
   (
       id INT(10),
       name VARCHAR(25)NOT NULL,
       depid INT(10) DEFAULT 111,
       PRIMARY KEY(id,depid)
       CONSTRAINT UU UNIQUE(name)
   )

设置数据表的属性值自动增加:在MYSQL中,默认情况下AUTO_INCREMENT出事值为1,没新增一条记录,字段自动加1

  • 语法规则

    字段名 数据类型 AUTO_INCREMENT

      CREATE TABLE tb_emp2
    (
        id INT(10)PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(25)NOT NULL,
        depid INT(10) DEFAULT 111,
        PRIMARY KEY(id,depid)
        CONSTRAINT UU UNIQUE(name)
    )
    

查询语句详解

  • 基本查询语句:MySql提供select语句进行数据库查询,该语句使用当时灵活,功能丰富,语法如下

    SELECT 属性列表 FROM 表名或视图名 [WHERE 表达条件式] [GROUP BY 属性名 [HAVING 条件表达式]] [ORDER BY 属性名[ASCIDESC]]

    select 语句的含义是根据where子句的条件表达式,从from子句指定的基本表或试图中查找满足条件的记录,如果有group by子句,则将结果按照group by子句后的属性进行分组,该属性值相等的记录分为一组,一般会在每组上使用举个函数进行统计,如果在group by子句后带having断句,则只有满足having后面表达式的组才予输出。如果有order by子句,则会根据order by子句后面的属性进行圣墟或降序排列

  • 查询表中部分字段

    • 如果只需要表中的部分字段的数据,可以通过select子句指定那些字段出现在结果中。不同字段之间用逗号(,)分割,最后一列后面不需要加逗号
     select id, name, age from student
    
  • 查询表中全部字段

    • 1.在select子句中将所有的字段都列出
    select id, name, age, adress from student
    
    • 2.将select子句中的属性列表指定为”*“,该符号代表所有列
    select * from student
    
  • 查询经过计算的值(也就是我们可以在select子句中进行运算)

    • select子句后面不仅可以是表中的基本字段,也可以是表达式
    - 查询
    select name, year(now())-age from student
    
    #查询结果中的year(now())为函数嵌套,now()函数获取系统如期,year可以获取参数的年份,year(now())的结果为系统日期的年份,year(now())-age得到的是学生的出生年份
    
    #为查找结果设置别名
    select name, year(now())-age as bir
    from student
    
    #直接在查询结果中写表达式
    select stu_id,now() from student
    
  • 查询表中的若干记录

    • DISTINCT:清除取值重复的行,表中的记录没有重复,但是经过查询有重复,可以使用DISTINCT来消除重复行
    select distinct[要去重的字段]  from 查询表
    
    • 查询表中满足条件的记录

      操作符 描述
      = 等号,检测两个值是否相等,如果相等返回TRUE
      <>,!= 不等于,检测两个值是否相等,如果不相等返回True
      > 大于号,检测左边的值是否大于右边的值
      < 小于号,检测左边的值是否小于右边的值
      >= 大于等于号,检测左边的值是否大于等于右边的值
      <= 小于等于号,检测左边的值是否小于等于右边的值
    • 确定范围(between···and | not between ··· and)

      • 如果查询条件为某个字段或不在某个范围,可以使用谓词between···and或者not between and,其中between后面为下限,and后面为上限
    • 带in关键字的查询

    select * from student where age in (12,20,23)
    # 相反,可以用not in 来查询不属于指定集合的记录
    
    • like的字符匹配查询
        [not] like '<匹配串>'
    
    • 查询空值
    select * from student where name is null
    
    • 多重条件查询
      • 可以使用运算逻辑符and或者or来连接多个查询条件,and的优先级要高于or,可以使用括号来改变优先级的顺序
      #查询数据库中年龄18岁并且分数在80以上的学生
      select * from student where age > 18 and garde >80
      
      #查询计算机系或者经贸系的学生
      select * from student where sdept = '计算机系' or sdept = '经贸系'
      
      
  • order by排序

    • 使用order by子句对查询结果进行排序,可以根据一列或者多列对结果进行升序或者降序排列
    #对查询出的结果根据age进行排序
    select id, name, age from student 
    order by age desc 
    
  • 统计函数:

    • 在实际项目中,需要通过表中的基本数据进行统计,比如求某列值的和,某列值得平均值等。mysql提供统计函数进行统计

      函数 说明
      AVG(列名) 返回某列的平均值
      COUNT(*) 返回记录的行数
      COUNT(列名) 返回一列中指的个数
      MAX(列名) 返回某列最大的值
      MIN(列名) 返回某列最小的值
      SUM(列名) 返回某个列之和
  • GROUP BY

    • 将查询结果根据某一列或者多列的值进行分组,值相等的为一组,分组的目的一般与统计相关
    • 单字段返祖
      #统计不同系别的学生
      select sdept,count(*) as count _sdept
      from student
      group by sdept
      # 将查询结果根据sdept的值进行分组
      
    • 多字段分组
    select ssex,sage count(*)
    from student
    group by ssex,sage
    
    # 此查询根据性别分为两组,然后在女生中根据年龄再次分组,男生也根据年龄再次分组
    
  • HAVING子句

    • 可以使用HAVING子句对组进行筛选,得到符合条件组的信息。
    select sno,avg(grade)
    from sc
    group by sno
    having avg(grade)>80
    
    #根据sno将学生的选秀课程的成绩信息进行分组,然后统计每组的平均成绩,最后筛选出成绩大于80的分组信息
    

mysql连接查询

  • 设计两个表或者两个表以上的被称为连接查询。连接查询是关系数据库中最重要的查询类型。连接查询分为内连接查询,外连接查询和复合条件查询。
    • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
    • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
    • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
    select s.no,sname,cno,grade
    from student s inner join sc 
    no s.sno = sc.sno
    # 在参加连接的表中间加上inner join,连接条件使用on 关键字给出,连接条件是相同的
    

本文地址:https://blog.****.net/zyh990214/article/details/107315346