MySQL的增删查改

来源:互联网 发布:post 测试工具 json 编辑:程序博客网 时间:2024/05/16 05:27

MySQL的增删查改
sql分类:
 DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
 DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(增、删、改)
 DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
 DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
DDL
操作数据库 和 表
 * 操作数据库:
 * 创建:create database 数据库名称;
 * 删除:drop database 数据库名称;
 * 修改:ALTER DATABASE mydb1 CHARACTER SET 要修改的字符集名称
 * 查询:show databases; -- 查询所有数据库的名称
         show create database 数据库名称; -- 查询创建数据库语句
  
 * 操作表:
 * 创建:
 * 列的数据类型:
 * int:整型  id int,
 * double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
    money double(5,2)
 * char:固定长度字符串类型;name char(10)  "张三"
 * varchar:可变长度字符串类型;name varchar(10)"张三"
     
 * text:字符串类型;存大格式的文本 比如存个小说 一般不用
 * blob:字节类型;存字节类型的数据  比如电影字节  图片字节 但是一般不会把字节数据存到数据库当中
 * date:日期类型,格式为:yyyy-MM-dd;
 * time:时间类型,格式为:hh:mm:ss
 * datetime:日期时间类型   yyyy-MM-dd hh:mm:ss
 * timestamp:时间戳类型  yyyy-MM-dd hh:mm:ss(如果该类型的字段不给赋值,则默认当前时间)
   
 * 语法:
 create table 表名(
   列名1 类型1,
   列名2 类型2,
   ...
   列名n 类型n
   );
 create table student(
   sname varchar(20),
   age int,
   gender varchar(6)
   );
  
 * 删除:drop table 表名;
 * 修改:
  1. 修改之添加列:给stu表添加classname列:
   ALTER TABLE stu ADD (classname varchar(100));
  2. 修改之修改列类型:修改stu表的gender列类型为CHAR(2):
   ALTER TABLE stu MODIFY gender CHAR(2);
  3. 修改之修改列名:修改stu表的gender列名为sex:
   ALTER TABLE stu change gender sex CHAR(2);
  4. 修改之删除列:删除stu表的classname列:
   ALTER TABLE stu DROP classname;
  5. 修改之修改表名称:修改stu表名称为student:
   ALTER TABLE stu RENAME TO student;  
 * 查询:show tables; -- 查询该数据库下所有表名称
 * desc 表名; -- 查询表结构(注意:操作表之前,应该先选择一个数据库使用:use 数据库名称;)

 

 

DML:
 * 增:
 * 语法:
 * insert into 表名(列名1,列名2,...) values(值1,值2,....);(注意:如果表的所有列都添加值,则列名可以省略)
   insert into stu(sname,age) values("lisi",23);
   insert into stu(sname,age,sex) values("zhangsan",23,'1');
   insert into stu values("ww",23,'2');
 * 删:
 * 语法:
 * delete from 表名 [where 条件];
 * truncate table 表名;-- 删除所有记录(先删除表,再创建表。)
    delete from stu where sname = 'lisi'
 * 改:
 * 语法:
 * update 表名 set 列名1 = 值1 , 列名2 = 值2... [where 条件]
   update stu set sex = "1" where sname = "lisi";
   update customer set money = 500000  where id = xxx;
DQL:查询
 * 语法:
 SELECT
 selection_list /*要查询的列名称*/
 FROM
 table_list /*要查询的表名称*/
 WHERE
 condition /*行条件*/
 GROUP BY
 grouping_columns /*对结果分组*/
 HAVING
 condition /*分组后的行条件*/
 ORDER BY
 sorting_columns /*对结果分组*/
 LIMIT
 offset_start, row_count /*结果限定*/

 * 条件查询:where 子句
  =、!=、<>(不等于)、<、<=、>、>=;
  BETWEEN…AND;  在什么范围之间
  IN(set);
  IS NULL;为空
  IS NOT NULL 不为空
  AND; 并且
  OR;   或者
  NOT;非

 

 

* 模糊查询:like
 * 通配符
 * _:匹配单个任意字符

 比如: 我要查询姓名是3个任意字符组成的
 select  * from student sname like='___';
 例如:我要查询第二个字符是m的
 select * from student where sanme like '_m%';
   
 * %:匹配多个任意字符
 例如:我要查询名字中包含m的 select * from student where sname like '%m%';
 例如我要查询名字是a开头的 select * from student where sname like 'a%';
 例如我要查询名字是b结尾的 select * from student wher like '%b';
     

* 字段控制:
 * 修改字段的别名:AS (可以省略)
 * 给字段起别名:
 例如:   select sname as 姓名, sage 年龄 from student;
 *给运算字段起别名:
 例如: select sname as 姓名, (工资+奖金) as 总收入 from student;

 * 给表起别名:给每一张表起一个别名。简化书写
