MySQL之DDL语句和表数据的insert、delete、update、select

1、DDL语句

DDL语句(DataBase Defined Language 数据定义语句)

1.1数据库的定义

(1)数据库的创建 CREATE
CREATE DATABASE db_name;创建一个默认的数据库,如果存在报错,不存在则创建。
CREATE DATABASE IF NOT EXISTS db_name;创建一个默认的数据库,[IF NOT EXISTS]表示,但数据库存在时什么也不做,不存在时创建。
CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET ‘utf8’;创建编码为utf-8的数据库
(2)数据库的删除 DROP
DROP DATABASE db_name;删除数据库,如果不存在报错,存在则删除。
DROP DATABASE IF NOT EXISTS db_name;删除数据库,存在删除,不存在什么也不做。
(3)数据库的修改 ALTER
ALTER DATABASE db_name CHARACTER SET ‘gbk’;一般就修改数据库的编码。

1.2、数据表的定义

(1)数据表的创建 CREATE
CREATE TABLE tab_name(col_name datatype [COMMENT ‘注释’],…)
tab_name:表的名称,可以自定义。
col_name:列的名称,可以自定义。
datatype:列的数据类型,常见的有(int整型、float浮点型、char定长字符型、varchar变长字符型、date日期、time时间、bool布尔…)
comment:给列添加注释
(2)数据表的修改 ALTER
ALTER TABLE tab_name RENAME TO new_tab_name;修改表的名称
ALTER TABLE tab_name CHANGE COLUMN old_col_name new_col_name datatype;修改列的名称,old_col_name:旧的列名称,new_col_name:新的列名称,datatype:数据类型
(3)数据表的删除 DROP
ALTER TABLE tab_name DROP COLUMN col_name;删除一列,col_name:列名称
ALTER TABLE tab_name ADD COLUMN col_name datatype;给表增加一列。
DROP TABLE tab_name;删除数据表,存在删除,不存在报错。
DROP TABLE IF NOT EXISTS tab_name;删除数据表,存在删除,不存在什么也不做。

2、DML语句

DML语句(Data Manipulation Language 数据操纵语言)

2.1、数据的增加 INSERT语句

INSERT
语法: INSERT [INTO] tab_name [(col_name,…)]VALUES(val,…)
描述:数据表添加数据,[(col_name,…)]可加可不加,加上是给指定的列添加数据,不加默认给所有列添加数据,VALUES后面的是具体的数据,数据个数和类型要和列的个数和类型要想对应。
案例1: 这里写图片描述
案例2: 这里写图片描述

2.2、数据的删除 DELETE语句

DELETE
语法: DELETE FROM tab_name [WHERE 条件][ORDER BY …][LIMIT row_count]
描述: 删除符合条件的信息,[ORDER BY …]:按照什么排序asc升序 desc倒序,[LIMIT row_count]:删除几行
案例1: 这里写图片描述
案例2: 这里写图片描述

2.3、数据的修改 UPDATE语句

UPDATA
语法: UPDATE tab_name SET col_name1=expr1 [, col_name2=expr2 …][WHERE 条件][ORDER BY …] [LIMIT row_count]
描述:指定修改符合条件的数据
案例: 这里写图片描述

2.4、数据的查询 SELECT语句

