• mysql基础操作


    1.数据库
    创建数据库
    create database mydb1;
    create database mydb2 character set utf8 collate utf8_bin;
    create database mydb3 character set gbk;
    collate校对规则
    查看mysql存储位置 :show global variables like "%datadir%";
    查看所有数据库
    show databases;
    查看数据库的创建语句
    show create database mydb1;
    数据库删除
    drop database mydb2;
    修改数据库
    alter database mydb1 character set gbk;
    选择数据库
    use mydb1;
    查看当前使用的数据库:
    select database();
    2.数据库表
    创建数据库表
    create table user(
    id int,
    name varchar(20)
    );
    创建employee表:
    字段 属性
    id 整形 int
    name 字符型 varchar(10)
    gender 字符型 varchar(2)
    birthday 日期型 date
    entry_date 日期型 date
    job 字符型 varchar(20)
    salary 小数型 float
    resume 大文本型 text

    create table employee(
    id int,
    name varchar(10),
    gender varchar(2),
    birthday date,
    entry_date date,
    job varchar(20),
    salary float,
    resume text
    );
    查看当前数据的所有表:
    show tables;
    描述表结构:
    desc table_name;

    id主键的employee表创建语句:
    create table employee(
    id int primary key auto_increment ,
    name varchar(20),
    gender varchar(2) ,
    birthday date,
    entry_date date,
    job varchar(20),
    salary double,
    resume text
    );
    修改表:
    在上面员工表的基本上增加一个image列。
    alter table employee add image blob;

    修改job列,使其长度为60。modify
    alter table employee modify job varchar(60);
    删除gender列。drop
    alter table employee drop gender;

    表名改为emp。
    rename table employee to emp;

    修改表的字符集为utf8
    alter table emp character set utf8;

    列名name修改为username
    alter table emp change name username varchar(20);

    修改姓名为唯一约束
    alter table emp change username username varchar(20) unique;
    修改salary字段为非空约束
    alter table emp change salary salary double not null;
    3.表数据操作:
    插入数据:
    向employee表中插入三条数据:
    insert into employee values(null,'李帅','男','1999-09-09','2000-09-09','吃饭',10000,'特别能吃');
    insert into employee values(null,'曹洋','男','1989-09-09','2000-01-01','喂饭',5000,'专业喂饭');
    insert into employee values(null,'谷丰硕','男','1998-02-09','2001-09-01','做饭',10000,'会做饭');
    更新操作:
    将所有员工薪水修改为5000元。
    update employee set salary = 5000;
    将姓名为'李帅'的员工薪水修改为3000元。
    update employee set salary = 3000 where name='李帅';
    将姓名为'曹洋'的员工薪水修改为4000元,job改为ccc。
    update employee set salary = 4000,job='ccc' where name= '曹洋';
    将'谷丰硕'的薪水在原有基础上增加1000元。
    update employee set salary = salary + 1000 where name='谷丰硕';
    删除语句:
    a. Delete语句练习
    删除表中名称为’李帅’的记录。
    delete from employee where name='李帅';
    删除表中所有记录。
    delete from employee;
    使用truncate删除表中记录
    truncate employee;
    拓展:
    truncate删除表结构并会重新建立表结构,以此形式来删除表中数据。这种删除方式可能会影响到表与表直接的关系,所在在多表结构当中不建议使用,如果是单表则可以使用。

    查询语句:
    练习1:
    查询表中所有学生的信息。
    select * from exam ;
    查询表中所有学生的姓名和对应的英语成绩。
    select name,english from exam;
    过滤表中重复数据。distinct去重
    select distinct english from exam;
    练习2:
    在所有学生分数上加10分特长分显示。
    select name,chinese+10,math+10,english+10 from exam;
    统计每个学生的总分。
    select name,chinese+math+english from exam;
    使用别名表示学生总分。
    select name,chinese+math+english as sum from exam;
    select name,chinese+math+english sum from exam;
    练习3:
    查询姓名为张飞的学生成绩。
    select * from exam where name='张飞';
    查询英语成绩大于90分的同学。
    select * from exam where english > 90;
    查询总分大于200分的所有同学。
    select name,chinese+math+english sum from exam where chinese+math+english>200;
    在where字句中不能使用select语句里的别名,因为where关键字比select关键字执行顺序靠前
    from --- where --- select
    练习4:
    查询英语分数在 80-100之间的同学。
    select * from exam where english between 80 and 100;
    select * from exam where english >= 80 and english <= 100;
    查询数学分数为65,75,77的同学。
    select * from exam where math in(65,75,77);
    查询所有姓张的学生成绩。
    select * from exam where name like '张%';
    查询数学分>70,语文分>80的同学。
    select * from exam where math > 70 and chinese > 80;
    select * from exam where math > 60 or chinese <90;
    查询数学成绩为null的学生
    insert into exam values(null,'朴乾',60,null,90);
    select * from exam where math is null;

    练习5:order by
    对语文成绩排序后输出。
    select chinese from exam order by chinese desc;
    对总分排序按从高到低的顺序输出
    select name,chinese+math+english as sum from exam order by sum desc;
    对姓张的学生成绩排序输出
    insert into exam values(null,'张飞飞',11,12,13);
    select name,chinese+math+english as sum from exam where name like '张%' order by sum asc;

    ifnull的使用:
    select name,ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0) from exam;
    #select math from exam;
    select ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0) as sum from exam order by sum;

    4.聚集函数
    count练习:
    统计一个班级共有多少学生?
    select count(name) from exam;
    select count(math) from exam;
    统计数学成绩大于90的学生有多少个?
    select count(math) from exam where math>90;
    统计总分大于230的人数有多少?
    select count(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam where ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0) > 230;
    sum练习:
    统计一个班级数学总成绩?
    select sum(math) from exam;
    统计一个班级语文、英语、数学各科的总成绩
    select sum(math),sum(chinese),sum(english) from exam;
    统计一个班级语文、英语、数学的成绩总和
    select sum(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam;
    统计一个班级语文成绩平均分
    平均分 = 总分/总人数
    select sum(chinese)/count(chinese) from exam;
    avg练习:
    求一个班级数学平均分?
    select avg(math) from exam;
    求一个班级总分平均分?
    select avg(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam;
    max/min函数
    练习:
    求班级最高分和最低分 (数值范围在统计中特别有用)


    create table c (
    id int,
    date date,
    amount int
    );
    insert into c values(1,'2007-07-09',7);
    insert into c values(2,'2007-07-09',3);
    insert into c values(2,'2007-07-10',3);
    insert into c values(2,'2007-07-1',1);

    select id,date from c group by id;
    select id,amount,count(*) from c group by id,amount;
    group by练习:对订单表中商品归类后,显示每一类商品的总价
    select product,sum(price) from orders
    group by product;

    • 使用having 子句 对分组结果进行过滤
    练习:查询购买了几类商品,并且每类总价大于100的商品
    select product,count(product) from orders
    group by product having sum(price)>100;
    在分组之后只能使用having子句过滤条件。
    在使用having的位置不可以使用where,但是使用where的位置可以很实用having。

    5.多表关系:
    //不添加外键的部门表和员工表
    create table dept(
    id int primary key auto_increment,
    name varchar(20)
    );
    insert into dept values (null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');
    create table emp(
    id int primary key auto_increment,
    name varchar(20),
    dept_id int
    );

    //添加外键的部门表和员工表
    create table dept(
    id int primary key auto_increment,
    name varchar(20)
    );
    insert into dept values (null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');
    create table emp(
    id int primary key auto_increment,
    name varchar(20),
    dept_id int,
    foreign key(dept_id) references dept(id)
    );


    insert into emp values (null,'张飞',1),(null,'关羽',2),(null,'刘备',3),(null,'赵云',4);
    //手动添加数据

    insert into emp value(null,'背景',5); --- 员工不应当插入一个不存在的部门
    delete from dept where id = 4; --- 部门已经被裁掉,员工应当提前辞退。
    select * from dept where id = 4;
    6.多表查询:
    笛卡尔积查询:
    会将两张表的全部内容相乘进行结果展示。如果左边表有m条数据,右标签有n条数据,则结果数量为m*n条数据。
    select * from dept,emp;
    在笛卡尔积查询的结果中发现,有一部分数据是正确的,这些数据的dept表的id字段和emp表的dept_id字段是相同的,这些字段关系正确,是我们需要的行数据,所以应该将正确的行数据取出,错误的行数据过滤掉。
    在笛卡尔积基础之上过滤掉错误数据:
    select * from dept,emp where dept.id = emp.dept_id;

    内连接查询:
    取出左边表有的且右边表也有的数据。
    select * from dept
    inner join emp
    on dept.id = emp.dept_id;

    外连接查询:
    insert into emp values(null,'背景',5);
    左外链接查询:
    在内连接查询的基础之上,获取左边表有且右边表没有的数据。
    select * from emp
    left join dept
    on dept.id = emp.dept_id;

    select * from emp as e
    left join dept as d
    on d.id = e.dept_id;

    右外连接查询:
    在内连接查询的基础之上,获取右边表有且左边表没有的数据。
    insert into dept values(null,'后勤部');
    //插入的数据要保证在右边表有,而左边表没有
    select * from emp
    right join dept
    on dept.id = emp.dept_id;

    全外连接查询:
    在内连接查询的基础之上,获取左边表有而右边表没有的数据和右边表有而左边表没有的数据。
    select * from dept
    left join emp
    on dept.id = emp.dept_id
    union
    select * from dept
    right join emp
    on dept.id = emp.dept_id;

     

    解决文字格式不对的办法:

    create database mydb character set gbk;

    create table employee(

    )ENGINE=INNODB charset=gbk;
    set names gbk;

     

    create table exam(
    id int primary key auto_increment,
    name varchar(20) not null,
    chinese double,
    math double,
    english double
    );

    insert into exam values(null,'关羽',85,76,70);
    insert into exam values(null,'张飞',70,75,70);
    insert into exam values(null,'赵云',90,65,95);
    -----------------------------------------------------------------------------
    create table orders(
    id int,
    product varchar(20),
    price float
    );

    insert into orders(id,product,price) values(1,'电视',900);
    insert into orders(id,product,price) values(2,'洗衣机',100);
    insert into orders(id,product,price) values(3,'洗衣粉',90);
    insert into orders(id,product,price) values(4,'桔子',9);
    insert into orders(id,product,price) values(5,'洗衣粉',90);

    -----------------------------------------------------------------------------
    create table dept(
    id int primary key auto_increment,
    name varchar(20)
    );
    insert into dept values (null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');


    create table emp(
    id int primary key auto_increment,
    name varchar(20),
    dept_id int
    );
    insert into emp values (null,'张飞',1),(null,'关羽',2),(null,'刘备',3),(null,'赵云',4);

     

  • 相关阅读:
    oracle数据比对工具
    一条update语句优化小记
    执行计划生成及查看的几种方法
    使用Grep命令查找 UTF-16的文本的注意事项
    命令行下更好显示 mysql 查询结果
    Zabbix通过SNMP监控多核CPU Load时,使用外部检查计算CPU Load的平均值。
    Hyper-V Cluster Clustered Role and Resource Properties and Live migration setting
    Python自动登录PRTG各节点,截取整个网页保存为图片
    添加Hpyer-V内存使用情况监控
    在Zabbix上添加Win DHCP Scope的监控
  • 原文地址:https://www.cnblogs.com/akic/p/10645699.html
Copyright © 2020-2023  润新知