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

SQL的概念

(1)SQL(Structured Query Language):结构化查询语言;其实就是定义了操作所有关系型数据库的规则。是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。

(2)SQL通用语法

① SQL 语句可以单行或多行书写,以分号结尾。

② 可使用空格和缩进来增强语句的可读性。

③ MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。

④ 3 种注释

* 单行注释: -- 注释内容 或 # 注释内容(mysql 特有)

* 多行注释: /* 注释 */

DDL:操作数据库、表

1. 操作数据库

① C(Create):创建

创建数据库:

create database 数据库名称;

② R(Retrieve):查询

查询所有数据库的名称:

show databases;

查询某个数据库的字符集:查询某个数据库的创建语句

show create database 数据库名称; 

③ U(Update):修改

修改数据库的字符集

alter database 数据库名称 character set 字符集名称;

④ D(Delete):删除

删除数据库

drop database 数据库名称;

判断数据库存在,存在再删除

drop database if exists 数据库名称;

⑤ 使用数据库

查询当前正在使用的数据库名称

select database();

使用数据库

use 数据库名称;

  1. 操作表

① C(Create):创建

        语法:

         create table 表名(
            -- 字段名  类型  属性,
            -- 字段名  类型  属性,
            -- ....
            -- 字段名  类型 属性
        -- );

注意:

a.最后一列,不需要加逗号(,)

b.[]部分是可以省略的

c.`` 反引号(让关键字失效)可以省略,主要为了区分关键字和普通文字

表名命名规范:

a.表名和字段名:表名是数据库中的唯一标识,字段名是表中的唯一标识

b.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔。

c.全部小写命名,禁止出现大写

d.字段名称不应该取得太长(一般不超过三个英文单词)

② 数据库类型(常用):

字符串类型:

  1. char[(M)]:固定长字符串,检索快但费空间(0<= M <=255)
  2. varchar[(M)]:可变字符串(0 <= M <=65535)
  3. text:文本串(4个G左右大小)

数值类型:

  1. tinyint:非常小的数据(1字节)
  2. int:标准整数(4字节)
  3. bigint:较大的整数,相当于long(8字节)
  4. Decimal(钱):字符串形式的浮点数(m,d),m个字节,小数点后d位

日期和时间类型

datetime: 日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss

如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值

Null类型:

• 理解为“没有值”或“未知值”;

• 不要用NULL进行算术运算,结果仍为NULL;

• MySQL中,0或NULL都意味着为假,1为真。 

两种表的适用场景:

使用MyISAM:节约空间及相应速度;

使用InnoDB:安全性,事务处理及多用户操作数据表。

创建表

create table student(

        id int,

        name varchar(32),

        age int ,

        score double(4,1),

        birthday date,

        insert_time timestamp

);

复制表:create table 表名 like 被复制的表名; 

2. R(Retrieve):查询

查询某个数据库中所有的表名称

show tables;

查询表结构

desc 表名;

查看创建表的 SQL 语句

show creat table 表名;

3. U(Update):修改

1>. 修改表名

alter table 表名 rename as 新表名;

2>. 修改表结构

a.改变字段的属性

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

b.修改字段

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

3>. 添加字段

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

4>. 删除字段

alter table 表名 drop 字段名;

4. D(Delete):删除

drop table 表名;

drop table if exists 表名 ;

DML:增删改表中数据

1. 新增:

insert into 表名(字段名1,字段名2,...字段名n) values(值1,值2,...值n);

insert into 表名 values(值1,值2,...值n);

注意:

①列名和值要一一对应。

②日期用字符串的形式表示

③除了数字类型,其他类型需要使用引号(单双都可以)引起来

eg:

让主键自增(全字段语句)

  1. 在主键值中写default
  2. 在主键值中写null

一次性插入多条数据

insert into 表名(字段1,字段2...) value(值1),(值2)...;

不常用的新增方式:

  1. 拷表(表都要存在)

insert into 要拷贝的表名 select 字段名... from 被拷贝数据的表名

  1. 新建表的时候插入数据(新表不存在)

create table 新表名 select 字段名... from 被拷贝数据的表名

insert into 表名 value(值1,值2...);[后面的值必须是全字段]

2.删除数据:

delete from 表名;(整表删除)

delete from 表名 where 子句;

清空表:truncate 表名;

注意:

① 如果不加条件,则删除表中所有记录。

② 如果要删除所有记录

(1). delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作

(2). truncate table 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。

3. 修改数据:

语法:

update 表名 set 字段名1=值1,字段名2=值2,...字段名n=值n... where 子句

修改where后面字段名对应的where前面字段名的值

注意:

  1. 如果不加任何条件,则会将表中所有记录全部修改。
  2. -- 改变一个范围内的数据(>= and <=)等价于 between 小数据 and 大数据

DQL:查询表中的记录

1 基础查询