2.4.1、全表查询
语法: SELECT * FROM tab_name
描述: 查询指定表的所有数据。
案例: 这里写图片描述
2.4.2、单条件查询
语法: SELECT * FROM tab_name WHERE 条件
描述: 查询该表中所有符合条件的数据
案例: 这里写图片描述
2.4.3、多条件查询:并且|或者
语法: SELECT * FROM tab_name WHERE 条件1 {AND\OR} 条件2..{AND\OR}条件n
描述: AND:查询同时符合多个条件的数据,OR:查询符合其中一个条件的数据
案例1: 这里写图片描述
案例2: 这里写图片描述
2.4.4、比较查询
语法:SELECT * FROM tab_name WHERE 字段比较条件
描述: 查询满足比较条件的数据
案例: 这里写图片描述
2.4.5、模糊查询:like搜索
语法: SELECT FROM tab_name WHERE col_name LIKE ‘%关键字%’ 或者 ‘关键字
描述: 查询包含关键字的数据,%:匹配任意0-n个字符,_:匹配任意一个字符
案例1: 这里写图片描述
案例2: 这里写图片描述
注意: 如果查询关键字中包含 % 或 _ ,可以用转义字符 \ 将字符转移成普通字符 这里写图片描述
2.4.6、空值查询
语法: SELECT * FROM tab_name WHERE col_name IS NULL 或 IS NOT NULL
描述: 查询字段是否为空的所有数据
案例1: 这里写图片描述
案例2: 这里写图片描述
2.4.7、范围查询 IN
语法: SELECT * FROM tab_name WHERE col_name IN (val1,val2,val3…)
描述: 查询字段满足数值中的所有数据
案例: 这里写图片描述
2.4.8、范围查询 区间查询
语法: SELECT * FROM tab_name WHERE col_name BETWEEN … AND…
描述: 查询字段在区间内的数据
案例: 这里写图片描述
2.4.9、排序查询
语法: SELECT * FROM tab_name ORDER BY col_name [ASC\DESC]
描述: 排序查询,可以一次指定一列或多列进行升序或降序
案例1: 这里写图片描述
案例2: 这里写图片描述
2.4.10、分页查询
语法: SELECT * FROM tab_name LIMIT m,n
描述: 查询一张表中的数据,起始id位m,查询n条
案例: 这里写图片描述
公式: m = n * (page - 1) 其中page:页数
2.4.11、聚合函数
名称 描述
avg() 求取指定列的平均值
count() 求取指定列的数据总数量
max() 求取指定列中数据的最大值
min() 求取指定列中数据的最小值
sum() 求取指定列中数据的和

这里写图片描述

