MySQL的概念&&数据库&&数据表的操作

数据库 MySQL

为什么使用数据库

如果通过io流操作文件,非常的不方便

数据库的介绍

用于储存和管理数据的仓库,能够对数据进行统一的维护和管理
    关系型数据库
      以二维表格来组织数据结构,表与表之间可能还有一定的关联关系
    非关系型数据库
      不是以二维表格来组织数据
使用一种统一的方式操作数据库----SQL
MySQL是一种关联数据库    

SQL的分类

DDL 数据库定义语言
DML 数据库操作语言【重点】
DQL 数据库查询语言【重点】 
DCL 数据库控制语言    

DDL 操作数据库和数据表

一DDL操作数据库

1.DDL查询数据库

查询所有数据库
    SHOW DATABASES;
查询数据库的创建语句
    SHOW CREATE DATABASE 数据库名称;

2.DDL创建数据库

创建数据库
    CREATE DATABASE 数据库名称;
 创建数据库(判断,如果不存在则创建)
     CREATE DATABASE IF NOT EXISTS 数据库名称;
创建数据库(指定字符集)
    CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;

3.DDL修改删除使用数据库

 修改数据库(修改字符集)
     ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
删除数据库
    DROP DATABASE 数据库名称;
 删除数据库(判断,如果存在则删除)
     DROP DATABASE IF EXISTS 数据库名称;
使用数据库
   USE 数据库名称;
查看当前使用的数据库
  SELECT DATABASE();  

二.操作数据表

DDL查询数据表

查询当前正在使用的数据库中的所有表名
    show tables;
查询指定表的结构
    desc 表名
 查看指定数据库中指定表字符集   
   show table status from 数据库名 like ‘表名’
   
    例如
    查询库中所有的表
    SHOW TABLES;
查询user表结构
    DESC USER;
查看mysql数据库中user表字符集
 SHOW TABLE STATUS FROM mysql LIKE 'user';

DDL 创建数据表

CREATE TABLE 表名(
列名 数据类型 约束,
列名 数据类型 约束,
...
列名 数据类型 约束
);
数据类型
int:整数类型
double:小数类型
date:日期类型。包含年月日,格式 yyyy-MM-dd
datetime:日期类型。包含年月日时分秒,格式yyyy-MM-dd HH:mm:ss
timestamp:时间戳类型。包含年月日时分秒,格式 yyyy-MM-dd HH:mm:ss
* 如果不给该列赋值、或赋值为null,则默认使用当前系统时间自动赋值

varchar(长度):可变长度字符串类型
char :固定长度的字符串
    
    除了字符串必须指定长度,其他不管
    其余见资料MySQL数据类型

复制数据表

CREATE TABLE 表名 LIKE 被复制的表名;

DDL修改数据表

 修改表名
     ALTER TABLE 表名 RENAME TO 新表名;
 修改表的字符集
  ALTER TABLE 表名 CHARACTER SET 字符集名称;   
 单独添加一列
     ALTER TABLE 表名 ADD 列名 数据类型;
 修改某列的数据类型
     ALTER TABLE 表名 MODIFY 列名 新数据类型;
 修改列名和数据类型
    ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型; //如果是varchar,要添加(长度)
 删除某一列
ALTER TABLE 表名 DROP 列名;

DDL删除数据表

删除数据表
    DROP TABLE 表名;
 删除数据表(判断,如果存在则删除)
    DROP TABLE IF EXISTS 表名;

三 表数据的操作(增删改)

DML 新增表数据

给指定列添加数据
    INSERT INTO 表名(列名1,列名2,) VALUES (1,2,);
给全部列添加数据
    INSERT INTO 表名 VALUES (1,2,);
批量添加数据
   INSERT INTO 表名(列名1,列名2,) VALUES (1,2,), (1,2,),; 
   INSERT INTO 表名 VALUES (1,2,), (1,2,),;
注意:
列名和值的数量以及数据类型要对应,除了数字类型,其他数据类型的数据都需要加引号(单引双引都行,推荐单引)

DML修改表数据

 修改表中的数据
     UPDATE 表名 SET 列名1=1,列名2=2,[WHERE 条件];
注意:
    修改语句中必须加条件,如果不加条件,则会将所有数据都修改。

DML删除表中的数据

删除表中的数据
    DELETE FROM 表名 [WHERE 条件];
注意:
     删除语句中必须加条件,如果不加条件,则会将所有数据都删除

DQL 表数据查询【重点】

查询语法
单表查询完整语法
SELECT
    字段列表
FROM
    表名列表
WHERE
     条件列表
GROUP BY
     分组字段
HAVING
     分组后的过滤条件
ORDER BY
      排序
LIMIT
      分页限定    
查询全部
 查询全部的表数据
     SELECT * FROM 表名;
 查询指定字段的表数据
     SELECT 列名1,列名2,… FROM 表名;
 去除重复查询
     SELECT DISTINCT 列名1,列名2,… FROM 表名;
