0


MySql的DDL和DML和DQL的基本语法

SQL语句 即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名

DDL**(数据定义语言) **

定义和管理数据,对象,如数据库,数据表等

DDL操作数据库


创建数据库

CREATE DATABASE [IF NOT EXISTS] dbname

“[IF NOT EXISTS]” 内容可以省略;

“dbname”需要创建的数据库名称。

删除数据库

 DROP DATABASE [IF EXISTS] dbname

“[IF EXISTS] ”内容可以省略;

“dbname”需要创建的数据库名称。

查看数据库

 SHOW DATABASES

“dbname”需要创建的数据库名称。

DDL操作数据库表

创建表

CREATE TABLE [ IF NOT EXISTS ] `表名` (

`字段名1` 字段类型 [ 属性 ] [ 索引 ] [注释] ,

`字段名2` 字段类型 [ 属性 ] [ 索引 ] [注释] ,

… …

`字段名n` 字段类型 [ 属性 ] [ 索引 ] [注释]

) [ 表类型 ] [ 表字符集 ] ;

“[]” 包含的内容可以省略;

“`” 当前符号为反引号,用于区别MySQL保留字与普通字符而引入的。

修改表结构

改变字段的属性

-- alter table 表名 modify 字段名  要修改的属性;

alter table tab_teacher modify tea_money decimal(3,2);

-- alter table 表名 change 旧的字段名  新的字段名  要修改的属性;

alter table tab_teacher change tea_money gongzi decimal(30,2);

添加字段

-- alter table 表名 add 字段名 类型  属性;

alter table tab_teacher add tea_address varchar(200) default '中国';

删除字段(危险操作)

-- alter table 表名 drop 字段名;

alter table tab_teacher drop tea_birthday;

修改表名

-- alter table 旧表名 rename as 新表名;

alter table tab_teacher rename as t;

** 删除表(危险操作)**

-- drop table t;

show create table tab_teacher;

DML(数据的增删改)

数据增加****关键字INSERT,主要功能是给数据库表增加记录

*数据删除关键字DELETE,主要功能室删除 数据库表中已有的记录。可以依 照条件去做修改*。 **

数据修改****关键字是UPDATE,主要功能是 修改数据库表中已有的记录。可以根据条件去做修改。

增加数据****(INSERT语句)

INSERT INTO `表名` [(`字段1`,`字段2`,...`字段n`)]

VALUES/VALUE ('值1','值2',...'值n')[,('值1','值2',...'值n')...];

其中:“[]” 包含的内容可以省略;

            字段或值之间用英文逗号隔开

            可同时插入多条数据,values 后用英文逗号隔开;

            values和value的方式均可。

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中**,**目标表中任何已存在的行都不会受影响

INSERT INTO table2 (column_name,...) SELECT column_name,... FROM table1;

其中:****table2 必须存在,将table1中数据赋值到table2

** 如果要新建表并赋值表内容 **

** create table 新表 select * from 原始表;**

*修改数据***(UPDATE语句) **

UPDATE 表名 SET `字段名1` = '值1' [ , `字段名2` = '值2', …. ]

[ WHERE 条件];

其中:

“[]” 包含的内容可以省略;
 `字段名`为要更改数据的字段,'值'表示字段改后的值,注意字段和值的对应;
可同时修改多个字段,多个字段后用英文逗号隔开;
“WHERE”是where子句,可以给修改增加条件;
 条件:为筛选条件,如不指定则修改该表的所有列数

WHERE子句

  • 有条件的从数据库表中获取记录,通常同在修改,删除,和查询语句的时候,协助该类语句从条件中获取记录。针对修改和删除语句,****如果没有条件,则全部修改和全部删除。

删除数据(DELETE语句)

DELETE FROM 表名 [ WHERE 条件];

其中:

“[]” 包含的内容可以省略;
 “WHERE”可以通过where子句增加删除的条件。
TRUNCATE [TABLE] 表名

其中:

 TRUNCATE是一个特殊的删除语句,又叫做清空语句;
 “[]”包含的内容可以省略;
功能:清空某一张表内的全部数据,重置自增计数器;
特点:由于没有条件约束,所以速度快,而且效率高。

**delete, drop, truncate **区别

  • **-- drop **删除表结构
  • **-- delete 删除内容,**不删除索引
  • -- truncate 清空****内容及索引重置自增计数器

DQL(Data Query Language 数据查询语言)

用途是查询数据库数据,如SELECT语句。是SQL语句中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多表联查

**单表查询 **针对数据库中的一张数据表进行查询,可以通过各 种查询条件和方式去做相关的优化。

多表联查针对数据库中两张或者两张以上的表同时进行查询, 依赖的手段有复杂查询和嵌套查询

单表联查

**SELECT [DISTINCT] **

{|表1.|****[** 表1.字段1 ****[as 字段别名1] **

[****,** 表1.字段2[as 字段别名2****]][, …]]****} **

**FROM 表1 ****[ ****as 表别名 ****] **

**[ ****left|right|inner join 表2 on 表之间的关系 ****] **

[** WHERE ****] **

**[ ****GROUP BY ****] **

[** HAVING****] **

[** ORDER BY****] **

**[ *LIMIT {[* 位置偏移量****,****] ****行数 }] **

**[ ]包含的内容可以省略;**

**{ }**”包含的内容必须存在;

**DISTINCT ****设定DISTINCT可以去掉重复记录。 **

**AS **表名或者字段名过长时,可以用AS关键字起别名,方便操作。

**GROUP BY ** **按组分类显示查询出的数据。 **

*HAVING ** G*ROUP BY分组时依赖的分组条件。 **

**ORDER BY ** **将查询出来的结果集按照一定顺序排序完成。 **

**LIMIT ** 限制显示查询结果的条数

指定字段列

SELECT * | 字段名1, 字段名2... FROM 表名

“*”表示所查询的数据库表的全部字段。
  • 表别名和字段别名
SELECT 表别名.字段名1 AS 字段别名1, 表别名.字段名2 AS 字段别名2

**FROM 表名 ****AS **表别名

  • **.****” 当前表存在的字段; **

  • ** “AS”可忽略不写,“AS”的功能如下: **

  • **给字段取一个新别名; **

  • ** 给表取一个新别名; **

  • •把经计算或总结的结果用另外一个新名称来代替。

  • DISTINCT

SELECT DISTINCT 字段名1, 字段名2...

FROM 表名

  • **去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同), **

只返回一条。

  • WHERE条件子句
SELECT * FROM 表名 [ WHERE 条件];
  • ** WHERE条件子句不是必须的; **

  • ** WHERE子句,可以给查询增加条件; **

  • ** 条件:为筛选条件,如不指定则修改该表的所有数据。**

  • **LIKE 关键字 **

SELECT * FROM 表名 WHERE 字段 LIKE 条件;
  • **在WHERE子句中,使用LIKE关键字进行模糊查询; **

  • ** 与“%”一起使用,表示匹配0或任意多个字符; **

  • ** 与“_”一起使用,表示匹配单个字符。**

  • IN 关键字

SELECT * FROM 表名 WHERE 字段 IN (值1,值2...);
  • **查询的字段的值,至少与IN 后的括号中的一个值相同; **

  • 多个值之间用英文逗号隔开。

  • NULL 值查询

SELECT * FROM 表名 WHERE 字段 IS NULL | IS NOT NULL

常用的聚合函数

  • GROUP BY和HAVING分组

GROUP BY

**1、对所有的数据进行分组统计; **

2、分组的依据字段可以有多个,并依次分组。

HAVING

与GROUP BY结合使用,进行分组后的数据筛选

多表联查

多表联查可以通过转接运算实现**,**即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查时用到的数据库表之间的关系

非等值查询

SELECT * FROM 表1,表2

笛卡尔积

等值查询**(内联数据)方式一 **

SELECT * FROM 表1,表2 WHERE 表1.字段1 = 表2.字段2...

与单表查询类似,都是SELECT语句;
把多个表放到FROM后,并用逗号隔开;
可使用AS关键字取别名,便于引用;
如无重名查询字段则可省略数据表的指定。

方式二**: *inner jion on select from 表一inner join on 表二….

-- inner join  on

select * from student

inner join class

on student.classid = class.classid

inner join sc

on student.sid = sc.sid

inner join course

on course.cid = sc.cid

外联查询

左外联 从左表(表1)中返回所有的记录,即便在右 (表2)中没有匹配的行。

        left join  on  左外联
        select * from student left join class 
on student.classid = class.classid

*右外联***从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行。 **

        right join on   右外联
        select * from class right join student 
on student.classid = class.classid

子查询<****内部查询 ****>

**where **子查询

        -- 查询id最大的一个学生
        select * from student order by sid desc limit 1;
    
        -- 查询id最大的一个学生(子查询)
        select * from student
         where sid = (select max(sid) from student)
        
        -- 每个班id最大的学生编号
        select * from student where sid in(
        select max(sid) from student group by classid);
        
        -- 没学过张三老师课程的学生
        select * from student where sid not in(
        select student.sid from student 
        left join sc on student.sid = sc.sid
        left join course on sc.cid = course.cid 
        left join teacher on course.tid = teacher.tid 
where tname = '张三')

**from **子查询

内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名

        -- from 子查询
        
        -- 查询大于5人的班级名称和人数
        
        select classname,count(*) from student 
        left join class on student.classid = class.classid
        group by class.classid 
        
        -- from 子查询
        select classname,a 人数 from class 
        left join 
            (select classid, count(*) a 
            from student group by classid)t1
        on class.classid = t1.classid
        
        -- 每个班的平均成绩,班级名称和平均成绩
        
        select classname, avg(score) from class 
        left join student on class.classid = student.classid
        left join sc on student.sid = sc.sid
        group by class.classid
        
        select * from class 
        left join (
            select classid,avg(score) from sc 
                left join student on sc.sid = student.sid
        group by classid 
        )t1 on class.classid = t1.classid
        

exists型子查询

把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。

        --从学生表中取出学生的信息,(如果该性别下没有男学生则不显示) 
        
select * from student where exists (select * from student where ssex='男')

**any, some, all子查询: **

** any 子查询**

**表示满足其中任意一个条件 **

假设any内部的查询语句返回的结果个数是三个,

        如:result1,result2,result3,那么, 
        select ...from ... where a > any(...); 
        ->相当于: 
select ...from ... where a > result1 or a > result2 or a > result3; 

some 是 any的别名,所以用法是一样的,可以替代使用

        --查询出一班成绩比二班最低成绩高的学生
        
        select *  from student 
        inner join sc on student.sid = sc.sid
        where classid = 1  and (score > 70.0 or score > 60.0 or 
        score > 80.0 or score > 50.0 or score > 30 or score > 20 
        or score > 31 or score > 34)
        
        
        select *  from student 
        inner join sc on student.sid = sc.sid
        where classid = 1  and  score > any(select score from student 
        inner join sc on student.sid = sc.sid
        where classid = 2)

all 子查询

**表示满足其中所有条件条件,ALL关键字与any关键字类似,只不过上面的or改成and。 **

**假设any内部的查询语句返回的结果个数是三个, **

select ...from ... where a > all(...);

->

select ...from ... where a > result1 and a > result2 and a > result3;
        查询出一班成绩比二班最高成绩高的学生
        
        select *  from student 
        inner join sc on student.sid = sc.sid
        where classid = 1  and (score > 70.0 and 
        score > 60.0 and 
        score > 80.0 and score > 50.0 and 
        score > 30 and score > 20 
        and score > 31 and score > 34)
        
        select *  from student 
        inner join sc on student.sid = sc.sid
        where classid = 1  and  score > all(select score from student 
        inner join sc on student.sid = sc.sid
        where classid = 2)
        

控制sql语句

if(v,v1,v2)

v 逻辑表达式 Boolean值

如果真 显示v1

如果假 显示v2

        select tid,tname,if(tsex=1,'男','女'),tbirthday from teacher

ifnull(v,v1)

v 字段

v1 如果字段的值是一个null v1就显示

        select sid,sname,ifnull(birthday,'1900-1-1') birthday,
        ssex,ifnull(classid,3) classid from student

**case when then end **

--简单case

        select tid,tname,
        case tsex 
            when 1 then '男'
            when 0 then '女'
            else '未知'
        end tsex, 
        tbirthday, taddress
         from teacher

-- 搜索case

        select tid,tname, 
        case 
            when tsex > 1 then '未知'
            when tsex = 1 then '男'
          when tsex < 1 then '女'
            else '不能出现情况'
        end 
        ,
tbirthday,taddress from teacher
标签: mysql 数据库 sql

本文转载自: https://blog.csdn.net/Frank_JJ/article/details/125930204
版权归原作者 俙江 所有, 如有侵权,请联系我们删除。

“MySql的DDL和DML和DQL的基本语法”的评论:

还没有评论