MySQL 基础 (二)- 表操作

目录

1  mysql表的数据类型

1.1  数值类型

 1.2  日期和时间类型

1.3  字符串类型

 2  用SQL语句创建表

3  用SQL语句向表中添加数据 

3.1  通用语法

3.2  语句解释

3.3  操作示例

4  用SQL语句删除表

4.1  通用语法

4.2  不同类型

5  用SQL语句修改表

6  实践

参考


1  mysql表的数据类型

MySQL支持多种类型数据,大致可以分为三类:数值、日期/时间和字符串(字符)类型

1.1  数值类型

MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

在这里插入图片描述

 1.2  日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性。

在这里插入图片描述

 

1.3  字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

在这里插入图片描述

 2  用SQL语句创建表

  • 创建MySQL数据表需要以下信息: (1) 表名 (2) 表字段名  (3)定义每个表字段
  • 用程序创建表,可以使用 SQL的CREATETABLE语句。CREATE TABLE table_name (column_name column_type);

注意:

  1. 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL,在操作数据库时如果输入该字段的数据为NULL,就会报错。
  2. AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  3. PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
  4. ENGINE 设置存储引擎,CHARSET 设置编码
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

3  用SQL语句向表中添加数据 

3.1  通用语法

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

注:如果数据是字符型,必须使用单引号或者双引号,如:“value”。

3.2  语句解释

MySQL 表中使用 INSERT INTO SQL语句来插入数据。
插入数据有三种方式:

  • 插入完整的行;
  • 插入行的一部分(指定列名);
  • 插入某些查询的结果(INSERT SELECT);

注:不指定列名是一种危险的方式,因为其高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。因此为保险起见,应指定列名插入。

3.3  操作示例

1.插入单行

insert into city (Name,CountryCode,District,Population)
values( 'Kabul' , 'AFG' , 'Kabol' , '1780000' );

2.插入多行

insert into city (Name,CountryCode,District,Population)
values
( 'Zarul' , 'BFG' , 'cabol' , '180000' ),
( 'Kabul' , 'AFG' , 'Kabol' , '1780000' );

3.插入查询数据

insert into city (Name,CountryCode,District,Population)
select Name,CountryCode,District,Population
from cityx

其实MySQL不关心名字对不对应,只要位置对应即可。

附:建表语句

CREATE TABLE city 
(
   Name        VARCHAR(100) NOT NULL  ,
   CountryCode    VARCHAR(100)   NOT NULL,
   Disrrict    VARCHAR(40)    NOT NULL,
   Population  INT 
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

4  用SQL语句删除表

4.1  通用语法

DROP TABLE table_name ;

4.2  不同类型

1.DROP
单独使用的时候是删除整个表

DROP TABLE <表名>;

drop和alter一起使用的时候可以指定column删除某个列

alter table test    
  drop column  name;

2.DELETE
单独使用delete语句会留下表,而删除表中的数据 ,通常和where一起使用

delete from Product    
   where sale_price>=3000;

注:delete语句不能使用groupby,having,order by子句
另外,delete语句删除对象不是表或者列,而是行 。如果删除单个列的值可以采用update将其更新为Null。

update Product 
set regist_date=null
where product_id='0008';

3.TRUNCATE

TRUNCATE TABLE <表名>

如果想从表中删除所有行,就是用TRUNCATE,速度很快。
小结:当不需要表时,用drop,当要保留该表,但要删除所有记录时,用truncate,当要删除部分记录时,用delete.
 

5  用SQL语句修改表

  • 修改表名:表名在一个数据库中唯一的确定一张表。格式:  ALTER TABLE 旧表名 RENAME 新表名;
ALTER TABLE student RENAME student4;
  • 修改列名:alter table 表名 change column 旧列名 新列名 新数据类型--修改表列名
ALTER TABLE email CHANGE COLUMN Email EMAIL VARCHAR(100);
  • 修改表中数据类型:格式:ALTER TABLE 表名 MODIFY 属性名 数据类型;
ALTER TABLE student1 MODIFY name varchar(30);
  • 修改表中数据:update 表名 set 字段名=‘新内容’ + where条件
update `runoob_tbl` set `submission_date`='2016-05-06' where `runoob_id`=3;
  • 删除行:delete from 表名 where 行字段名=字段值
delete from tablename where id=11;
  • 删除列:alter table 表名 drop column 列名
ALTER TABLE email DROP COLUMN name ;
  • 新建列:alter table 表名 add column 列名 数据类型;
alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not null;
  • 新建行:insert into 表名(字段名1,字段名2) values(值1,值2);
INSERT INTO table_name ( field1, field2,...fieldN )                                 VALUES                       
( value1, value2,...valueN );

6  实践

项目三:超过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 course 
(
  student  VARCHAR(50)  NOT NULL,
  class    VARCHAR(50)  NOT NULL
);

INSERT INTO course(student,class) VALUES ('A','Math');
INSERT INTO course(student,class) VALUES ('B','English');
INSERT INTO course(student,class) VALUES ('C','Math');
INSERT INTO course(student,class) VALUES ('D','Biology');
INSERT INTO course(student,class) VALUES ('E','Math');
INSERT INTO course(student,class) VALUES ('F','Computer');
INSERT INTO course(student,class) VALUES ('G','Math');
INSERT INTO course(student,class) VALUES ('H','Math');
INSERT INTO course(student,class) VALUES ('I','Math');
INSERT INTO course(student,class) VALUES ('A','Math');

#解答
select class from course group by class having count(distinct student) >=5;

项目四:交换工资(难度:简单)
创建一个 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 ,
  n_ame      VARCHAR(50)  NOT NULL,
  sex        VARCHAR(50)  NOT NULL,
  salary     INT          NOT NULL
);

INSERT INTO salary(id,n_ame,sex,salary) VALUES (1,'A','m',2500);
INSERT INTO salary(id,n_ame,sex,salary) VALUES (2,'B','f',1500);
INSERT INTO salary(id,n_ame,sex,salary) VALUES (3,'C','m',5500);
INSERT INTO salary(id,n_ame,sex,salary) VALUES (4,'D','f',500);

#解答
UPDATE salary SET sex = IF(sex = 'm','f','m');
相当于
UPDATE salary SET sex = IF(CASE sex WHEN 'm' THEN 'f' ELSE 'm' END);

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

在这里插入图片描述

参考

  1. SQL必知必会(第4版)
  2. MySQL 数据类型
  3. SQL语句中----删除表数据drop、truncate和delete的用法
  4. MySQL-创建、修改和删除表
  5. SQL中的每一张表都必须设有主键吗

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值