` 例如: select stu.sname, stu.sage from student as stu;
 * 字段运算:
 * null参与的运算,结果都为null 
 比如 工资 是100  奖金是null  我们让这两个字段运算 那结果就为null
 * 一般会将null替换为0: ifnull(字段名称,如果是null的替换值)  ifnull 是mysql的方言
    
 所有如果奖金字段为null 一般我们把奖金替换为0
 例如: select sname,(工资+ifnull(奖金,0)) as 总收入from student;
      
* 去除重复记录   比如我查询工资是3000的 出现了多条工资为3000 的记录 那我只想展示一条3000的记录所以可以用 distinct 去除重复记录
* DISTINCT    
 例如: select distinct 工资  from student;

 * 排序: order by  默认升序排列  ASC 默认值                DESC 降序排列
   按工资从小到大排
  select * from student order by 工资 asc;
  按工资从大到小排
  select * from student order by 工资 desc
  如果出现多条工资一样的 那我们可以指定第二排序条件
  select * from student order by 工资 desc,奖金desc;
  
* 聚合函数:
 * 聚合函数是用来做纵向运算的函数:
 COUNT():统计指定列不为NULL的记录行数; 统计个数的 比如我统计有多少个学生
 select count(sid) from student;  或者传个星 号    select count(*) from student;         一般不要传有null 值的字段

 MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
   例如 查询工资最大值    select max(工资) as 最高工资 from student;
 MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  例如 查询 最少工资   select min(工资) as 最小工资 from student;
 SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
  例如 计算总工资  select sun(工资) as 总支出 from student;
 AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
   例如:计算平均 工资 select avg(工资) as 平均工资 from student;

* 分组查询:group by     一般配合聚合函数使用 查出的数据才有意义
 * 查询的字段:
 1.分组字段本身
 2.聚合函数
 比如我按部分编号分组  比如有三个部门 然后我求每个部门的平均工资  那展示出来的数据应该有三条
 例如: select 部门编号,AVG(工资) from student group by 部门编号;

 1.例如查询 每个部门的部门编号 已经每个部门工资大于1500的人数
 select 部门编号, count(*) from student where 工资>1500 group by 部门编号;
 注意这里的 where 是对分组前的条件限定 也就是说不满足条件的 不参与分组

* where和having
 * where:在分组之前对条件进行限定。不满足条件,就不会参与分组
 * having:在分组之后,对结果集的筛选

 2.例如 我要查询 各个部门平均工资 大于2000 的部门
        select 部门编号,avg(工资) from student group by 部门编号 having avg(工资)>2000;
        3. 例如我要查询 各个部门  员工工资大于1500 的平均工资  并且平均工资 大于2000的部门
        上面这句话怎么理解呢? 首先查询各个部门 那肯定要按部门编号分组 分组前的条件限定是 员工工资大于1500的才参与分组
  计算出平均工资  然后对结果再进行筛选 筛选出 平均工资 大于2000的部门
 select 部门编号,avg(工资) from student group by 部门编号 where avg(工资)>1500 having  avg(工资)>2000;
* 分页查询:limit
 * limit 0,5 开始的记录索引, 每一页显示的条数     索引从0开始
 开始的记录索引  =  (页码-1)*每一页显示的条数
 例如 我显示第一页  每页5条记录
 select * from student limit 0,5 ;  这是第一页 5 条记录
 select * from student limit 5,5 ; 这是第二页 5条记录
 select * from student limit 10,5 这是第三页 5条记录 
 * oracle:rownum 分页方言
 * sqlserver:top 分页方言
* 约束:
作用:为了保证数据的有效性和完整性
mysql中常用的约束:主键约束(primary key)  唯一约束(unique) 非空约束(not null) 外键约束(foreign key)
主键约束:被修饰过的字段唯一非空
 注意:一张表只能有一个主键,这个主键可以包含多个字段
 方式1:建表的同时添加约束 格式: 字段名称 字段类型 primary key
 方式2:建表的同时在约束区域添加约束
 所有的字段声明完成之后,就是约束区域了
 格式: primary key(字段1,字段2)
 create table pk01(
    id int,
    username varchar(20),
    primary key (id)
   );
 insert into pk01 values(1,'tom');-- 成功
 insert into pk01 values(1,'tom');-- 失败 Duplicate entry '1' for key 'PRIMARY'
 insert into pk01 values(null,'tom');-- 失败  Column 'id' cannot be null
 create table pk01(
    id int primary key,
    username varchar(20),
    primary key (id)
   );-- 错误的 一张表只能有一个主键
   
 方式3:建表之后,通过修改表结构添加约束
 create table pk02(
   id int,
   username varchar(20)
   );  
 alter table pk02 add primary key(字段名1,字段名2..);
 alter table pk02 add primary key(id,username);
   
 insert into pk02 values(1,'tom');-- 成功
 insert into pk02 values(1,'tomcat');-- 成功
 insert into pk02 values(1,'tomcat');-- 失败
* 唯一约束:(了解)
 被修饰过的字段唯一,对null不起作用
 方式1:建表的同时添加约束 格式: 字段名称 字段类型 unique
  create table un(
    id int unique,
    username varchar(20) unique
           );  
 insert into un value(10,'tom');-- 成功
 insert into un value(10,'jack');-- 错误 Duplicate entry '10' for key 'id'
 insert into un value(null,'jack');-- 成功
 insert into un value(null,'rose');-- 成功
 方式2:建表的同时在约束区域添加约束
  所有的字段声明完成之后,就是约束区域了
  unique(字段1,字段值2...)
 方式3:建表之后,通过修改表结构添加约束
 alter table 表名 add unique(字段1,字段2);-- 添加的联合唯一
 alter table 表名 add unique(字段1);-- 给一个添加唯一
 alter table 表名 add unique(字段2);-- 给另一个添加唯一
 create table un01(
   id int,
   username varchar(20)
   );
 alter table un01 add unique(id,username);
 insert into un01 values(1,'tom');-- 成功
 insert into un01 values(1,'jack');-- 成功
 insert into un01 values(1,'tom');-- 失败  Duplicate entry '1-tom' for key 'id'

* 非空约束(了解)
 特点:被修饰过的字段非空
 方式:
 create table nn(
   id int not null,
   username varchar(20) not null
   );
 insert into nn values(null,'tom');--  错误的 Column 'id' cannot be null

* truncate 清空表 ★
 格式:
 truncate 表名; 干掉表,重新创建一张空表
 和delete from 区别:
 delete属于DML语句  truncate属于DDL语句
 delete逐条删除 truncate干掉表,重新创建一张空表
  
* auto_increment 自增
 要求:1.被修饰的字段类型支持自增. 一般int
      2.被修饰的字段必须是一个key 一般是primary key
 create table ai01(
  id varchar(10) auto_increment
 );-- 错误 Incorrect column specifier for column 'id'
 create table ai01(
  id int auto_increment
 );-- 错误 Incorrect table definition; there can be only one auto column and it must be defined as a key
———————————————————————————————————————————————————————————————
案例2-创建多表,可以描述出表于表之间的关系
需求:
 把网上商城里面用的实体创建成表,并且将他们之间建立关系.
技术分析:
 sql

网上商城的实体:
 用户 订单 商品 分类
常见关系:
 一对多. 用户和订单  分类和商品
 多对多. 订单和商品 学生和课程
 一对一. 丈夫和妻子 
ER图可以描述实体于实体之间的关系
 实体用矩形表示
 属性用椭圆表示
 关系用菱形表示
———————————————————————————————————————————————————————————————
一对多
在开发中,关系中的一方称之为主表或者一表,关系中的多方称之为多表或者从表,
为了表示一对多的关系,一般会在多表的一方添加一个字段,字段名称自定义(建议:主表的名称_id)
字段类型一般和主表的主键的类型保持一致,我们称这个字段为外键
一对多:
用户和订单 
-- 创建用户表
create  table user(
 id int primary key auto_increment,
 username varchar(20)
 );
 
-- 创建订单表
create  table orders(
 id int primary key auto_increment,
 totalprice double,
 user_id int
 );
 
为了保证数据的有效性和完整性,添加约束(外键约束).
 在多表的一方添加外键约束
 格式:
 alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
 例如:
 alter table orders add foreign key(user_id) references user(id);
 添加了外键约束之后有如下特点:★
  1.主表中不能删除从表中已引用的数据
  2.从表中不能添加主表中不存在的数据
 开发中处理一对多:★
  在多表中添加一个外键,名称一般为主表的名称_id,字段类型一般和主表的主键的类型保持一致,
  为了保证数据的有效性和完整性,在多表的外键上添加外键约束即可.
 那如果添加了外键后我想删除主表中的数据 怎么办 ?
  方式1: ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE;
                    然后你就可以删除主表中的数据了
  方式2:先把带有外键的多表的数据删除,再删除一表中的数据
———————————————————————————————————————————————————————————————
多对多
 例子:商品和订单
  -- 创建商品表
 create table product(
  id int primary key auto_increment,
  name varchar(20),
  price double
 );

 -- 创建中间表
 create table orderitem(
  oid int,
  pid int
 );
  
 -- 添加外键约束
 alter table orderitem add foreign key(oid) references orders(id);
 alter table orderitem add foreign key(pid) references product(id);
 
 开发中处理多对多:★
  引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就可以将多对多的关系拆分
  成两个一对多了
  为了保证数据的有效性和完整性
   需要在中间表上添加两个外键约束即可.
———————————————————————————————————————————————————————————————
案例3-多表查询
技术分析:
 内连接
 外连接
 子查询
 多张表无条件的联合查询.没有任何意思
  select a.*,b.* from a,b;
——————————————————————————————————————————————————————————————  
内连接:★
 格式1:显式的内连接
  select a.*,b.* from a [inner] join b on ab的连接条件
 格式2:隐式的内连接
  select a.*,b.* from a,b where ab的连接条件
外连接:★
 左外连接:★
  select a.*,b.* from a left [outer] join b on 连接条件;  outer 可以不写
  意思:
  先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.
 右外连接:
  select a.*,b.* from b right [outer] join a on 连接条件;  outer 可以不写
  意思:
  先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.
子查询:★
 一个查询依赖另一个查询.