美文网首页Linux使用笔记
MySQL常用命令及案例

MySQL常用命令及案例

作者: ZOKE | 来源:发表于2017-06-27 18:44 被阅读11次

    1.创建数据库:create database 数据库名 [character set 字符集][collate 校对规则]; (中括号里面的内容不是必须的)
    (1).create database day08_3 character set gbk collate gbk_chinese_ci;
    (2).alter database day08_2 character set utf-8; (修改day08_2的字符集为utf-8)

    2.设置数据库编码:create database 数据库名 character set 字符集;

    3.查看数据库MySQL服务器中的所有的数据库: show databases;

    4.查看某个数据库的各种信息: show create database 数据库名;
    查看employee的建表语句:show create table employee;

    5.删除数据库:drop database 数据库名称;

    6.切换数据库:use 数据库名;

    7.查看正在使用的数据库: select database();

    8.创建表:
    create table 表名(
    字段名 类型(长度) 约束,
    字段名 类型(长度) 约束
    );
    create table sort (
    sid int primary key auto_increment, #分类ID (该键为主键,并且长度会自动增长,切记如果不是最后一行要加上逗号)
    sname VARCHAR(100) #分类名称
    );

    时间类型:
    ​ date: yyyy-MM-dd; datetime:日期和时间 yyyy-MM-dd HH:mm:ss; timeStamp: 时间戳

    9.删除主键:alter table 表名 drop primary key;

    10.删除一个表:drop table 表名; (alter table 表名 drop 列名;)删除一个列

    11.查看数据库中的所有表:show tables;

    12.查看表结构:desc 表名;

    13.修改表结构格式(添加一列):alter table 表名 add 列名 类型(长度) 约束;

    14.修改表修改列的类型长度及约束:alter table 表名 modify 列名 类型(长度) 约束;
    alter table sort modify sname varchar(50) not null;

    15.修改表修改列名:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
    注意:不能将原本含有null值的列的约束改为not null;如下所示,名字可以改但约束不对:
    alter table lam change ext extra2 varchar(10) not null;

    16.修改表名:rename table 表名 to 新表名;

    17.修改表的字符集:alter table 表名 character set 字符集;

    18.向表中的列插入数据语法:
    如果插入空值,请使用null
    插入的日期和字符串,使用单引号括起来。
    insert into 表 (列名1,列名2,列名3..) values(值1,值2,值3..); (向表中插入某些列)
    insert into 表 values (值1,值2,值3..); (向表中插入所有列)

    19.将指定的sname字段中的值 修改成 日用品
    update sort set sname='日用品';
    --将sid为s002的记录中的sname改成 日用品
    update sort set sname='日用品' where sid='s002';
    --将名字为王安全和黄海波的type改成4
    update star set type=4 where name='王安全' or name='黄海波';
    --将龙太子的价格在原价格的基础上增加2000
    update star set price=price+2000 where name='房祖名';
    --统计每个学生的总分。
    select *,chinese+math+english from exam;
    --查询总分大于200分的所有同学
    select * from exam where chinese+math+english>200;
    --求班级最高分和最低分(数值范围在统计中特别有用)
    select max(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
    select min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;

    20.删除表: delete from 表名 [where 条件] 或者 truncate table 表名;
    delete:一条一条删除,如果没加条件相当于将表中的数据全部删除,不清空auto_increment记录数,表结构还在;删除后的数据可以找回
    truncate:直接将表删除,重新创建一张一模一样的空表(速度快!),auto_increment将置为零,从新开始。

    21.查询表中所有字段: select * from 表名;
    select 字段1,字段2,...from 表名;
    例如:
    select id,name from zhangwu; (查询id和name这两列的数据)

    22.去除重复字段:
    distinct用于去除重复记录
    select distinct 字段 from 表名;
    例如:
    select distinct money from zhangwu; (去除money这一列中的重复数据并显示出来)
    select distinct age,name from star; (表示去掉所有行里面年龄和name都相同的行,并将age和name这两列打印出来)

    23.where和having的区别
    (1) having是在分组后对数据进行过滤.where是在分组前对数据进行过滤
    (2) having后面可以使用聚合函数(统计函数)where后面不可以使用聚合函数
    (3) having后面加的条件一定要与分组有关。(不明白也没关系)

    24.表别名: (暂时修改表名)
    select 字段名 as 别名 from 表名; 其中as可以省略
    select name as nam from star;

    25.列运算:
    select zname,zmoney+1000 as 'sum' from zhangwu;

    26.查询所有的吃饭支出
    select * from zhangwu where zname='吃饭支出';

    27.查询金额大于1000的所有数据
    select * from zhangwu where zmoney>1000;

    28.查询金额在2000到5000之间
    select * from zhangwu where zmoney >= 2000 and zmoney <= 5000;
    改造成between and 方式
    select * from zhangwu where zmoney between 2000 and 5000;
    between...and...: 包含临界值 eg: between 3000 and 6000相当于: 3000<=price<=6000

    29.查询金额是 1000,3500,5000 其中一个
    select * from zhangwu where zmoney = 1000 or zmoney=3500 or zmoney=5000;
    改造成in方式
    select * from zhangwu where zmoney in (1000,3500,5000);

    30.模糊查询,like和通配符一起使用:
    select * from zhangwu where zname like '%支出%';
    select * from star where name like('周%');
    ​ 占位符: % : 多位(0~n)
    ​ _ : 一位

    31.查询账务名字,五个字符的
    select * from zhangwu where zname like'_____';

    32.查询账务名,不为空的
    select * from zhangwu where zname is not null;
    select * from zhangwu where not ( zname IS NULL);

    33.聚合函数 (聚合函数的前面不能有字段名,如果一定要有,那么该字段名只能是用来分组的字段名)

    聚合函数不能写在where条件中
    聚合函数是用来做纵向运算的函数

    ​ count(*|字段);统计指定列不为NULL的记录行数,一般用来统计表中的总数据数

    ​ 如果要统计表中的总记录数,那么count( *|不能为空的字段名)

    ​ sum();计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

    ​ max();计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算

    ​ min();计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算

    ​ avg();计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

    34.查找所有明星的记录,按照价格升序
    select * from star order by price asc; (切记没有where)

    • 查找所有明星的记录,按照价格升序,如果价格一样,按照年龄降序
      select * from star order by price asc,age desc;

    • 统计star表中的总数据量,因为count()函数统计的是不为空的数据
      select count(*) from star;

    • 求明星价格的总和
      select sum(price) from star;

    • 查询身价最高的明星
      select max(price) from star;

    -查询明星的平均价格
    select avg(price) from star;

    如果有分组,select后面加的第一个字段名一定是用来分组的字段名**
    select type,group_concat(name,age,sex) from star group by type;

    -统计每一组的数据出现次数的总和,count()这一列的值代表type这一列中每个相同数据出现次数的统计
    select type,count(
    ) from star group by type;

    -统计每一组的相同数据的价格总和,sum(price)这一列的值代表age这一列中所有年龄相同的人的身价总和
    select age,sum(price) from star group by age;

    -在各个价格相同的组中,挑选出年龄最小的数据
    select price,min(age) from star group by price;

    -根据明星类别分组,统计不同明星类别的个数,并且该明星类别数量大于2并且年龄大于30的才查询出来
    select type,count() from star where age>30 group by type having count()>2;


    多表操作:
    -- 使用type作为外键,指向category表中的cid
    ALTER TABLE star ADD constraint fk_star FOREIGN KEY(TYPE) REFERENCES category(cid);

    -- 删除外键
    alter table star drop constrain fk_star;

    -- 结合两张表一起来查询
    SELECT * FROM star,category;

    -- 筛选正确数据
    SELECT * FROM star,category WHERE star.type=category.cid;

    -- 给隐式内连接查询加上一个别名
    SELECT * FROM star s,category c WHERE s.type=c.cid;

    -- 显示内连接查询,inner可以省略
    SELECT * FROM star s INNER JOIN category c ON s.type=c.cid;

    -- 使用左外链接查询,显示主表的所有数据
    (打印出左边star表的所有内容,左边star表不符合的内容用null显示,打印右边表格category符合条件的内容)
    SELECT * FROM star s LEFT OUTER JOIN category c ON s.type=c.cid;

    -- 使用右外连接查询,显示主表的所有数据
    (打印右边category表的所有内容,右边category表不符合的内容用null显示,打印左边表格category符合条件的内容)
    SELECT * FROM star s RIGHT OUTER JOIN category c ON s.type=c.cid;

    -- 使用子查询,查出身价最高的明星的信息
    SELECT * FROM star WHERE price=(SELECT MAX(price) FROM star); //后面小括号返回的是最高的price值

    -- 使用子查询查询价格高于IPhone8的商品信息
    SELECT * FROM product WHERE price>(SELECT price FROM product WHERE pname='IPhone8')

    -- 查询和农夫山泉是同一类别的商品信息且不能包含农夫山泉
    SELECT * FROM product WHERE TYPE=(SELECT TYPE FROM product WHERE pname='农夫山泉') AND pname <> '农夫山泉'

    -- 查询类别是手机数码的所有商品信息 //前提是product里面的type为category2表的外键
    SELECT * FROM product WHERE TYPE=(SELECT cid FROM category2 WHERE cname='手机数码')

    -- 联合查询
    CREATE TABLE A(
    NAME VARCHAR(10),
    score INT
    )
    CREATE TABLE B(
    NAME VARCHAR(10),
    score INT
    )
    //一次性插入多组数据
    INSERT INTO A VALUES('a',10),('b',20),('c',30);
    INSERT INTO B VALUES('a',10),('b',20),('d',40);

    -- 联合查询,将两个SQL语句查询出来的结果集进行合并
    SELECT * FROM a UNION SELECT * FROM b //去重排序出来
    SELECT * FROM a UNION ALL SELECT * FROM b //全部显示,不去重

    -- 分页查询,limit a,b,a表示从第几条数据开始查询,b表示每页的数据条数。如果客户端给咱们这样传数据,那我就开心啦。
    -- 客户端只会传给服务器,页数和每页的数据条数
    -- 如果客户端传过来 1,3表示,客户端需要第一页的数据,每页3条数据
    -- 服务器拿到页数和每页的数据条数之后,要将页数转换成从第几条数据开始
    SELECT * FROM star LIMIT 0,3

    -- 客户端给你传2,3
    SELECT * FROM star LIMIT 3,3

    -- 客户端给你传3,3
    SELECT * FROM star LIMIT 6,3

    -- 总结一个公式,将客户端传过来的页数page 转换成limit a,b中的a
    -- a=(page-1)*b

    -- 使用分页查询,查询出来身价最高的明星信息
    -- 先按照=身价由高到低排序,然后使用分页查询查询出第一条数据
    SELECT * FROM star ORDER BY price DESC LIMIT 0,1


    多表练习:

    --新建一个day09_exercise的数据库
    create database day09_exercise;
    use day09_exercise;

    -- 新建一个用户表(user)
    create table user(
    id int auto_increment primary key,
    username varchar(50)
    );

    -- 新建一个订单表(orders)
    create table orders(
    id int auto_increment primary key,
    price double,
    user_id int
    );
    -- 给订单表添加外键约束
    alter table orders add constraint user_fk foreign key (user_id) references user(id);

    -- 向user表中添加数据
    insert into user values(3,'张三'),(4,'李四'),(5,'王五'),(6,'赵六');

    -- 向orders 表中插入数据
    insert into orders values(1,1314,3),(2,1314,3),(3,15,4),(4,315,5),(5,1014,null);

    练习:
    --查询用户的订单,没有订单的用户不显示
    select *from user,orders where user.id=orders.user_id;
    或者select * from user join orders on user.id=orders.user_id;

    --查询所有用户的订单详情
    select *from user left join orders on user.id=orders.user_id;

    --查询所有订单的用户详情
    select *from user right join orders on user.id=orders.user_id;

    练习:
    --查看用户为张三的订单详情
    答案:select * from orders where user_id = (select id from user where username = "张三");

    --查询出订单的价格大于300的所有用户信息。
    答案:select * from user where id in (select user_id from orders where price>300); //注意in后面有空格

    --查询订单价格大于300的订单信息及相关用户的信息。
    SELECT * from user,orders where user.id=orders.user_id and orders.price > 300;

    相关文章

      网友评论

        本文标题:MySQL常用命令及案例

        本文链接:https://www.haomeiwen.com/subject/psgecxtx.html