MYSQL入门语法全解

什么是库?库事用来存放N张表的。

什么是表?表类似于Excel,可以用来存放数据。

什么是字段?类似于Excel中的表头。

数据类型:字符串(varchar)

                    整数(tinyint 、int、bigint)

                    小数(float)

                    日期(date、datetime )

什么是数据?文本、视频、图像、音频等


创建数据库:

CREATE    DATABASE   库名;

注:创建库时指定编码

CREATE  DATABASE  库名  character  set 编码名

删除指定数据库:

DROP   DATABASE   库名;

创建表:

CREATE  TABLE  表名(先写变量名,再写数据类型)

因为先创建database再创建table,所以选中某一个数据库:USE  库名;

现在来一个例子:

CREATE  TABLE  python成绩(

(字段1)姓名    varchar(20);

  (字段2)班级    varchar(20);

  (字段3)Python成绩    bigint(20);

删除指定表:

DROP TABLE  表名;

数据库的核心  增、删、改、查

在指定表中添加数据

方法一:

INSET   INTO  表名 (字段1、字段2····)

                         VALUSES(值1、值2·····)

方法二:

INSET  INTO 表名  SET  字段名1=字段值1·····

删除数据

DELETE  FROM  表名  WHERE  条件

eg:DELETE FROM  成绩表 WHERE  姓名=‘李四’

在MySQL中常用运算符:(=  > >= < <=  !=)需放在where之后

查询数据

SELECT  字段1,字段2、、、、FROM  表名  WHERE  条件

查看全部字段:SELECT *FROM  表名

eg:SELECT  姓名  FROM  python成绩表  WHERE  成绩>=70;  

注:查询时,可通过AS给某一字段取别名其中AS也可省略

eg:SELECT  姓名     AS    名字  FROM  python成绩表  WHERE  成绩>=70;

eg:SELECT  姓名      名字    FROM  python成绩表  WHERE  成绩>=70;

MYSQL中常见的逻辑运算符:与and、或or、非not

eg:SELECT  姓名      名字    FROM  python成绩表  WHERE  成绩>=70  AND  班级=“1班”;

修改语法:

UPDATE   表名  SET  字段名=值······   WHERE=条件;


DDL/DQL/DML三者的区别:

数据库的查询语言:  (DQL ,DATABASE  QUERY  LANGUAGE)

SELECT

 

数据库的定义语言:(DDL ,DATABASE  DEFINED LANGUAGE)

CREATE  DATABASE  ;DROP   DATABASE

数据库的操作语言:(DML ,DATABASE  MANGELANGUAGE)

UPDATE  INSERT   DELETE

注:修改指定库的编码

 ALTER  DATABASE  库名  CHARACTER  SET  新编码

查询表结构:DESC  表名

打印某张表的创建信息:SHOW  TABLE  表名

修改表:

(1)对已经存在的表进行重命名

RENAME  TABLE   旧表名  TO  新表名

(2)往已经存在的表中添加字段信息

ALTER  TABLE  表名  ADD  字段名  数据类型

(3)删除某张表中的字段信息

ALTER  TABLE 表名 DROP  被删除的字段

(4)对表中的字段进行重命名

ALTER  TABLE  表名  CHANGE  旧字段  新字段

(5)修改字段类型的长度

ALTER  TABLE  表名  CHANGE  字段名、字段名长度


还原备份文件的数据:

方法一:先进入MySQL环境  →创建一个库→在此库下还原数据

方法二:通过sqlyog 图形化工具:

选中需要备份的数据库→右键→备份/导出→转储到sql

MYSQL中常见的数据类型:

varchar 、 float、  int 、bigint 、date、test

默认值:DEFAULT  '默认值'

非空:NOT   NULL (此字段为必须填写)

自动增长:AUTO_INCREMENT  (尽量作用在int)

主键:PRIMARY  KEY (不能够重复使用,一张表只有一个字段可用)

唯一键:UNIQUE   (被其修饰的数据不可重复)

注:(1)以上数据类型都放在字段的后面;

        (2)DELETE可以删除整张表,但是删除数据后自增列不会从1开始  ,使用TRUNCATE删除数据后,如果字段是自增的,            则重新从1开始,这里推荐使用TRUNCATE来删除数据  

        (3)习惯上自动增长放在主键之前,两者配合使用


排序问题(order by)

降序:SELECT*FROM  表名    ORDER   BY  字段  DESC

升序:SELECT*FROM  表名  ORDER   BY  字段   ASC

注:排序时字段类型可以是数值类型(int  float),也可以是varchar 类型,但其对应的字段存放的是中文,则不能排序,是英文则可以。

聚合函数:

在MYSQL中函数使用 SELECT调用:

SELECT  函数名  字段    FROM   表名

最大值函数: MAX(字段)

最小值函数:MIN(字段)

求平均数函数:AVG(字段)

求和:SUM(字段)

统计记录:COUNT(字段)

 注:如果字段的值为NULL,则不能统计在内,为解决上述问题,在统计某一张表中的所有数据时,最好使用COUNT(*)。

 常用函数:

 第一类时间函数:

(1)NOW( ):获取当前时间,包括年月日时分秒

      SELECT   NOW( )  AS  当前时间;

(2)CURTIME( ):只获取时分秒

     SELECT  CURTIME ( )  AS  当前时间;

(3)CURDATE( ):只获取年月日

    CURD   SELECT  CURDATE( )  AS  当前时间;

 数学函数:

 向上取舍:

SELECT  CEIL (2.3);      →→结果为3

 向下取舍:

SELECT   FLOOR (2.3);     →→结果为2

随机数   RAND( ):

不用接受参数返回的是0-1之间的小数

SELECT  RAND( );

获取一个随机的4位数字,没有小数

SELECT  RAND ( )*1000


查询:

同时查询多条记录:IN  (数据1,数据2·····)

eg:获取id=1  2 4 的相关数据

SELECT *FROM 表名  WHERE  id  IN  (1,2,4)

分组查询:GROUP  BY  分类字段

eg:查询goods表中商品的种类

SELECT  goodcategory   FROM  表名  GROUP    BY  goodcategory

注:查询goods表中是否有种类为衣服的类型,如果查询语句中使用了GROUP BY则后面的条件需要使用HAVING关键字

eg:SELECT  goodcategory   FROM  表名  GROUP    BY  goodcategory  HAVING   goodcategor="数码"

分页:LIMIT  起始下标每页显示的数据量

eg:goods表中有7条记录每页显示3条总共3页

第一页数据:SELECT *FROM  goods   LIMIT  0,3;

第二页数据:SELECT *FROM  goods   LIMIT  3,3;

第三页数据:SELECT *FROM  goods   LIMIT  6,3;

总结:SELECT *FROM  goods  LIMIT (pageNO-1)*pagesize,pagesize

复制某一张指定的表以及表的数据:

CREATE  TABLE  表名

SELECT *FROM  复制的表名

时间的格式函数:DATETIME

DATE  FORMAT(%Y年%m月%d日%H:%i:%s

 子查询:同时查询多张表

SELECT*FROM  表1,表2,······表n    WHERE   条件

多表查询:☆☆☆

这俩假设有两张表一张是部门表(dept),一张是员工表(empty)

(1)查询部门下所有的员工

SELECT 字段1,字段n······FROM 表1,表2,表n·····WHERE  条件

eg:SELECT  d.deptname, p.empname  FROM  dept.d, emp.p  WHERE  d.id=p.deptID

(2)查询部门编号=1的部门下的所有员工

eg:SELECT*FROM  emp WHERE deptID=1

(3)找出开发部中所有的员工名,薪水,部门名

eg:SELECT d.deptname,e.empname,e.salary  FROM dept d,emp e  WHERE  d,id=d.deptID  AND d,deptname="开发部"

(4)找出开发部和测试部所有员工名、薪水、部门名

第一种方法

 SELECT·····同(3)  AND  d,deptname  in  ('开发部','测试部')

第二种方法

SELECT·····同(3)  AND (d.deptanme='开发部',OR d.deptname='测试部')

第三种方法(UNION

SELECT     d.deptname,e.empname ,e.salary FROM  dept  d,empe  e   WHERE  d.id=e.demptID   AND  d.deptname=开发部"

UNION

SELECT  d.deptname,e.empname ,e.salary FROM  dept  d,empe  e   WHERE  d.id=e.demptID AND  d.deptname='测试部’

UNION  UNION  ALL:可以将两个查询语句的结果进行合并,合并的前提是两个查询语句的数据结构一样 

UNION:可以自动去重

UNION  ALL: 不可以自动去重

多表查询语法:

语法1:SELECT*FROM  表1,表2·······WHERE 条件

语法2:通过连接关键词

内连接            左外连接    

外连接            右外连接

内连接:   表1   INNER  JOIN   表2  ON   条件

eg:查询所有部门中的所有员工

SELECT *FROM  dept  d   INNER JOIN  emp  e  ON   d.id=e.deptid

外连接:外连接分为左外连接和右外连接

左外连接:LEFT  JOIN  左外连接当条件不满足时以左边的表1为准

右外连接:RIGHT   JOIN

模糊查询:%为占位符,LIKE

eg:SELECT *FROM   book  WHERE  B-name   LIKE  '%王'

(查询以王结尾的名字,反之“王%为查询以王开头的名字”)


视图:在真实表上面构建一个虚表

创建语法:CREATE  VIEW  视图名   AS    查询语句

删除语法:DROP  VIEW    视图名

查询:SELECT *FROM  视图名  WHERE  条件

删除某条数据:DELETE

添加数据:INSERT  INTO   视图名·······

修改数据:UPDATE    视图名  SET 

视图的应用场景:金融行业、保险、财务等行业

数据库建模:powerDesigner   软件

file →  new  model→  physicaldate   model


事务:多组操作要么全部成功要么全部失败(银行转账)

四大特性:

原子性:同一个事务中,多组操作不能分割必须是一个整体

一致性:事务操作前与操作后总量保持一致

隔离性:多个事务之间互不干扰

持久性:数据一旦进入到库/表中就永久存在

开启事务:START   TRANSACTION

回滚事务:如果事务提交后不能够成功(失败后用ROLLBACK即可重新开启事务)

提交事务:COMMITED

在这四个性质中,隔离性有四种级别(分别由低到高)

read  uncommited      read   comminted     repeatable         serializable

查看MySQL中的事务隔离级别:

SELECT  @@tx-ISOLATION

修改MySQL默认的隔离级别:

SET  GLOBAL   TRANSACTION   ISOLATION   LEVEL  隔离级别

不同的隔离级别会引发不同的问题:

(1).当MySQL事务的级别为read  uncommited时会引发脏读:一个事务可以读取另一个事务未提交的数据

如何解决脏读问题?

可以将是数据库的隔离级别改为read   comminted

(2)..当MySQL事务的级别为read   comminted时会出现不可重复读:在同一个事务中多次读取结果不一致

如何不可重复读解决?

将事务的隔离性改为  repeatable    

(3).当MySQL事务的级别为  repeatable 时会出现虚读(幻读)


 存储过程:SQL语句的一组集合

语法:

CREATE   PROCEDURE   存储过程名   (参数名1   参数类型1,参数名2   参数类型2,参数名n  参数类型n······)

BEGIN

          代码块;

END

eg:书写一个加薪的过程

 DELIMITER//

CREATE    PROCEDURE    AddSalary (money    float,id.d   BIGINT)

BEGIN

       UPDATE      emp   SET  salary=salary+money

      WHERE    id=idd;

END//

DELIMITER;

调用存储过程: CALL   (存储过程名)

删除存储过程:DROP    PROCEDURE  存储过程名

带返回值的存储过程:

DELIMITER//

 CREATE   PROCEDURE   存储过程名   (IN参数名1   参数类型1,IN参数名2   参数类型2,IN参数名n  参数类型n······,OUT  参数  参数类型)

BEGIN

          代码块;

END

DELIMITER;

 调用存储过程: CALL   (存储过程名)

查询:SELECT  @ result

MySQL数据库高级部分之存储过程

创建存储过程的基本语法规则:

DELIMITER//

 CREATE   PROCEDURE   存储过程名   (IN参数名1   参数类型1,IN参数名2   参数类型2,IN参数名n  参数类型n······,OUT  参数  参数类型)

BEGIN

          代码块;

END

DELIMITER;

删除数据过程:

DROP    PROCEDURE   (IF   EXISTS ) 存储过称

调用数据过程:

CALL   存储过程名 (  参数1,······参数n);

带if的存储过程:

eg:加薪的过程,传递两个参数 id ,m

DELIMITER//

CREATE   PROCEDURE  AddSalary (idd  BIGINT ,  m  FLOAT)

BEGIN

       IF  m>0  THEN

            UPDATE  users  SET   money=money+ m

            WHERE   id=idd;

      END  IF;

END//

DELIMITER;

带if  ····else  的存储过程

DELIMITER//

CREATE   PROCEDURE  AddSalary (idd  BIGINT ,  m  FLOAT)

BEGIN

       IF  m>0  THEN

            UPDATE  users  SET   money=money+ m

            WHERE   id=idd;

      END  IF;

END//

DELIMITER;

带  if   else if  语句的存储过程

DELIMITER//

CREATE   PROCEDURE  BuyCar (money   FLOAT)

BEGIN

        IF  money>500   THEN  

             SELECT  "买保时捷"  AS   "买啥";

        ELSEIF  money>300   THEN  

             SELECT  "买宝马"  AS   "买啥";

        ELSE IF  money>100   THEN  

             SELECT  "买奥迪"  AS   "买啥";

         ELSE   money>500   THEN  

             SELECT  "买保时捷"  AS   "买啥";

  END  IF;

END//

DELIMITER;

  查询结果:CALL   BuyCar   (500)

      CASE 语句:

DELIMITER//

CREATE   PROCEDURE  Pro_case(i,int)

BEGIN

     CASE  i

            WHERE  I   THEN

                    SELECT"星期一"  AS   "日期";

            WHERE  2  THEN

                    SELECT"星期二"   AS   "日期";

           ELSE

                    SELECT "今天是周几?"    AS   "日期";

   ENDCASE;

END//

DELIMITER;

查询结果:CALL   Procase(3);

WHILE 循环:

eg:如果i=100,则往users表中插入100条数据

DELIMITER//

CREATE   PROCEDURE  pro_while(IN   I   int);

BEGIN

                DECLARE  a   INT   DEFAULT  1;

                 WHILE   a<=i      DO

                        INSERT   INTO   "users"  SET    username="test"  ,momey=100;

                       SET   a=a+1;

                ENDWHILE;

END//

DELIMITER;

调用:

CALL   Pro_while(1);

查:

SELECT   COUNT(*)  FROM   users;

删:

TRUNCATE   TSBLE      users; 

eg:如果 i=100,则计算1-100的和,并返回结果

DELIMITER//

CREATE    PROCEDURE   pro_while(IN  i INT  ,OUT  total  INT )

BEGIN

         DECLARE   a  INT  DEFAULT  1;

         SET  total =0;

         WHILE  a  <=i  DO

              SET  total=total+a;

         ENDWHILE;

END//

DELIMITER;

CALL "pro_while (100,@aaa);

SELECT  @aaa;   

LOOP循环:            

语法:

CREATE   PROCEDURE   存储过程名()

BEGIN

          LOOP循环别名:LOOP

                    循环体;

                    LEAVE LOOP  循环别名

          ENDLOOP;

END;

eg:通过loop循环往users表中添加100条记录,当数据添加到21条时终止循环

DELIMITER//

CREATE PROCEDURE  pro_loop( )

BEGIN

            DECLARE  i   INT  DEFAULT 0;

            LOOP_TEST:LOOP

                      INSERT  INTO "users" SET   username=”admin”   money=200;

                     SET  i=i+1;

                      IF   i  =100   THEN

                     LEAVE  LOOP_TEST;

           ENDLOOP;    

END//

DELIMITER;

CALL "pro_loop"(  ); 

 

 

 

                                                                                                                                                                                             大结局

            

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值