2.4.12、指定列查询
语法:SELECT col_name1,col_name,… FROM tab_name;
描述: 查询指定列的数据信息
案例: 这里写图片描述
2.4.13、分组查询
语法: GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP]
描述: (1)属性名:是指按照该字段的值进行分组。(2)HAVING 条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示。(3)WITH ROLLUP:将会在所有记录的最后加上一条记录。加上的这一条记录是上面所有记录的总和。(4)一般分组查询和聚合函数一起使用 (5)分组查询和GROUP_CONCAT(col_name)一起使用,显示改组该字段的数据。
案例: 这里写图片描述这里写图片描述
2.4.14、关于查询时,关键字的顺序
SELECT
    指定查询列
    [FROM 表名称
    (1)[WHERE 条件]
    (2)[GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    (3)[HAVING 分组条件]
    (4)[ORDER BY {col_name | expr | position}
      [ASC | DESC] , ...]
    (5)[LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [FOR UPDATE | LOCK IN SHARE MODE]]

2.5、多表关联查询

# 创建部门表 bumen
CREATE TABLE bumen(
    `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '部门编号',
    `dname` VARCHAR(20) NOT NULL COMMENT '部门名称',
    `darea` VARCHAR(20) NOT NULL COMMENT '办公地点',
    `dreg_time` DATETIME NOT NULL COMMENT '创建时间',
    `ddesc` TEXT COMMENT '描述',
    `dremark` VARCHAR(200) DEFAULT '待完善备注信息' COMMENT '备注'
)
# 创建员工表 emp
CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工编号',
    NAME VARCHAR(20) NOT NULL COMMENT '员工姓名',
    age INT DEFAULT 0 COMMENT '员工年龄',
    pid INT COMMENT '上级编号',
    reg_time DATETIME COMMENT '入职时间',
    bm_id INT NOT NULL COMMENT '所属部门编号'
)

# 添加外键约束
ALTER TABLE emp  # 修改emp表
    ADD CONSTRAINT FOREIGN KEY `emp_bumen`# 增加一个名称为emp_bumen的外键约束
        (`bm_id`) REFERENCES bumen(id); # 当前emp表的bm_id关联bumen表的id字段

# 增加数据
INSERT INTO `bumen`(dname, darea, dreg_time, ddesc) 
    VALUES
        ('总经室', '东三街101', '2018-08-29 00:00:00', '总经理办公室'),
        ('行政', '东三街102', '2018-08-29 00:00:00', '行政办公地点'),
        ('人事', '东三街103', '2018-08-29 00:00:00', '公司人事管理部分'),
        ('后勤', '东三街104', '2018-08-29 00:00:00', '公司所有后勤资源管理'),
        ('财务', '东三街105', '2018-08-29 00:00:00', '财务都是公司的无冕之王'),
        ('教学部', '东三街106', '2018-08-29 00:00:00', '教学相关管理部门');


# 增加数据
INSERT INTO emp(NAME, age, pid, reg_time, bm_id)
    VALUES
        ('关磊涛', 40, NULL, '2015-11-11', 1),
        ('欧战民', 45, 1, '2015-11-11', 1),
        ('耿景武', 42, 1, '2015-11-11', 1),
        ('李志涛', 35, 3, '2015-11-11', 6),
        ('段菲菲', 25, 2, '2015-11-11', 2);
2.5.1、关联查询
语法:SELECT * FROM tab_name1,tab_name,…
描述: 多张表一起查询,会重复许多数据,数据条数等于两张表数据条数的乘积。
案例: 这里写图片描述
2.5.2、内连接查询
内连接 【掌握】  ---拼接查询结果
    内部有联系,使用内连接
    格式: [inner] join  ----inner可省
    结果:
        从左表中取出每一条记录,去右表中与所有的记录进行匹配;
        匹配必须是某个条件是左表中与右表中相同,才会保留结果,否则不保留;
    基本语法:
        左表 [inner] join 右表 
            on 左表.字段 = 右表.字段;

        注意事项:
            1on 表示连接条件;条件字段代表相同的业务含义
                (如 stu.cid 和 cla.id) 
                学生stu表中的班级cid  和 班级cla表中的id

            2、内连接可以没有连接条件,没有on之后的内容,
                这时候系统会保留所有结果(笛卡尔集)

            3、内连接可以使用where 代替 on
                通常不用where,因为where没有on效率高
                on指匹配到第一条成功的就结束,其他不匹配; 
                若没有,不进行匹配
                而where会一直匹配,进行判断    

            4、通常使用字段别名 表别名
                在查询数据的时候,不同表有同名字段, 
                这时候需要加上表名才能区分,
                而若表名太长,使用表别名
                若不想使用默认的字段名 可以通过[as] 设置字段别名

这里写图片描述

2.5.3、外链接查询
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1LEFT JOINLEFT OUTER JOIN 
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2RIGHT JOINRIGHT OUTER JOIN 
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

左外链接
这里写图片描述


2.6、子查询

子查询:子查询是一个查询语句嵌套着另外的查询语句,用来进行一定层次的查询,其中子查询相当于第一步查询过滤,外查询就是最后得到结果的查询。经常会用到关键字:ANY、SOME、ALL、IN、EXISTS

# 首先创建两张表
# 创建studen表
CREATE TABLE student(
    sid INT AUTO_INCREMENT PRIMARY KEY,
    sname VARCHAR(20),
    smajor VARCHAR(20)
)DEFAULT CHARSET 'utf8';

# 创建成绩表
CREATE TABLE grade(
    gid INT PRIMARY KEY,
    gcourse VARCHAR(20),
    gcore INT
)DEFAULT CHARSET 'utf8';

# 插入数据
INSERT INTO student (sname,smajor)
    VALUES
    ('tom','CS'),
    ('jerry','MS'),
    ('shuke','SE'),
    ('xiha','CS');

# 插入数据
INSERT INTO grade (gid,gcourse,gcore)
    VALUES
    (1,"Math",90),
    (2,"English",89),
    (4,"chinese",78),
    (5,"Physical",92),
    (6,"Phiosophy",87);
1、关键字ANY、SOME子查询
描述: 关键字ANY、SOME子查询:ANY/SOME都是表示满足其中一个条件即可。
案例: 这里写图片描述
2、ALL关键字查询
描述: 与ANY/SOME相反,是要满足所有的条件才行。
案例: 这里写图片描述
3、IN关键字查询
描述: 若外查询想要查询的结果在子查询中,则返回true,继续查询到结果,否则返回false,查询为NULL。
注意: 与ANY类似,但是很不相同,IN后面可是子查询,也可以是给定的集合。ANY后面必须为子查询,且前面必须有运算符(<、>、=)
案例1: 这里写图片描述
案例2: 这里写图片描述
4、关键字EXISTS查询
描述: 表示在EXISTS后面的查询结果是否有结果,而不在乎子查询返回什么样的结果。若子查询的结果至少有一行,则为True,若子查询结果为NULL,则返回False,外层查询不再进行。
案例: 这里写图片描述

2.7、合并查询

UNION与UNION ALL
描述: 合并查询主要是UNION与UNION ALL 两个,是将查询结果合并,但是必须满足:合并的列的数据与数据类型必须相同。
案例1: 这里写图片描述
案例2: 这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41963640/article/details/82156034