Day_01 MYSQL(上)

遇到的一些问题:
Q1:如果在MySQL中一个表test中的id字段设为auto_increment插入两条记录后id=2,此时删除一条记录再插入一条变成id自增时跳过了2,如何设置在新插入一条时,id从2开始技术使用.

问题如图:

Day_01 MYSQL(上)_第1张图片
1.png

解决办法有两个:
法一:插入数据时直接设置好id
法二:使用: mysql>alter table 表名 auto_increment = 2;
可以使新添加一条时,id从2开始,
如果auto_increment=值小于max(id),则id从max(id)+1开始计数.
Q2:关于如何设置date字段的值?
解决办法: update 表名 set date='2014-02-09' where 条件;
注意:在添加date时需要将 date的值用 单引号括起来!

进去mysql控制台 :
win+r------>cmd------>mysql -u 用户名 -p(回车之后输密码)(mysql -u用户名 -p密码)
查询数据库:show databases;
使用数据库:use database 数据库名;
查询某一个数据库中有哪些表:show create database 数据库名
查询数据库中的表:show tables;
查询表结构::desc 表名;
查询表中的所有数据:select * from 表名;
一丶SQL语言(Structured Query Language):结构化查询语言,可以很方便的存储数据库,以及更新,删除和管理数据库管理系统.
分类:DDL:数据定义语言,主要是用于定义数据库,数据表,列等
关键字:create,drop,alter
DML:数据库操作语言,主要是用来对数据增,删,改的操作
关键字:insert,delete,update
DCL:数据库控制语言,主要是用来设置权限以及创建用户的.
DQL:数据库查询语言,主要是用于查询数据表中的数据
关键字:select,from,where
CURD----->CREATE/UPDATE/READ/DELETE

如果列名是关键字, 则需要用包起来(tab键上面那个),如:`desc` 二丶SQL完成对数据库的操作: 创建数据库: `create database 数据库名;` 修改数据库字符编码: `create database 数据库名 character set 字符集格式; 修改数据库: `alter database 数据库名 character set 制定的码表名;` `//alter database web_01 character set utf8;` 删除数据库: ` `drop database 数据库名;
查询数据库:
show databases;``(查询所有数据库)
创建数据库:
create database 数据库名;
create database 数据库名 character set 字符集格式;
修改数据库:
alter database 数据库名 character set 指定的码表名;
//alter database web_01 character set utf8;
删除数据库:
drop database 数据库名;
查询数据库:
查看所有的数据库:
show databases;
查看某一个数据库(中有哪些表):
show create database 数据库名;
使用数据库:
use 数据库名;

注意:
    数据库的操作是一个不可逆的操作, 执行了就是执行了, 并不能撤销.

三丶SQL完成对数据库表的操作
创建表:
create table 表名(
字段名 字段类型(长度) [约束],
字段名 字段类型(长度) [约束],
字段名 字段类型(长度) [约束]
);
字段类型:
Java MySQL
byte/short/int/long tinyint/smallint/int/long
float/double float/double
char/String char/varchar
char: 长度固定的字符串
varchar: 长度可变的字符串
Date date/time/datetime/timestamp
datetime: 必须手动设置.
timestamp:时间戳, 利用系统当前时间存入.
File BLOB/TEXT(CLOB)
约束:
作用: 保证数据的完整性.
单表操作的约束:
主键约束: primary key //auto_increment 自动增长
唯一约束: unique
非空约束: not null
测试: 创建一个员工表.
create table employee(
eid int,
name varchar(20),
sex varchar(10),
birthday date ,
salary double,
intfo varchar(200)
);

        create table employee(
            eid int primary key auto_increment,
            name varchar(20) unique,
            sex varchar(10) not null,
            birthday date not null,
            salary double not null,
            intfo varchar(200) not null
        );


删除表:
    drop table 表名;

查看当前数据库中所有的数据表:
    show tables;
查看某个表的结构:
    desc 表名;

修改表:                //理解
    添加字段:
        alter table 表名 add 字段名 类型(长度) 约束;
        //alter table employee add image varchar(50) not null;
    修改字段类型长度和约束
        alter table 表名 modify 字段名 类型(长度) 约束;
        //alter table employee modify image varchar(100);
    修改字段名(列名):
        alter table 表名 change 旧字段名 新字段名 类型(长度) 约束;
        //alter table employee change image image2 varchar(200);
    删除字段:
        alter table 表名 drop 字段名;
    修改表名:
        rename table 旧表名 to 新表名;
    修改表的字符集:
        alter table 表名 character set 字符集;
  1. SQL完成对数据库表中记录的操作 //务必掌握
    注意:
    1. 值的个数与字段的个数要一致.
    2. 值的类型与字段的类型要一致.
    3. 值的长度不能超过字段设置的最大长度.
    4. 数字类型的值可以直接写, 其他类型的值要用''号引起来.
