MySQL入门(1)

584 阅读9分钟

一、数据库概述

1、定义
  存储数据的仓库

2、意义

  用于保存和管理数据,便于检索(查询)存储的数据记录

3、常用的关系型数据库系统:

  所谓的关系型数据库系统指存储的数据之间存在关联关系
  (1)MySQLl--免费(Oracle的产品)
  (2)Oracle--甲骨文,个人版和开发版免费,商业版收费
  (3)Ms SqlServer--微软的数据库系统 个人版免费,商业版收费
  (4)sqllite--嵌入式数据库系统,主要用于手机和数控机床以及各种android设备
  (5)DB2--IBM公司数据库系统,主要用于工作站级得服务器系统

4、非关系型数据库系统:

  存储的数据都是独立的,无任何关联
  (1)Redis(用于缓存数据)
  (2)MongoDB(用JSON格式存储数据)

5、DBMS--数据库管理系统(DataBase Manager System)

  (1)用于操作管理数据库系统的软件或者应用程序,都称为数据库管理系统
  (2)数据库管理系统主要是针对数据库中的数据进行操作

二、MySQL概述

1、开源免费 2、小巧,功能齐全 3、无系统平台的限制(支持win、linux、mac)

三、MySQL的安装

1、准备MySQL的安装软件
2、设置字符编码为utf8
3、MySQL端口号为3306
4、安装完成以后,查看管理工具中的MySQL服务是否启动

四、使用sqly数据库管理工具

1、安装sqlY
2、启动sqlY链接MySQL数据库(连接前一定要启动MySQL服务)
3、图形化的数据库管理工具

五、创建数据库和表

1、创建数据库语法 CREATE DATABASE 数据库名;选中后按F8键执行

2、打开数据库 USE 数据库名;选中后按F8键执行