(1)查询表所有行和列的数据(得到的是一张虚拟表)

        select * from 表名

        select 全字段 from 表名;

(2)查询指定字段

        select 字段名1,字段名2... from 表名;

注意:如果查询所有字段,则可以使用*来替代字段列表。

(3)给字段起别名:

        a.select 旧字段名 as '新字段名';

        b.select 旧字段名'新字段名';

        c.select 旧字段名 新字段名;

表使用别名的原因:用于多表查询操作。

  1. 去除重复(distinct),查询字段名中完全相同的才会去掉,只要有一个重复的就会留下

        select distinct 字段名... from 表名;

  1. 带条件的查询 where 子句;

        eg:查询学生表中sid在3-7范围内的学生

                select * from student where sid between 3 and 7;

2 条件查询

条件查询:如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。

        select字段名 from 表名 where子句;

*:查询表中生日(生日日期越大,年龄越小)

流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

(1) where子句后跟条件

(2) 运算符

> 、< 、<= 、>= 、= 、<>/!=(不等于)

between...and (包头又包尾)

模糊查询:

a.like关键字

模糊符号 %:任意多的任意字符、_:一个任意字符

b.in关键字:在特定的范围内查找

c.is关键字(查询为空的数据:where 字段名 is null/查询非空的数据:where 字段名 is not null)

聚合函数:

语法:之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值 NULL。

-- 统计个数 count(字段)/字段可以写*、常量、任意字段名/count不统计数据为null的个数

-- 统计平均值 avg(字段)

-- 统计最大值 max(字段)

-- 统计最小值 min(字段)

-- 统计总和 sum(字段)

eg:select count(*) 总个数, sum(score) 总成绩, avg(score) 平均分, max(score) 最高分, min(score) 最低分 from sc;

分组查询:

分组查询用group by语句对查询信息进行分组,相同数据作为一组,分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

select 分组字段,聚合函数 from 表名 group by 分组字段名;

eg:select classid,count(*) from student group by classid;

where是对聚合(分组)前的每一条数据的筛选

having是对聚合(分组)后的每一条数据的筛选

having不能单独出现,必须搭配group by出现

eg:获取平均分大于80以上的同学

select sid,avg(score) from sc group by sid having avg(score) > 80;

排序 order by(降序desc、升序asc(默认升序))

可以写多个条件,用逗号隔开,先写第一需要排序的数据,以此类推

limit(分页)m,n m表示从几开始,n表示步长,取几条数据

查询表中5,6,7条学生的数据(公式:页码-1*步长,步长)

select * from student limit 4,3;

3 多表联查

  1. 等值联查(内联数据),适用于表少或表多数据少

        select * from 表1,表2 where 表1.字段1 = 表2.字段2...

        非等值联查

        笛卡尔积,把需要查询表的数据全部都罗列下来形成一个大的数据表

                select * from 表名1,表名2,...

        2. 连接查询(外联查询)

        select * from 表名1 inner join 表名2 on条件,inner join on,..., 数据大时建议使用

        left join on(左外联)

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

        right join on(右外联)

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

  1. 连接查询union

        union是求两个查询的并集

        union合并的是结果集,不区分来自哪一张表,所以可以合并多张表查询出来的数据

                select * from 表名1 inner join 表名2 on条件,inner join on,... union select * from 表名1 inner join 表名2 on条件,inner join on,... 

union特点:

  1. 字段名不一致时,会以第一张表的表头为准,并对其
  2. 会将重复的行过滤掉,与distinct类似
  3. 如果查询的表列数不对等,会报错
  4. 在每个句子中的排序是没有意义的,mysql在进行合并的时候会忽略掉
  5. 可以对合并后的整表进行排序
  6. 可以对表1的字段名起别名,就是最终的表头

union all,可以查询到联表中所有的信息

union all,可以查询到所有表的所有信息,求两个查询的并集,但不会把重复的过滤掉

4 子查询

  1. where子查询

        查询id最大的一名学生

                select * from student where sid = (select max(sid) from student);

        2. from子查询

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

        3. exists 子查询

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

  1. any,some,all子查询
    1. any子查询
      • 表示满足其中任意一个条件,假设any内部的查询语句返回的结果个数是三个result1...
      • Select...from... where a > any(...);

相当于:

Select...from... where a > result1 or a > result2 or a > result3;

      • any和some用法一致,可以互换
    • all子查询
      • 表示满足所有条件,假设any内部的查询语句返回的结果个数是三个result1...
      • Select...from... where a > all(...);

相当于:

Select...from... where a > result1 and a > result2 and a > result3;

  1. case when then end语句
    1. 简单case函数

        Case ssex

                When 1 then ‘男’

                When 2 then ‘女’

        End,

                2. Case搜索函数

        Case

                When ssex = 1 then ‘男’

                When ssex = 2 then ‘女’

        Else‘未知’

        End,

以上就是MySQLDDL和DML和DQL的基本语法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值