插入数据:
    插入部分数据:
        insert into 表名(字段1, 字段2, 字段3...) values(值1, 值2, 值3...);
    插入所有数据:
        insert into 表名 values(值1, 值2, 值3);
    插入多条数据:
        insert into 表名 values(值1, 值2, 值3),(值1, 值2, 值3),(值1, 值2, 值3);

    插入中文数据会出现乱码问题:
        产生问题的原因:
            控制台(windows操作系统)默认用的字符集(码表)是GBK, 而MySQL默认用的码表是UTF-8;
        解决方案:
            方案一:
                1. 找到MySQL安装目录下的my.ini文件,
                2. 将[client]下的default-character-set的值改为: gbk
                    /*
                        [client]

                        port=3306

                        [mysql]

                        default-character-set=gbk
                    */
                3. 然后重新启动MySQL服务.
                
                //services.msc windows执行, 打开本地服务.
            方案二:
                临时设置当前MySQL服务的码表为: gbk.
                //set names gbk;
                //insert into employee(name,sex) values('珍亮','男');
修改数据:
    修改某条记录:
        update 表名 set 字段名=值, 字段名=值 where 条件;
    修改全部记录:
        update 表名 set 字段名=值, 字段名=值;

删除数据:
    删除多条记录:
        delete from 表名;
    删除一条记录:
        delete from 表名 where 条件;
    注意:
        删除的都是表中的一条记录.

    面试题:
        delete from 和 truncate table 之间有什么区别?
            delete from:
                是一条记录一条记录的删除, 属于DML语句.
                //事务作用在DML上的
                /*
                    示例:
                        start transaction;      //开启事务
                        delete from employee;   //删除employee表中的数据
                        select * from employee; //查询employee表中的数据
                        rollback;               //事物回滚
                        select * from employee; //查询employee表中的数据
                */
                
            truncate table:
                是将整个表删除了, 然后重新创建一个与之一样的表, 属于DDL语句.


查询数据:
    基本的查询语句:
        select * from 数据表名;

        select * from 表 where 条件;
    条件:
        1. 比较运算符
            >, <, >=, <=, =, <> 
        2. 逻辑运算符
            and, or, not
        3. 区间的判断
            between 值1 and 值2;
        4. 固定值的判断
            in 多条件查询
        5. 模糊查询
            like 模糊查询

    案例:
        创建学生成绩表:
            create table exam( 
                id int primary key auto_increment,
                name varchar(20),
                chinese int,
                math int,
                english int
            );
        往表中添加几条数据:
            insert into exam values(1,'张三',82,69,90),
            (2,'李四',50,41,62),
            (3,'王五',59,59,59),
            (4,'赵六',98,99,99),
            (5,'田七',96,59,41),
            (6,'王二麻子',60,83,51);

    需求:
        1. 查询英语成绩大于90的学生信息.
        
        2. 查询姓名为张三的学生信息.
        
        3. 查询学生英语成绩不是90分的学生信息.
    
        4. 查询姓王的学生的信息
            like关键字: 模糊查询
            使用_或者%作为占位符, _代表一个字符, %代表多个字符
            //示例: like '%三%';
            
        5. 查询英语成绩是59,62,90分的学生信息.
            in关键字: 放入多个条件值.
            
        6. 查询数学成绩在70-100之间的所有的数据.
            
            

表达式查询:
    1. 查询学生姓名和学生总成绩.
        //select name, chinese + math + english from exam;
    2. 别名查询 使用 as 关键字, as 可以省略
        //select name, (chinese + math + english) as sum from exam;
    3. 查询姓王的学生的总成绩
        //select name, (chinese + math + english) as sum from exam where name like '王%';


排序查询:
    select * from 表名 where 条件 order by 字段 asc/desc;
    
    1. 查询姓名和数学成绩, 按数学成绩排序.
        select name,math from exam order by math; 
    2. 查询姓名和语文成绩, 按语文成绩倒序排序.
        select name,chinese from exam order by chinese desc;
    3. 查询学生成绩, 按数学成绩排序, 如果数学成绩相同, 按英语成绩排序.          //????
        select * from exam order by math asc, chinese desc;
    4. 查询姓王学生信息并按数学排序
        select * from exam where name like '王%' order by math;
        
    
聚合函数:
    count
    sum
    max
    min
    avg
    
    1. 查询成绩表中总共有多少条记录.
        select count(*) from exam;
    2. 查询语文成绩的平均值.
        select avg(chinese) from exam;
    3. 查询语文成绩的最大值.
        select max(chinese) from exam;
    4. 查询英语成绩的最小值.
        select min(english) from exam;
    5. 查询数学成绩的总和.
        select sum(math) from exam;
        
分组统计:
    关键字: group by
    
    案例: 创建产品表
        create table product(
            pid int primary key auto_increment,
            pname varchar(20),
            price int
        );
        
        insert into product values('冰箱',2000),
        ('冰箱',1000),
        ('冰箱',1500),
        ('洗衣机',2000),
        ('电视机',3000),
        ('洗衣机',1000),
        ('电视机',10000),
    
    需求:
        1. 统计每类商品的个数.
            //select pname, count(*) from product group by pname;
        2. 统计每类商品的总金额.
            //select pname, sum(price) from product group by pname;
        3. 统计每类商品的总金额, 并且总金额大于7000
            //select pname, sum(price) from product group by pname having sum(price)>7000;
        
    总结:
        查询语句格式:
            select * from 表名 where 条件 group by 字段 having 条件 order by 字段


记忆:
    在进行更新语句操作的时候, 一定要备份, 一定要备份, 一定要备份.

你可能感兴趣的:(Day_01 MYSQL(上))