3、创建表的语法(当想在一个表不存在时创建它,应该在表名后给出IF NOT EXISTS

CREATE TABLE 表名(
    字段1 类型[(长度)] 约束,
    字段2 类型[(长度)] 约束,
    	    ....
    字段n 类型[(长度)] 约束
    );

约束主要包含:
(1)主键约束(PRIMARY KEY,主键值必须唯一,即表中必须具有唯一的主键值)
(2)主键自增(AUTO_INCREMENT)
(3)不能为空(NOT NULL)
(4)唯一约束(UNIQUE)
(5)检查约束(CHECK 约束条件)
(6)外键约束(FOREIGN KEY (外键字段)REFERENCES 主表(主键字段))
(7)缺省约束(DEFAULT 指定默认值)
(8)引擎类型(ENGINE=InnoDB / MyISAM)
例如:

CREATE TABLE student(
    sid INT PRIMARY KEY AUTO_INCREMENT,##主键自增
    sname VARCHAR(50) NOT NULL,
    sex VARCHAR(4) DEFAULT '男',
    address VARCHAR(50),
    birthday DATE
    );

4、向表中插入数据:INSERT INTO 表名(字段1,...,字段n) VALUES(值1,...,值n);

5、查询所有的记录SELECT * FROM 表名;
  查看表的结构 DESC 表名;

6、 删除表DROP TABLE 表名;
    删除数据库 DROP DATABASE 数据库名;
  显示所有数据库SHOW DATABASE;

六、MySQL的构成

1、表文件(数据库文件xxx.myd)
2、表结构文件 (xxx.myi)
3、数据文件(数据库文件xxx.frm)

七、修改表的结构

(1)修改表的名称
  ALTER TABLE 旧名称 RENAME AS 新名称;

(2)修改表结构,添加新的字段
  ALTER TABLE 表名 ADD 字段名 类型[(长度)];

(3) 修改字段
  ALTER TABLE 表名 MODIFY 字段名 类型[(长度)] [NOT NULL];--仅用于修改字段的长度和类型,字段名不能改
  ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型[(长度)] [NOT NULL];--用于修改表的字段名称

(4)删除字段
  ALTER TABLE 表名 DROP 字段名;

(5)删除表
  DROP TABLE 表名; 注意:在修改表结构时,建议表中不能有数据存在。

八、关联表的建立

1、一张表的数据需要参考另一张表的数据来保证数据的安全性
2、使用外键约束表的数据
  (1)外键指参考另一张表的主键字段值FOREIGN KEY
  例如:学生表需要参考班级表的主键字段值,所以,此处将班级表称为学生的主表,学生表称为班级表的子表
  供应商vendors表中每个供应商具有唯一标识称为主键(primary key),产品products表,除了存储供应商ID(供应商vendors表中的主键)外不存储其他供应商信息,供应商vendors表的主键又叫products表的外键(foreign key)

  (2)创建表并加入外键关联

        CREATE TABLE 主表(  
             主键字段 类型 PRIMARY KEY  AUTO_INCREMENT,  
             字段2 类型   );
	CREATE TABLE 子表(
             主键字段 类型 PRIMARY KEY  AUTO_INCREMENT,
             字段2 类型...,
                  ....
	     	 外键字段  类型  NOT NULL,
             CONSTRAINT 外键约束名称 FOREIGN KEY(外键字段) REFERENCES 主表(主表主键字段)
	  );

  (3)修改表的结构添加外键关联
    ALTER TABLE 子表名 ADD CONSTRAINT外键约束名称 FOREIGN KEY (外键字段) REFERENCES 主表(主表主键字段);
  (4)主子表的关联关系又称为一对多的关联关系,其中主表是1,子表是多

  注意:在删除主表数据时,先要删除子表中与主表有关联的子表数据,才能删除主表的记录

九、DML语言(数据管理语言)

1、插入数据
  INSERT INTO表(字段列表) VALUES(值列表);
  插入检索出的数据
  INSERT SELECT INSERT INTO a表(字段列表) SELECT 字段列表 FROM b表

2、修改更新表中的数据 (UPDATE语句要以WHERE子句结束,它告诉MySQL修改哪一行,否则会修改表中所有行)
  UPDATE 表名 SET 字段1=值1, ... ,字段n=值n [WHERE 字段=值];

3、删除数据 (DELETE语句是删除表的内容而不是表)
  DELETE FROM 表名 [WHERE 字段=值];

  MySQL没有撤销(undo)按钮,通过WHERE子句谨慎使用UPDATE、DELETE语句

十、过滤数据(WHERE子句表示检索符合条件的记录)

1、条件运算符
  WHERE 字段 >、 =、<、<=、>=、!=、< >、BETWEEN
  (1)查询空值
  SELECT... FROM 表 WHERE字段 IS NULL;
  (2)BETWEEN查询(只适用于数值型数据字段的查询)
  SELECT... FROM 表 WHERE 字段 BETWEEN 值1 and 值2
等同于
  SELECT... FROM 表 WHERE字段 >=值1 AND 字段<=值2
2、逻辑运算符AND、OR
  AND:并且
  OR: 或者
   SELECT prod_name,prod_price FROM products WHERE (vend_id=1002 OR vend_id=1003) AND prod_price>=10;
  使用具有AND和OR操作符的WHERE子句时,由于SQL对AND的计算优先级高于OR,因此应该使用圆括号( )来分组操作符
3、IN、NOT操作符
  IN的查询(可适用于字符类型的范围查询)
   SELECT... FROM 表 WHERE 字段 IN ('值1','值2',...,'值n');

十一、删除数据

TRUNCATE命令: 用于完全清空表数据,但表结构、索引、约束等不变
     TRUNCATE TABLE 表名;
区别于DELETE命令: 都能删除数据、不删除表本身,但TRUNCATE 速度更快
使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器
使用TRUNCATE TABLE不会对事务有影响

十二、排序数据(ORDER BY子句)

ORDER BY子句:对SELECT语句检索出数据进行排序(默认ASC升序),当使用降序排序时必须指定DESC关键字
ORDER BY子句位置:ORDER BY子句应保证位于FROM子句之后,如果使用LIMIT,则LIMIT必须位于ORDER BY之后
  SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

十三、数据查询语言(DQL)

1、查询的一般语法
  SELECT 字段 FROM表名 [WHERE 条件 ] [ORDER BY 排序字段 [ASC | DESC]]
  例如: SELECT * FROM student ORDER BY sid DESC; (给定通配符*表示返回所有列)

2、查询指定字段的数据
  SELECT 字段1,..,字段n FROM 表名 [....]

3、给字段和表设置别名(好处是可以缩短SQL语句、允许单条SELECT语句多次使用相同的表)
  SELECT 字段1 [AS] 别名1,...,字段n [AS] 别名n from 表 [AS] 表别名 ...;

  或者使用表别名获取字段的值
  SELECT表别名.字段1 [AS] 别名1,...,表别名.字段n [AS] 别名n FROM 表 [AS] 表别名 ...;

4、去除重复记录的语句(DISTINCT关键字用于值返回不同的值)
  SELECT DISTINCT 字段,...FROM 表

5、模糊查询LIKE
  SELECT... FROM 表 WHERE 字段 LIKE '%值%';
  例如:查找姓张的学生信息
  SELECT * FROM student WHERE sname LIKE '张%';

十四、MySQL的高级查询

1、表联结查询
   从多张表中获取需要的字段值进行显示

2、联结查询的类型

(1)内联结查询

  1)主子表之间使用外键进行关联的查询
  2)语法
