Back

MySQL基本介绍与使用

MySQL的基本介绍与基本使用

MySQL(一)


  1. MySQL的基本介绍
  2. MySQL的基本使用
  3. 增删改查
  4. 约束

MySQL的基本介绍

  1. sql、DB、DBMS分别是什么,他们之间的关系?

    DB:DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)

    DBMS:DataBase Management System(数据库管理系统,常见的有:MySQL、Oracle、DB2、Sybase、SqlServer…)

    SQL:结构化查询语言,是一门标准通用的语言。标准的SQL适合于所有的数据库产品。SQL属于高级语言。SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DNMS完成)

    DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据

  2. 什么是表?

    • 表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。

    • 一个表包括行和列:

      • 行:被称为数据/记录(data)
      • 列:被称为字段(column)每一个字段包括字段名、数据类型、相关的约束
  3. 学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类?

    • DQL(数据查询语言):查询语句,凡是select语句都是DQL。
    • DML(数据操作语言):insert(增加)、delete(删除)、update(修改),对表当中数据进行增删改。
    • DDL(数据定义语言):create(增加)、drop(删除)、alter(修改) ,对表结构的增删改。
    • TCL(事务控制语言):commit提交事务、rollback回滚事务
    • DCL(数据控制语言):grant授权、revoke撤销权限等。
  4. 当因为sql脚本中的数据量太大的而无法打开的时候,可以使用source。

MySQL的基本使用

MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

data

  • 表头(header): 每一列的名称;
  • 列(col): 具有相同数据类型的数据的集合;
  • 行(row): 每一行用来描述某个人/物的具体信息;
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
  • 键(key): 表中用来识别某个特定的人\物的方法, 键的值在当前列中具有唯一性。

登录数据库

mysql -h 127.0.0.1 -u 用户名 -p
mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p
mysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果
mysql> status;  # 显示当前mysql的version的各种信息
mysql> select version(); # 显示当前mysql的version信息
mysql> show global variables like 'port'; # 查看MySQL端口号

创建数据库

对于表的操作需要先进入库use 库名;

-- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbk
create database samp_db character set gbk;
drop database samp_db; -- 删除 库名为samp_db的库
show databases;        -- 显示数据库列表。
use samp_db;     -- 选择创建的数据库samp_db
show tables;     -- 显示samp_db下面所有的表名字
describe 表名;    -- 显示数据表的结构(缩写为desc)
delete from 表名; -- 清空表中记录

创建数据库表

使用 create table 语句可完成对表的创建, create table 的常见形式: 语法:create table 表名称(列声明);