注意:去除重复,必须是查询的所有列都重复
 
    计算列的值(四则运算)
    SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名; 
 起别名查询
   SELECT 列名 AS 别名 FROM 表名;
条件查询

条件查询分类

符号 功能
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
<> 或 != 不等于
between…and 在某个范围之内(都包含)
in(…) 多选一
like 占位符 模糊查询 _单个任意字符,%多个任意字符
is null 是null
is not null 不是 null
and 或 && 并且
or 或 || 或者
not 或 ! 非 , 不是

条件查询语法

SELECT 列名列表 FROM 表名 WHERE 条件;

案列

/*
	条件查询
	标准语法:
		SELECT 列名列表 FROM 表名 WHERE 条件;
*/
-- 查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;


-- 查询品牌为华为的商品信息
SELECT * FROM product WHERE brand='华为';

-- 查询金额在4000 ~ 6000之间的商品信息
SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;


-- 查询库存为143023的商品信息
SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);

-- 查询库存为null的商品信息
SELECT * FROM product WHERE stock IS NULL;

-- 查询库存不为null的商品信息
SELECT * FROM product WHERE stock IS NOT NULL;


-- 查询名称以小米为开头的商品信息
SELECT * FROM product WHERE NAME LIKE '小米%';

-- 查询名称第二个字是为的商品信息
SELECT * FROM product WHERE NAME LIKE '_为%';

-- 查询名称为四个字符的商品信息
SELECT * FROM product WHERE NAME LIKE '____';

-- 查询名称中包含电脑的商品信息
SELECT * FROM product WHERE NAME LIKE '%电脑%';
聚合函数查询

聚合函数的分类

函数名 功能
count(列名) 统计个数
max(列名) 最大值
min(列名) 最小值
sum(列名) 求和
avg(列名) 平均值

聚合函数的查询语法

SELECT 函数名(列名) FROM 表名 [WHERE 条件];

例如

/*
	聚合函数
	标准语法:
		SELECT 函数名(列名) FROM 表名 [WHERE 条件];
*/
-- 计算product表中总记录条数
SELECT COUNT(*) FROM product;
-- 查看所有数据 
    select * from product;
-- 获取最高价格
SELECT MAX(price) FROM product;

-- 获取最低库存
SELECT MIN(stock) FROM product;

-- 获取总库存数量
SELECT SUM(stock) FROM product;

-- 获取品牌为苹果的总库存数量
SELECT SUM(stock) FROM product WHERE brand='苹果';

-- 获取品牌为小米的平均商品价格
SELECT AVG(price) FROM product WHERE brand='小米';

排序
select from where...order by 列名1 排序方式1,列名2 排序方式2
    语法
    SELECT 列名列表 FROM 表名 [WHERE 条件] ORDER BY 列名 排序方式,列名 排序方式,;
注意:
排序方式:ASC-升序,DESC-降序
如果有多个排序条件,只有当前边的条件值一样时,才会判断第二条件。

案列

/*
	排序查询
	标准语法:
		SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;
*/
-- 按照库存升序排序
SELECT * FROM product ORDER BY stock ASC;
-- 默认升序排序,可以省略 ASC
SELECT * FROM product ORDER BY stock;

-- 查询名称中包含手机的商品信息。按照金额降序排序
SELECT * FROM product WHERE NAME LIKE '%手机%' ORDER BY price DESC;


-- 按照金额升序排序,如果金额相同,按照库存降序排列
SELECT * FROM product ORDER BY price ASC,stock DESC;

分组查询

分组查询语法

SELECT 列名列表 FROM 表名 
   [WHERE 条件] 
   GROUP BY 分组列名
   [HAVING 分组后的条件过滤]
   [ORDER BY 排序列名 排序方式];

注意事项:
1.
2.where 后面不能跟聚合函数条件,聚合函数条件只能跟在having后面    

分页查询

分页查询
	标准语法:
		SELECT 列名 FROM 表名 
		[WHERE 条件] 
		[GROUP BY 分组列名]
		[HAVING 分组后条件过滤] 
		[ORDER BY 排序列名 排序方式] 
		LIMIT 当前页数,每页显示的条数;
	
	LIMIT 当前页数,每页显示的条数;
	公式:当前页数 = (第几页-1) * 每页显示的条数
         令每页显示的条数为x
    即  第1, 当前页数=(1-1)*x  02,当前页数 = (2-1)*x   x
        第3,当前页数 = (3-1)*x   2x
        ...
        第n页 当前页数 = (n-1)*x     

约束

约束的介绍

什么是约束
    对表中的数据进行限定,保证数据的正确性、有效性、完整性!
    

约束的分类

约束 作用
PRIMARY KEY 主键约束
PRIMARY KEY AUTO_INCREMENT 主键自增
UNIQUE 唯一约束
NOT NULL 非空约束
FOREIGN KEY 外键约束
FOREIGN KEY ON UPDATE CASCADE 外键级联更新
FOREIGN KEY ON DELETE CASCADE 外键级联删除
单表约束
主键约束
非空约束
唯一约束
    