语法一:

  SELECT 表1.字段,表2.字段,....FROM 表1 JOIN 表2 
	   	  ON 表1.主键字段=表2.外键字段 JOIN 表3 
	   	  ON 表2.主键字段=表3.外键字段 .....

  3)查询的结果为表1和表2..都有的值才进行呈现
例如:查询学生的信息和班级的名称
   SELECT s.*,c.cnameFROM student s JOIN clazz c ON s.classid=c.cid

语法二:(使用WHERE子句建立联结关系)

  SELECT表1.字段,表2.字段,....FROM 表1 ,表2,...
	         WHERE 表1.主键字段=表2.外键字段 
		 AND 表2.主键字段=表3.外键字段 .....
(2)外联结查询

1)以其中一张表的数据为基础,获取联结表的数据,当联结表中无当前表的数据存在时,用空值补齐
2)左外联结
  SELECT ... FROM 左表 LEFT JOIN 右表 ON 左表.主键字段=右表.外键字段
3)右外联结
  SELECT ...FROM左表 RIGHT JOIN 右表 ON 左表.主键字段=右表.外键字段
以右表数据为基准,获取左表中的数据,如果左表中无对应数据存在, 则以null值补充

注意:只有具有关系的表(主子表外键关联的表),才可以进行联结查询。否则查询会出现笛卡尔积

(3)自联结查询

  从自身表中获取数据的方式

3、LIMIT关键字查询(限制结果)
  (1)显示从第n条记录开始,每次获取m条记录(第一个数n为开始位置,第二个数m为要检索的行数)
  检索出来的第一行为行0而不是行1,因此LIMIT 1,1将检索出第二行不是第一行
例如:
  SELECT * FROM student ORDER BY sid ASC LIMIT 5,10;返回6-15条记录,从第n条记录开始,一次取m条记录
  (2)语法
  SELECT ... FROM 表 WHERE 条件 ORDER BY ... LIMIT n,m;

(3)分页查询使用LIMIT关键字完成
当前页所在的记录数=(当前页数-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT (当前页数-1)*每页记录数,每页的记录数;
第1页:当前页所在的记录数=(1-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT 0,5;
第2页:当前页所在的记录数=(2-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT 5,5;
第3页:当前页所在的记录数=(3-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT 10,5;