zoukankan      html  css  js  c++  java
  • MySQL 基础 (二)- 表操作

    MySQL表数据类型

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

    数值类型

     TINYINT------------>小整数值

    SMALLINT---------->大整数值

    MEDIUMINT--------->大整数值

    INT或INTEGER------>大整数值

    BIGINT----------------->极大整数值

    FLOAT------------------->浮点数值

    DOUBLE---------------->双精度浮点数值

    DECIMAL--------------->小数值

    日期和时间类型

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

    DATE-------------->YYYY-MM-DD---------->日期值

    TIME--------------->HH:MM:SS--------------->时间值或持续时间

    YEAR--------------->YYYY--------------------->年份值

    DATETIME-------->YYYY-MM-DD HH:MM:SS---->混合时间和日期

    TIMESTAMP------>YYYYMMDD HHMMSS------>时间戳

    字符串类型

    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET

    CHAR---------->0-255字节----------->定长字符串

    VARCHAR----->0-65535 字节------->变长字符串

    TINYBLOB---->0-255字节------------->不超过 255 个字符的二进制字符串

    TINYTEXT---->0-255字节-------------->短文本字符串

    BLOB----------->0-65 535字节----------->二进制形式的长文本数据

    TEXT------------>0-65 535字节---------->长文本数据

    MEDIUMBLOB-->0-16 777 215字节---->二进制形式的中等长度文本数据

    2.用SQL语句创建表

    create table 表名(列名 类型(大小) 约束)

    mysql>CREATE TABLE t_student(
                student_id INT PRIMARY KEY,
                student_name VARCHAR(10) NOT NULL,
                student_birthday DATETIME,
                student_phone INT UNIQUE,
                student_score FLOAT);

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

    INSERT INTO 表名称 VALUES (值1, 值2,....)
    指定列的话是在表名后添加列的名称,以下是不指定列的添加

    方式一:单条插入,

    INSERT INTO t_student  VALUES ('lilly', '20', '10', '90')
    

    方式一:多条插入,  

    INSERT INTO t_student  VALUES ('lilly', '20', '10', '90'),('bobo', '20', '10', '90'),('any', '20', '10', '90')
    

    4. 用SQL语句删除表

     1、drop table 表名称   

    drop table  t_student                   

    2、truncate table 表名称                 

    truncate  table  t_student        

      3、delete from 表名称 where 列名称 = 值   

    delete from  t_student  where test='test'  
    

    区别:

    drop(删除表):删除内容和定义,释放空间,drop语句将删除表的结构被依赖的约束,触发器,索引;依赖于该表的存储过程、函数将被保留,但状态会变为invalid

    truncate(清空表中的数据):删除内容,释放空间但不删除定义(保留表的数据结构),不能删除行数据,要删就要把表清空。

    delete(删除表中的数据):用于删除表中的行,delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行回滚操作

    truncate table 删除表中的所有行,但表结构及其列约束,索引等保持不变,新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。如果要删除表定义及其数据,请使用 drop table 语句。

    对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。

    执行速度,一般来说: drop> truncate > delete。

    delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。

      truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

    5. 用SQL语句修改表

    修改列名

    修改表中数据

    UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

    删除列

    DELETE FROM 表名称 WHERE 列名称 = 值

        新建列

    alter table 表名 add 列名 数据类型。
    

      

        新建行

    创建如下所示的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       |

    +---------+------------+                     

    创建一个 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,反之亦然)。要求使用一个更新查询,并且没有中间临时表。

    update
        salary
    set
        sex = if(sex='f','m','f')
    

      

                                

     

    表联结

    mysql别名

    使用MySQL别名来提高查询的可读性。支持两种别名,列别名和表别名

    使用as

    #要给列添加别名,可以使用AS关键词后跟别名。
    SELECT 列名称 as 别名 FROM 表名

    #如果别名包含空格,则必须引用:
    SELECT  列名称  as 别名	FROM 'descriptive name'

    #因为AS关键字是可选的,可以在语句中省略它。

    #给表添加别名
    SELECT  列名称 	FROM 表名 as 表别名

    INNER JOIN (内连接)

    取得两个表中存在连接匹配关系的记录。 

    SELECT column_name(s)
    FROM table_name1
    INNER JOIN table_name2 
    ON table_name1.column_name=table_name2.column_name
    
    SELECT 列名称  FROM 表1名  INNER JOIN 表2名  ON 表1.列名=表2.列名   

      

    LEFT JOIN(左连接)

    关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

    SELECT
    	*
    FROM
    	t_organization AS o
    LEFT JOIN t_department AS d ON o.organization_id = d.organization_id
    

    CROSS JOIN  

    又称为笛卡尔乘积,实际上是把两个表乘起来。

    SELECT * FROM [TABLE 1] CROSS JOIN [TABLE 2]
    
    或者:SELECT * FROM [TABLE 1], [TABLE 2]  

    自连接

    自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

     

    SELECT b.*
    from shopping as a,shopping as b
    where a.name='lily'
    and a.price<b.price
    order by b.id2019-04-03
    

    UNION

    操作符用于合并两个或多个 SELECT 语句的结果集。  

    SELECT column_name(s) FROM table_name1
    UNION
    SELECT column_name(s) FROM table_name2  

    在数据库中创建表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

    SELECT
    p.FirstName,p.LastName,A.City,A.State
    FROM
    person p
    JOIN 
    Address A
    ON
    p.PersonId=A.PersonId
    

     

    编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

    +----+---------+

    | Id | Email |

    +----+---------+

    | 1 | a@b.com |

    | 2 | c@d.com |

    | 3 | a@b.com |

    +----+---------+

    Id 是这个表的主键。

    例如,在运行你的查询语句之后,上面的 Person表应返回以下几行:

    +----+------------------+

    | Id | Email |

    +----+------------------+

    | 1 | a@b.com |

    | 2 | c@d.com |

    +----+------------------+

    DELETE e1
    FROM email e1, email e2  
    WHERE e1.email = e2.email 
    AND  
    e1.id > e2.id
    

      

     

     

  • 相关阅读:
    【小强升职记】读书笔记
    MySQL HA 方案 MMM、MHA、MGR、PXC 对比
    【新机必备】
    【LeetCode】剑指 Offer 03. 数组中重复的数字
    生成表索引的创建和删除语句
    iptables 屏蔽端口
    mysql-5.6.20主从同步错误之Error_code: 1062 Duplicate entry '1' for key 'PRIMARY', Error_code: 1062
    OpenFeign和Consul爱恨交织的两天
    Docker:Linux离线安装docker-compose
    MySql:mysql命令行导入导出sql文件
  • 原文地址:https://www.cnblogs.com/MsHibiscus/p/10646553.html
Copyright © 2011-2022 走看看