-- 如果数据库中存在user_accounts表,就把它从数据库中drop掉
DROP TABLE IF EXISTS `user_accounts`;
CREATE TABLE `user_accounts` (
  `id`             int(100) unsigned NOT NULL AUTO_INCREMENT primary key,
  `password`       varchar(32)       NOT NULL DEFAULT '' COMMENT '用户密码',
  `reset_password` tinyint(32)       NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码',
  `mobile`         varchar(20)       NOT NULL DEFAULT '' COMMENT '手机',
  `create_at`      timestamp(6)      NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `update_at`      timestamp(6)      NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  -- 创建唯一索引,不允许重复
  UNIQUE INDEX idx_user_mobile(`mobile`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
COMMENT='用户表信息';

数据类型的属性解释

  • NULL:数据列可包含NULL值;
  • NOT NULL:数据列不允许包含NULL值;
  • DEFAULT:默认值;
  • PRIMARY:KEY 主键;
  • AUTO_INCREMENT:自动递增,适用于整数类型;
  • UNSIGNED:是指数值类型只能为正数;
  • CHARACTER SET name:指定一个字符集;
  • COMMENT:对表或者字段说明;

需要注意的是,创建的时候字段名字需要用**``**来标记,而非**‘ ’**

增删改查

SELECT

SELECT 语句用于从表中选取数据。 语法:SELECT 列名称 FROM 表名称 语法:SELECT * FROM 表名称

单表查询
  1. 简单查询

    -- 查看当前数据库版本
    select version();
    -- 查看当前使用的是哪个数据库
    select database();
    -- 查询单个字段
    select 字段名 from 表名;
    -- 查询多个字段(使用逗号隔开)
    select deptno,dname form dept;
    -- 查询所有字段
    select * from dept;-- 实际开发中不建议;
    select a,b,c,d... from dept;
    -- 给查询的列起别名,as关键字可以省略
    SELECT deptno,dname AS deptname FROM dept;
    SELECT deptno,dname deptname FROM dept;
    -- 倘若别名中有空格,则用单引号括起来
    SELECT deptno,dname 'dept name' FROM dept;
    -- 字段可以使用数学表达式!
    SELECT ename,sal*12 AS yearsal FROM emp;
    
  2. 条件查询

    不是将表中所有数据都查出来。是查询出来符合条件的。

    -- 语法格式:
    	select
         字段1,字段2,字段3....
    	from 
         表名
    	where
         条件;
    
    -- = 等
    SELECT empno,ename FROM emp WHERE sal=800;
    -- !=或<>不等于
    SELECT ename,empno FROM emp WHERE sal !=800;
    SELECT ename,empno FROM emp WHERE sal <>800;
    -- < 小于 > 大于 <= 小于等于 >= 大于等于
    SELECT ename,empno FROM emp WHERE sal <2000;
    SELECT ename,empno FROM emp WHERE sal <=2000;
    SELECT ename,empno FROM emp WHERE sal >2000;
    SELECT ename,empno FROM emp WHERE sal >=2000;
    -- between ... and ...,查询两个值之间 使用between...and... 必须左小右大,且为闭区间!
    SELECT ename,empno,sal 
    FROM emp 
    WHERE sal BETWEEN 2450 AND 3000;
    -- 等价于
    SELECT ename,empno,sal FROM emp WHERE sal >=2450 AND sal <= 3000;
    -- is null 为 null(is not null 不为空)在数据库中null不能使用=衡量!
    SELECT ename,empno,sal comm FROM emp WHERE comm IS NULL; 
    SELECT ename,empno,sal comm FROM emp WHERE comm IS NOT NULL; 
    -- AND->并且 OR->或者 AND的优先级高于OR。如需OR先执行,需要加小括号
    SELECT * FROM emp WHERE sal > 2500 AND (deptno = 10 OR deptno = 20);
    -- IN 包含相当于多个OR。NOT IN 不包含
    SELECT empno,ename,job FROM emp WHERE JOB IN ('MANAGER','SALESMAN');
    

    like 称为模糊查询,支持%或下划线匹配

    • %匹配任意多个字符
    • 下划线:任意一个字符。(%是一个特殊的符号,_ 也是一个特殊符号)
    -- 找出含有O的名字
    SELECT ename FROM emp WHERE ename LIKE '%O%';
    -- 找出第二个字母为O的名字
    SELECT ename FROM emp WHERE ename LIKE '_O%';
    -- 找出名字中含有下划线的 用\转义
    SELECT 
     ename 
    FROM
     emp 
    WHERE ename LIKE '%\_%' ;
    
  3. 排序查询

    ORDER BY : 升序排序,默认

    ORDER BY … desc;:指定降序排序

    ORDER BY … asc;:指定升序排序

    -- 默认排序查询
    SELECT ename,sal FROMemp ORDER BY sal;
    -- 指定降序排序
    SELECT ename,sal FROMemp ORDER BY sal desc;
    -- 指定升序排序
    SELECT ename,sal FROMemp ORDER BY sal asc;
    -- 按多个字段进行排序
    SELECT 
      ename,sal 
    FROM
      emp 
    ORDER BY
      sal asc,ename desc; -- sal在前,起主导,只有当sal相等时才会启用ename比较
    

    综合案例:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。

    SELECT 
      *
    FROM
      emp 
    WHERE
      sal BETWEEN 1250 AND 3000
    ORDER BY
      sal DESC;
    

    以上执行顺序必须掌握!排序总是在最后!

  4. 数据处理函数

    • 数据处理函数又被称为单行处理函数

      • 单行处理函数的特点:一个输入对应一个输出。

      • 和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)

    • 常见的单行处理函数

      1. Lower 转换小写

        SELECT LOWER(ename) AS ename FROM emp;
        
      2. upper 转换大写

        SELECT UPPER(ename) AS ename FROM emp;
        
      3. substr 取子串(substr(被截取的字符串,起始下标(从1开始),截取的长度))

        SELECT SUBSTR(ename,1,1) AS ename FROM emp;
        
      4. length 取长度

        SELECT LENGTH(ename) enamelength FROM emp;
        
      5. trim 去空格,可以去前后空白

        SELECT * FROM emp WHERE ename = trim('  KING')
        
      6. str_to_date 将字符串转换成日期

      7. date_format 格式化日期

      8. format 设置千分位

      9. round 四舍五入

        -- 生成100以内的随机整数
        SELECT ROUND(RAND()*100,0) FROM emp;
        
      10. rand() 生成随机数

        SELECT RAND() FROM emp;
        
      11. Ifnull 可以将null转换成一个具体值

        ifnull是空处理函数,专门处理null的。 在所有的数据库中,null只要参与运算,最终结果一定是null。

        需要使用ifnull函数处理,用法:

        ifnull(数据,替换值)

        -- 计算年薪的时候,把补贴为null的值替换成0,这样子就可以避免最后算出来的年薪为null
        SELECT ename,(sal+IFNULL(comm,0))*12 AS yearsal FROM emp;
        
      12. concat函数进行字符串的拼接

        SELECT CONCAT(ename,empno)FROM emp;
        
      13. case..when..then..when..then..else..end

        当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。 (注意:不修改数据库,只是将查询结果显示为工资上调)

        SELECT ename,job,sal 
        AS 
           oldsal,
           (CASE JOB WHEN 'MANAGER' THEN sal*1.1 WHEN 'SALESMAN' THEN sal*1.5 ELSE sal END)AS newsal
        FROM 
           emp;
        
  5. 分组函数(多行处理函数)

    • 分组函数在使用时必须进行分组才能使用
    • 如果没有对数据进行分组,那么整张表就会默认为一组
    1. count 计数

      SELECT COUNT(sal) FROM emp;
      
    2. sum 求和

      SELECT SUM(sal) FROM emp;
      
    3. avg 平均值

      SELECT avg(sal) FROM emp;
      
    4. max 最大值

      SELECT MAX(sal) FROM emp;
      
    5. min 最小值

      SELECT MIN(sal) FROM emp;
      
    • 分组函数需要注意的点:

      1. 分组函数自动处理null,使用时不需要对null进行处理

        SELECT COUNT(comm) AS comm FROM emp;
        

        image02

      2. count(具体字段):表示统计该字段下所有不为null的元素总数

      3. count * :统计表当中的总行数。只要有一行数据count就++。

      4. 分组函数不能直接使用在where子句中。

      5. 所有分组函数都可以组合起来用。

  6. 分组查询

    sql语句各关键字的执行顺序:FROM->WHERE->GROUP BY->SELECT->ORDER BY

    ​ 由上面的执行顺序,我们可以知道为什么分组函数不能直接使用在where子句中;因为sql语句在执行的时候,select在group by后面,所以**SELECT MIN(sal) FROM emp;可以正常执行,但SELECT ename FROM emp WHERE sal >(sal);(WHERE在group by前面,还没分组)**却会报错。

    -- 找出每个工作岗位的工资和
    SELECT SUM(sal) FROM emp GROUP BY JOB;
    

    ​ 在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数!其他字段或函数一律不能写在select后面

    使用Having可以对分完组之后的数据做进一步的过滤(having与group by配套使用)

    -- 找出每个部门最高薪资,要求显示最高薪资大于3000的
    SELECT deptno,MAX(sal)
    FROM emp 
    GROUP BY deptno
    HAVING MAX(sal)>3000;
    

    优化策略:where与having都可以解决的问题,优先使用where

    SELECT deptno,MAX(sal)
    FROM emp
    WHERE sal>3000 
    GROUP BY deptno;
    

    这样子可以先选出符合要求的数据再进行分组,优化了执行效率。

    不能使用where的情况

    -- 找出每个部门平均薪资,要求显示平均薪资高于2500的SELECT deptno,AVG(sal)FROM empGROUP BY deptnoHAVING AVG(sal)>2500;
    

    因为上述要求的是平均薪资,即为AVG(sal),而where后面不能跟分组函数,所以where无法解决上述问题,只能使用having

  7. 单表查询总结

    当我们需要从某张表中查询数据,需要先经过where条件筛选出有价值的数据,再对这些有价值的数据进行分组。分组之后可以使用having 继续筛选,然后select查询出来,最后排序输出。

    练习:找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排序。

    SELECT 
    	job,AVG(sal) AS avgsal
    FROM 
    	emp
    WHERE 
    	job != 'MANAGER'
    GROUP BY 
    	job
    HAVING 
    	avgsal>1500
    ORDER BY 
    	avgsal DESC;
    
  8. DISTINCT关键字

    DISTINCT关键字可以把查询结果去除重复的记录(原表数据不会被修改)。

    • 作用于单列

      -- 查询工作岗位类型
      select DISTINCT job FROM emp;
      
    • 作用于多列

      SELECT DISTINCT deptno,job FROM emp;
      

      上述语句是同时作用在**“deptno+job”**上面的,实际上是根据**“deptno+job”**实现去重。即同一部门同一岗位的信息去掉。

      image03

    • 需要注意的是DISTINCT只能出现在所有的字段的最前方。

    • count+distinct使用

      image04

多表查询
  1. 什么是多表查询(连接查询)

    从一张表中单独查询,称为单表查询。 emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字。 这种跨表查询,多张表联合起来查询数据,被称为连接查询。

  2. 连接查询的分类

    • 根据语法的年代分类: SQL92:1992年的时候出现的语法 SQL99:1999年的时候出现的语法 我们这里重点学习SQL99.(这个过程中简单演示一个SQL92的例子)

    • 根据表连接的方式分类:

      • 内连接:

        1. 等值连接

          -- SQL92语法
          SELECT e.ename,d.dname
          FROM emp e,dept d
          WHERE e.deptno = d.deptno;
          
          -- SQL99语法
          SELECT 
          	e.ename,d.dname
          FROM 
          	emp e
          (INNER)JOIN -- INNER可以省略,但带着INNER可读性更好!
          	dept d
          ON 
          	e.deptno = d.deptno
          WHERE
          	'筛选条件';
          

          sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。

          sql99的优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

        2. 非等值连接

          条件不是一个等量关系,称为非等值连接。

          -- 找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
          SELECT 
          	e.ename,e.sal,s.grade
          FROM
          	emp e
          JOIN 
          	salgrade s
          ON
          	e.sal BETWEEN s.losal AND s.hisal
          ORDER BY 
          	grade;
          
        3. 自连接

          一张表看作两张表来用

          -- 查询员工的上级领导,要求显示员工名和对应的领导名
          SELECT 
             a.ename AS '员工名',b.ename AS '领导名'
          FROM
             emp a
          JOIN 
             emp b
          ON
             a.mgr = b.empno;
          
      • 外连接:

        外连接就是在内连接的基础上,在JOIN的左边加上一个关键字RIGHT或LEFT。

        RIGHT/LEFT代表什么:表示将join关键字右/左边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左/右边的表。在外连接当中,两张表连接,产生了主次关系

        1. 左外连接(左连接)

          SELECT 
             a.ename AS '员工名',b.ename AS '领导名'
          FROM
             emp a
          LEFT JOIN 
             emp b
          ON
             a.mgr = b.empno;
          
        2. 右外连接(右连接)

          SELECT 
             a.ename AS '员工名',b.ename AS '领导名'
          FROM
             emp a
          RIGHT JOIN 
             emp b
          ON
             a.mgr = b.empno;
          
        3. 全连接(不常用)

        注意:外连接的查询结果条数一定是大于或等于内连接的查询结果条数

    当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。(笛卡尔发现的,这是一个数学现象。)

    注意:通过笛卡尔积现象可以得出表的连接次数越多效率越低,所以要尽量避免表的连接次数。

    实现案例:查询每个员工所在部门名称演示多表查询(避免笛卡尔乘积

    SELECT ename,dname
    FROM emp,dept
    WHERE emp.DEPTNO = dept.DEPTNO;
    

    给表起别名,优化效率:

    -- SQL92语法
    SELECT e.ename,d.dname
    FROM emp e,dept d
    WHERE e.deptno = d.deptno;
    

    多张表的连接查询

    三张表,四张表怎么连接?

    select 
    	...
    from
    	a
    join
    	b
    on
    	a和b的连接条件
    join
    	c
    on
    	a和c的连接条件
    right join
    	d
    on
    	a和d的连接条件	
    

    一条SQL中内连接和外连接可以混合。都可以出现!

  3. 子查询

    select语句中嵌套select语句,被嵌套的select语句称为子查询。

    • 子查询可以出现在那些地方

      select
             ..(select).
      	from
             ..(select).
      	where
             ..(select).
      
      1. where子句中的子查询

        -- 找出比最低工资高的员工姓名和工资
        SELECT 
        	ename,sal
        FROM 
        	emp
        WHERE (
        SELECT 
            MIN(sal)
        FROM 
            emp);
        
      2. from子句中的子查询

        注意:from后面的子查询,可以将子查询的查询结果当做一张临时表。

        案例:找出每个岗位的平均工资的薪资等级

        第一步:先把每个岗位的平均薪资查询出来

        SELECT JOB,AVG(sal) AS avgsal FROM emp GROUP BY JOB
        

        image05

        第二步:把以上的查询结果就当做一张真实存在的表t让t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal;

        SELECT 
        	t.*,s.grade
        FROM
        	(SELECT JOB,AVG(sal) AS avgsal FROM emp GROUP BY JOB) t
        JOIN 
        	salgrade s
        ON 
        	t.avgsal 
        BETWEEN 
        	s.`LOSAL` AND s.`HISAL`;
        

        查询结果:

        image06

      3. select后面出现的子查询

        -- 找出每个员工的部门名称,要求显示员工名,部门名
        select 
        	e.ename,e.deptno,(select 
                                d.dname 
                              from 
                                dept d 
                              where e.deptno = d.deptno) as dname 
        from 
        	emp e;
        

      注意:对于select后面的子查询来说,这个子查询只能一次返回1条结果

  4. union合并结果集

    -- 查询工作岗位是MANAGER和SALESMAN的员工
    -- 使用表连接查询
    SELECT ename,job FROM emp WHERE job = 'MANAGER' OR job = 'SALESMAN';
    -- 使用union查询
    SELECT ename,job FROM emp WHERE job = 'MANAGER'
    UNION 
    SELECT ename,job FROM emp WHERE job = 'SALESMAN';
    

    union的效率要高一些。对于表连接来说,每连接一次新表,每次匹配的次数满足笛卡尔积都会翻倍;但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接。

    union在使用的时候的注意事项:

    • union在进行结果集合并的时候,要求两个结果集的列数相同
    • 在MySQL中,允许结果集合并时列和列的数据类型不一致。但Oracle结果集合并时列和列的数据类型要一致。
  5. limit:将查询结果集的一部分取出来。通常使用在分页查询当中。

    分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差。

    -- 按照薪资降序,取出排名在第【5-9】名的员工
    SELECT  
    	ename,sal
    FROM
    	emp
    ORDER BY 
    	sal DESC
    LIMIT 4,5;
    

    limit语法:

    完整用法:limit startIndex, length startIndex是偏移量(起始下标),length是需要取出的数据长度。起始下标从0开始

    省略用法:limit 5;取出0-5个数据

    limit在order by之后执行

    在Java中,若我们需要每页显示pageSize条记录,会有下面的公式

    limit (pageNo-1)*pageSize , pageSize; 其中pageNo是页码

  6. DQL语句的执行顺序

    1.from
    2.where
    3.group by
    4.having
    5.select
    6.order by
    7.limit..
    

CREATE

  1. 表的创建(建表属于DDL语句,DDL包括:create drop alter)

    语法:

    create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);
    
    create table 表名(
    	字段名1 数据类型, 
    	字段名2 数据类型, 
    	字段名3 数据类型
    );
    

    表名:建议以t_ 或者 tbl_开始,可读性强。见名知意。 字段名:见名知意。 表名和字段名都属于标识符。

  2. mysql中的数据类型:

    • varchar(最长255):可变长度的字符串,比较智能,节省空间。会根据实际的数据长度动态分配空间。 优点:节省空间 缺点:需要动态分配空间,速度慢

    • char(最长255):定长字符串,不管实际的数据长度是多少。分配固定长度的空间去存储数据。使用不恰当的时候,可能会导致空间的浪费。

      优点:不需要动态分配空间,速度快。 缺点:使用不当可能会导致空间的浪费。

    • int(最长11):数字中的整数型。等同于java的int

    • bigint:数字中的长整型。等同于java中的long。

    • float:单精度浮点型数据

    • double:双精度浮点型数据

    • date:短日期类型

    • datetime:长日期类型

    • clob:字符大对象,最多可以存储4G的字符串。超过255个字符的都要采用CLOB字符大对象来存储。

    • blob:二进制大对象。专门用来存储图片、声音、视频等流媒体数据。

  3. 创建表与增加数据

    创建表

    CREATE TABLE t_student(
    	NO INT,
    	NAME VARCHAR(32),
    	sex CHAR(1),
    	age INT(3),
    	email VARCHAR(255)
    );
    

    增加数据

    -- 注意字段名要和值一一对应。即数量对应,数据类型对应。
    INSERT INTO t_student(NO,NAME,sex,age,email) VALUES(1,'张三','男',20,'123456@qq.com');
    -- 顺序可以不一样
    INSERT INTO t_student(email,NAME,sex,age,NO) VALUES('lisi@123.com','lisi','f',20,2);
    -- INSERT可以添加单个字段。没添加到的字段默认值为null
    INSERT INTO t_student(NO) VALUES(3);
    -- 如果添加时省略所有字段名,则说明添加全部字段名
    insert into t_student values(4); -- 错误的
    insert into t_student values(4, 'xiaoming', 'f', 21, 'ming@123.com');-- 需要把其他值也添加上
    

    image07

    INSERT添加日期

    -- t_user表中的birth为date属性。
    INSERT INTO t_user(id,name,birth) VALUES(1,'jack',STR_TO_DATE('01-10-1990','%d-%m-%Y'));
    

    str_to_date函数可以将字符串转换成日期类型date。通常使用在插入insert方面,因为插入的时候需要一个日期类型的数据,需要通过该函数将字符串转换成date

    mysql的日期格式:%Y -> 年,%m -> 月,%d -> 日,%h -> 时,%i -> 分,%s -> 秒

    -- 这个函数可以将日期类型转换成特定格式的字符串。
    select id,name,date_format(birth,'%Y/%m/%d') as birth from t_user;	
    

    date_format(日期类型数据, ‘日期格式’);这个函数通常使用在查询日期方面。设置展示的日期格式

  4. date和datetime两个类型的区别

    • date是短日期:只包括月日信息。mysql短日期默认格式:%Y-%m-%d
    • datetime是长日期:包括年月日时分秒信息。mysql长日期默认格式:%Y-%m-%d %h:%i:%s

    now() 函数可以获取系统当前的时间,获取到的信息带有:时分秒信息!是datetime类型的。

    -- 在表t_user中增加一个字段create——time
    ALTER TABLE t_user ADD create_time DATETIME;
    
  5. INSERT插入多条数据

    insert into t_user(id,name,birth,create_time) values
    	(1,'zs','1980-10-11',now()), 
    	(2,'lisi','1981-10-11',now()),
    	(3,'wangwu','1982-10-11',now()
    );
    
  6. 将查询结果插入到一张表当中

    create table dept_bak as select * from dept;
    insert into dept_bak select * from dept;
    

UPDATE

  1. 语法格式:update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;

    注意:没有条件限制会导致所有数据全部更新。

    -- 更新t_user表中id=1的数据
    UPDATE t_user SET NAME = 'mary',birth = '2000-10-1',create_time = NOW() WHERE id = 1;
    

DELETE

  1. 删除表中的数据

    语法格式:delete from 表名 where 条件;

    注意:没有条件,整张表的数据会全部删除!

    -- 删除t_user表中 id为2的数据
    delete from t_user where id = 2;
    
  2. 删除表:

    -- 这不是删除表中的数据,这是把表删除。
    drop table t_user;
    
  3. 快速删除表中的数据

    传统删除表中的数据是使用delete语句,其原理如下

    表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!

    缺点是:删除效率比较低。

    优点是:支持回滚,后悔了可以再恢复数据!!!(使用rollback)

    快速删除表中的数据使用truncate语句,其原理如下:

    语法:truncate table dept_bak;

    删除效率比较高,表被一次截断(删除表中的所有数据),物理删除。

    缺点:不支持回滚

    优点:快速删除表中的数据。

约束

  • 常见的约束
    • 非空约束,not null
    • 唯一约束,unique
    • 主键约束,primary key
    • 外键约束,foreign key
  1. 非空约束(not null)

    非空约束,针对某个字段设置其值不为空,如:学生的姓名不能为空

    drop table if exists t_student;
    CREATE TABLE t_student(
        student_id INT(10),
        student_name VARCHAR(20) NOT NULL,
        sex CHAR(2) DEFAULT 'm',
        birthday DATE, 
        email VARCHAR(30),
        classes_id INT(3)
    );
    

    插入数据

    insert into t_student(student_id, birthday, email, classes_id) 
    values
    (1002, '1988-01-01', 'qqq@163.com', 10);
    

    因为插入的数据没有插入student_name字段的值,所以系统会报错

    image08

    not null只有列级约束,没有表级约束

  2. 唯一约束(unique)

    唯一性约束,它可以使某个字段的值不能重复,如:email 不能重复。

    drop table if exists t_student; 
    create table t_student(
        student_id int(10),
        student_name varchar(20) not null,-- 非空约束
        sex char(2) default 'm',
    	birthday date, 
    	email varchar(30) unique, -- 唯一约束
    	classes_id int(3)
    );
    -- 联合唯一
    create table t_vip(
    	vip_id int,
        vip_name varchar(20),
        unique(vip_id,vip_name)
    );
    

    上述联合唯一的unique(vip_id,vip_name)由于约束没有添加在列的后面,所以被称为表级约束。

    uniquenot null联合使用

    create table t_vip(
    	id int,
        name varchar(20) not null unique -- 主键字段 
    );
    

    在mysql中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。(注意:oracle中不一样!)

  3. 主键约束(primary key)

    每个表应该具有主键,主键可以标识记录的唯一性,主键分为单一主键和复合(联合)主键,单一主键是由一个字段

    构成的,复合(联合)主键是由多个字段构成的。

    • 主键约束:就是一种约束
    • 主键字段:该字段上添加了主键约束,这样的字段叫做主键字段
    • 主键值::主键字段中的每一个值都叫做主键值(建议使用int,bigint,char;不建议使用varchar)
    drop table if exists t_student; 
    create table t_student(
    	student_id int(10) primary key,/*列级约束*/
    	student_name varchar(20) not null,
    	sex char(2) default 'm',
    	birthday date, 
    	email varchar(30) ,
    	classes_id int(3)
    );
    -- 复合主键
    create table t_vip(
    	vip_id int,
        vip_name varchar(20),
        primary key(vip_id,vip_name)
    );
    -- 实际开发中,不建议使用复合主键!
    

    **注意:**每一张表都必须有主键,否则这张表无效。且一张表只能有一个主键

    • 自然主键:主键值是一个自然数,和业务没有关系。
    • 业务主键:主键值和业务紧密关联,例如银行卡账号做主键值。这就是业务主键

    实际开发中,自然主键使用比较多,因为主键只要做到不重复就行,不需要任何意义。而主键一旦和业务挂钩,那么当业务发生变动的时候可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。

    auto_increment:表示自增,从1开始,以1递增,用于维护主键。

  4. 外键约束(foreign key)

    外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键,如:emp 中的 deptno 值必须来源于 dept 表中的 deptno 字段值。

    • 外键约束:就是一种约束
    • 外键字段:该字段上添加了外键约束,这样的字段叫做外键字段
    • 外键值::外键字段中的每一个值都叫做外键值。外键值可以为null

    建立学生和班级表之间的连接:

    首先建立班级表 t_classes

    drop table if exists t_classes;
    create table t_classes(
        classes_id int(3),
        classes_name varchar(40),
        constraint pk_classes_id primary key(classes_id)
    );
    

    然后创建表t_student

    drop table if exists t_student;
    create table t_student(
        student_id int(10),
        student_name varchar(20),
        sex char(2),
        birthday date,
        email varchar(30),
        classes_id int(3),
        constraint student_id_pk primary key(student_id),
        constraint fk_classes_id foreign key(classes_id) references t_classes(classes_id) 
    );
    

    注意:t_classes是父表,t_student是子表。

    外键不一定是主键,但一定要有unique约束

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy