[MySQL_3]表操作

[MySQL_3]表操作 and 表联结

[一].操作

【一】.1.MySQL表数据类型

  • 大致分为三类——数值、日期/时间和字符串类型

1.1 数值类型

在这里插入图片描述

1.2 日期/时间

在这里插入图片描述

1.3字符串类型

在这里插入图片描述

【一】.2.用SQL语句创建表

语句解释

  • 有两种创建表的方式

    1. 多数 DBMS 都具有交互式创建和管理数据库表的工具;

    2. 表也可以直接用 SQL 语句操纵。

  • 使用SQL的 create table

2.1.设定列类型 、大小、约束

create table test
(
    prod_id char(10) not null,
    prod_name char(254) not null
 );   

  • NULL 为默认设置

在这里插入图片描述

2.2.设定主键

  • 主键是其值唯一标识表中每一行的列。只有不允许NULL值的列可作为主键

    create table test
    (
        prod_id char(10) not null,
        prod_name char(254) not null,
        primary key(prod_id)
     );   
    

在这里插入图片描述

【一】.3.用SQL语句向表中添加数据

3.1.语句解释

  • INSERT 用来将行插入(或添加)到数据库表

    1. 插入完整的行;

    2. 插入行的一部分;

    3. 插入某些查询的结果

      INSERT INTO test
      (
      	prod_id,
      	prod_name
      )
      SELECT test_2, 
       	prod_id,
      	prod_name
      FROM ***;
      
      • 合并

3.2.多种添加方式(指定列名;不指定列名)

  1. 不指定列名

    INSERT INTO test
    VALUES
    (
    	'1',
    	'czc'
    )
    
  2. 指定列名

    INSERT INTO test
    (
    	prod_id,
    	prod_name
    )
    VALUES
    (
    	'1',
    	'czc'
    )
    
  • VALUES 必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序
  • 其优点是——即使表的结构改变,这条INSERT 语句仍然能正确工作。

【一】.4.用SQL语句删除表

  • 从一个表中删除(去掉)数据
用法说明MyISAM(是否释放磁盘空间)Innodb
dropdrop table table_name删除表全部数据和表结构YY
truncatetruncate table table_name删除表全部数据,保留表结构YY
deletedelete from table_name删除表全部数据,表结构不变YN
delete from table_name where where ***带条件的删除,表结构不变NN
  • MyISAM—— 默 认 表 类 型 \color{Red}默认表类型 ,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合
  • InnoDB——支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。

【一】.5.用SQL语句修改表

说明
修改表名alter table 旧表名 rename 新表名;
修改列名alter talbe 表名 change column 旧列名 新列名 新数据类型;
修改表中数据类型alter talble 表名 modify 属性名 数据类型;
修改表中数据update 表名 set 字段名=‘新内容’ + where条件 ;
删除行delete from 表名 where 行字段名=字段值;
删除列alter table 表名 drop column 列名;
新建列alter table 表名 add column 列名 数据类型;
新建行insert into 表名(字段名1,字段名2) values(值1,值2);

【一】.6.作业

  • 【3】项目三:超过5名学生的课(难度:简单)

    创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。

    例如,表:

    ±--------±-----------+

    | student | class |

    ±--------±-----------+

    | A | Math |

    | B | English |

    | C | Math |

    | D | Biology |

    | E | Math |

    | F | Computer |

    | G | Math |

    | H | Math |

    | I | Math |

    | A | Math |

    ±--------±-----------+

    编写一个 SQL 查询,列出所有超过或等于5名学生的课。

    应该输出:

    ±--------+

    | class |

    ±--------+

    | Math |

    ±--------+

    Note:

    学生在每个课中不应被重复计算。

    #创建表
    CREATE TABLE courses
    (
    	student CHAR(4) NOT NULL,
    	class VARCHAR(50) NOT NULL
    );
    
    #添加数据
    INSERT INTO courses VALUES('A','Math');
    INSERT INTO courses VALUES('B','English');
    INSERT INTO courses VALUES('C','Math');
    INSERT INTO courses VALUES('D','Biology');
    INSERT INTO courses VALUES('E','Math');
    INSERT INTO courses VALUES('F','Computer');
    INSERT INTO courses VALUES('G','Math');
    INSERT INTO courses VALUES('H','Math');
    INSERT INTO courses VALUES('I','Math');
    INSERT INTO courses VALUES('A','Math');
    
    # 结果
    SELECT class from courses
    GROUP BY class 
    HAVING count(*)>=5;
    
  • 【4】项目四:交换工资(难度:简单)

    创建一个 salary表,如下所示,有m=男性 和 f=女性的值 。

    例如:

    | id | name | sex | salary |

    |----|------|-----|--------|

    | 1 | A | m | 2500 |

    | 2 | B | f | 1500 |

    | 3 | C | m | 5500 |

    | 4 | D | f | 500 |

    交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。

    运行你所编写的查询语句之后,将会得到以下表:

    | id | name | sex | salary |

    |----|------|-----|--------|

    | 1 | A | f | 2500 |

    | 2 | B | m | 1500 |

    | 3 | C | f | 5500 |

    | 4 | D | m | 500 |

# 创建表
CREATE TABLE salary
(
	id INT NOT NULL,
	name VARCHAR(4) NOT NULL,
	sex VARCHAR(4) NOT NULL,
	salary INT NOT null,
	PRIMARY KEY(id)
);
# 插入数据
INSERT INTO salary VALUES(1,'A','m',2500);
INSERT INTO salary VALUES(2,'B','f',1500);
INSERT INTO salary VALUES(3,'C','m',5500);
INSERT INTO salary VALUES(4,'D','f',500);

#结果
# 方法一 利用变量进行交换;
UPDATE salary SET sex='a' WHERE sex='m';
UPDATE salary SET sex='m' WHERE sex='f';
UPDATE salary SET sex='f' WHERE sex='a';
# 方法二 直接交换;
UPDATE salary SET sex=(CASE sex when 'm' then f else 'm' end);

CASE…END判断语句:case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略

case sex
	when 'm' then '男'
	when 'f' then '女'
	else '其他' end

【一】.7.参考

  1. 一周MySQL集训day3:MySQL 基础 (二)- 表操作
  2. mysql数据类型

【二】.表联结

【二】.1.MySQL别名

1.1使用别名的好处

  • 缩短SQL语句
  • 允许在一条select语句中多次使用相同的表

1.2INNER JOIN

在这里插入图片描述

  • 获取两个表中字段匹配关系的记录
SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
# 等价于
SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;

输出

在这里插入图片描述

直观表示:

在这里插入图片描述

1.3.LEFT JOIN

SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

读取左边的数据表 runoob_tbl 的所有选取的字段数据

直观表示:

在这里插入图片描述

  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录

参考——Mysql 连接的使用

CROSS JOIN

自连接

UNION

以上几种方式的区别和联系

【二】.2.作业

  • 【5】项目五:组合两张表 (难度:简单)

    在数据库中创建表1和表2,并各插入三行数据(自己造)

    表1: Person

    ±------------±--------+

    | 列名 | 类型 |

    ±------------±--------+

    | PersonId | int |

    | FirstName | varchar |

    | LastName | varchar |

    ±------------±--------+

    PersonId 是上表主键

    表2: Address

    ±------------±--------+

    | 列名 | 类型 |

    ±------------±--------+

    | AddressId | int |

    | PersonId | int |

    | City | varchar |

    | State | varchar |

    ±------------±--------+

    AddressId 是上表主键

    编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State

# 创建表 preson
CREATE TABLE Person(
	PersonID INT,
	FirstName VARCHAR(10),
	LastName VARCHAR(10),
	PRIMARY KEY(PersonID)
);
#创建表 address
CREATE TABLE Address(
AddressId INT PRIMARY KEY,
PersonId INT,
City VARCHAR(10),
State VARCHAR(10)
);
# 插入数据
INSERT INTO Person VALUE('1','wang','xiaoming');
INSERT INTO Person VALUE('2','cheng','xiaohong');
INSERT INTO Person VALUE('3','hai','xiaoqing');
# 插入数据
INSERT INTO Address VALUE('10','1','chengdu','china');
INSERT INTO Address VALUE('11','2','jingment','china');
INSERT INTO Address VALUE('12','4','chongqing','china');

结果

SELECT Person.FirstName,Person.LastName,Address.City,Address.State
FROM Person LEFT OUTER JOIN Address
ON Person.PersonId=Address.PersonId;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值