多表约束
   外键约束
    foreign key

主键约束 PRIMARY KEY

主键约束的特点
   主键约束默认包含非空和唯一两个功能。
    一张表只能有一个主键。
    主键一般用于表中数据的唯一标识。 
    
     建表时添加主键约束
    CREATE TABLE 表名(
    列名 数据类型 PRIMARY KEY,
    ...
    列名 数据类型 约束
    );
  
     删除主键约束
  ALTER TABLE 表名 DROP PRIMARY KEY;

 建表后单独添加主键约束
  ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
主键自增
建表时添加主键自增约束
    CREATE TABLE 表名(
    列名 数据类型 PRIMARY KEY AUTO_INCREMENT,
    ...
    列名 数据类型 约束
    );

 删除主键自增约束
     ALTER TABLE 表名 MODIFY 列名 数据类型;

建表后单独添加主键自增约束
    ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;

    MySQL 中的自增约束,必须配合键的约束一起使用!
     
唯一约束
 建表时添加唯一约束
     CREATE TABLE 表名(
    列名 数据类型 UNIQUE,
    ...
    列名 数据类型 约束
    );
 删除唯一约束
     ALTER TABLE 表名 DROP INDEX 列名;

建表后单独添加唯一约束
     ALTER TABLE 表名 MODIFY 列名 数据类型 UNIQUE;
非空约束
建表时添加非空约束
    CREATE TABLE 表名(
    列名 数据类型 NOT NULL,
    ...
    列名 数据类型 约束
    );
删除非空约束
    ALTER TABLE 表名 MODIFY 列名 数据类型;
 建表后单独添加非空约束
     ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;

约束练习

-- 创建表(编号、姓名、密码,手机号码)  编号设为主键自增,姓名设为非空,手机号设为唯一
CREATE TABLE acount(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(30) NOT NULL,
	PASSWORD VARCHAR(30),
	phonenumber INT(11) UNIQUE
);
-- 查询表的详细信息
   DESC acount;
-- 1-1 删除id的主键约束
    注意:要删除id的主键约束,需要先删除自动增长,再删除主动约束
        -- 删除自动增长
        alter table acount modify id int;
       -- 删除id的主键约束
        alter table acount drop primary key;   

-- 1-2 添加id的主键约束 
    alter table acount modify id int primary key
    //添加主键自增可选可不选
    alter table acount modify id int auto_increment;

-- 2-1 删除username非空约束
    alter table acount modify username varchar(30);
-- 2-2 添加username非空约束
    alter table acount modify username varchar(30) not null;

-- 3-1 删除 phonenumber 唯一约束
    alter table acount drop index phonenumber;
-- 3-2 添加 phonenumber 唯一约束
    alter table acount modify phonenumber int(11) unique;

总结:
  只有删除主键约束和唯一约束时 使用关键字 drop

综合练习

// 现已有一个表格 表明emp 列名如下
/*
	empno:员工编号
	ename:员工姓名
	job:员工职位
	mar:领导编号
	hiredate:入职日期
	sal:工资
	comm:奖金
	deptno:部门编号
*/
// 需求
-- 1 查询出部门编号为30的所有员工
    select * from emp where deptno=30;

-- 2 查询所有销售员的姓名、编号和部门编号
    select ename, empno,deptno from emp where job='销售员';

-- 3 查询奖金高于工资的员工
    select * from emp where comm > sal;

-- 4 查询奖金高于工资60%的员工
    select * from emp where comm > sal*0.6;

-- 5 查询10号部门中的所有经理,和20号部门中所有销售员的详细资料
 -- 注 and 优先级 高于 or
    select * from emp where deptno=10 and job='经理' or deptno=20 and job='销售员';

-- 6 查询10号部门中的所有经理,和20号部门中所有销售员,还有即不是经理又不是销售员但其工资大或等于         20000的所有员工详细资料
    select * from emp where deptno=10 and job='经理' or deptno=10 and job='销售员' or sal >= 20000 and job not in('经理','销售员');

 -- 7 查询无奖金或奖金低于1000的员工
     select * from emp where comm < 1000 or comm is null;

-- 8 查询名字由三个字组成的员工
     select * from emp where ename like '___';
 
 -- 9 查询2001年入职的员工
   select * from emp where hiredate like '2001-%';
 
 -- 10 查询所有员工信息按照工资降序排序,如果工资相同则按入职日期升序排序
   select * from emp order by sal desc,hiredate asc;
 
 -- 11 按照部门统计每个部门的人数
 select deptno, count(*) from emp group by deptno;
 
 -- 12 按照部门统计平均工资,降序显示,工资超过50000的不参与统计,只显示前两名。
  SELECT deptno, AVG(sal) AS AVG FROM emp WHERE sal <50000 GROUP BY deptno ORDER BY AVG DESC LIMIT 0,2;

你可能感兴趣的:(MySQL的概念&&数据库&&数据表的操作)