1.MySQL 数据库和数据表的基本操作

 

MySQL数据库


数据库           

 —— 就是一个文件系统,访问数据的时候需要通过标准的SQL语言来完成。                  

关系型的数据库 

 —— 保存的实体与实体之间的关系。(用户、商品、订单)

 —— 表格的结构
            
 * 常见的关系型数据库
   * Oracle            公司Oracle(甲骨文)数据产品,收费的大型的数据库。
   * MySQL             开源的,被Oracle收购。5.x版本免费,6.x收费了。
   * SQLServer        微软的,收费的中型的数据库。
   * DB2                 IBM公司收费的大型的数据库。
            
MySQL的简介

- 卸载
  * 找到MySQL的安装路径,找到my.ini的配置文件。
  * 安装的路径:basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.5/"         
  * MySQL存储数据的路径:datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"           
  * 卸载MySQL
  * 再找到上面的两个路径,删除就干净了。
- 安装
  * 安装路径不要有中文(*****)
  * MySQL默认端口是3306,不要修改。
  * 设置MySQL的编码集(采用UTF-8的编码)
  * 安装完成。
                
- 访问
 1.  cmd > 输入命令    mysql -u root -p 回车
      * 输入密码   回车

  * 如果是mysql  命令未找到,先配置环境变量

 2.  * 也可以用 navicat  等连接访问

- 密码重置
1.停止mysql服务
   services.msc 进入到服务界面
2.在cmd>输入一个命令
   mysqld --skip-grant-tables    (开启一个mysql服务,不需要进行认证)
3.新打开一个cmd窗口                    
 mysql -u root -p  不需要输入密码. enter 就可以进入.           
4.查看数据库
 show databases;
5.使用mysql数据库
 use mysql(系统数据库名);
6.修改密码                     
 update user set password=password('root') WHERE user='root';              
7.将两个窗口都关闭.
8.任务管理器中结束(mysqld)进程.
9.重启mysql服务


- MySQL之间的关系

  •  一个数据库的服务器中有多个数据库,一个数据库中有多个表。
  •  每个表有多个字段。字段和Java中类的属性是对应的。
  •  每一条记录对应是一个Java实例对象。

- SQL简介

  •      Structured Query Language, 结构化查询语言
  •      非过程性的语言
  1.  过程性的语言:下一条语句需要依赖上一条或者上几条语句。
  2.  非过程性的语言:写一条语句,就会执行一个结果。


- SQL语言分类
 - DDL(数据定义语言)
      - 创建数据库、创建表

 - DML(数据操纵语言)
      - 插入数据(insert)    修改数据(update)    删除数据(delete)

 - DCL(数据控制语言)
      - if else 等(处理逻辑,现在很少使用)

 - DQL(数据查询语言)
      - 查询数据 (select)

- 数据库操作

  • 创建数据库

         语法:create database 数据库名称;  
                 create database 数据库名称 [character set 编码] [collate 校对规则]; 

     默认为 character set 'utf8' collate 'utf8_bin'  
              * 校对规则和编码是成对出现的。

  • 查看数据库    

     show databases;        

  • 查询数据库的定义(可查看编码)   

     show create database 数据库名;              

  • 删除数据库    

     drop database 数据库名;

  • 修改数据库

          语法:alter database 数据库名 character set 编码 collate 校对规则;               

  • 其他的操作

         -切换数据库 use db_name;
         -查看当前使用的数据库 select database();


- 数据表操作

  • 创建

        语法:
          create table 表名(
              字段1 类型(长度) 约束,
              字段2 类型(长度) 约束,
              字段3 类型(长度) 约束,
              字段4 类型(长度) 约束
          );

        注意:
          * 表名小括号,后面要有分号。
          * 每一行字段后面要有逗号,但是最后一行没有逗号。
          * 数据的类型后面有长度,如果是字符串类型,长度必须加。

      如果其他类型可以不加。int 默认长度11
                        
根据用户表编写的 java 数据库用户模型类  (每一个成员变量对应数据表的一个字段名)

         
    public class User{
         int id;
         String name;
         String pass;
         String eamil;
         String nikename;
    }
                    
- 数据的类型
   -字符串类型
    * varchar和char区别:
      * varchar(经常使用) 长度是可变的。 name varchar(8)

    -存入数据hello,长度为5,但是如果存入helloworld就报错了。
      * char                  长度不可变的。   name char(8)

    -存入的数据hello,如果不够用空格补,全长度为8。
       * 效率高:char
                            
  -大数据类型(一般不用)
    -BLOB:二进制文件
    -TEXT:字符
                        
  -数值型
     TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
                    
  -逻辑性 对应boolean
      BIT
                    
  -日期型
     DATE、TIME、DATETIME、TIMESTAMP
     * date    只包含日期
     * time    只包含时分秒
     * datetime和timestamp包含日期和时分秒区别:
     - datetime  需要手动录入时间。
     - timestamp  不传入数据,默认选择当前系统时间。      

- 约束
  - 主键约束
  * 标识标记该条记录。    通过pramary key声明主键。(默认唯一、非空)
  * auto_increment    数据库维护主键。自动增长。
                    
 - 唯一约束
  * 值是唯一的。使用unique声明
                    
 - 非空约束
  * 值不能为空    not null


                
 - 查看表的信息   

 desc 表名;
- 查看当前库内所有表名

 show tables ;
- 查看建表语句和字符集

 show create table 表名;
- 删除表
  drop table 表名;
 - 修改表

  • 添加字段: alter table 表名 add 字段 类型(长度) 约束;            
  • 删除字段: alter table 表名 drop 字段;                                     
  • 修改类型或者约束: alter table 表名 modify 字段 类型(长度) 约束;    
  • 修改字段的名称: alter table 表名 change 旧字段 新字段 类型(长度) 约束;       
  • 修改表名: rename table 表名 to 新表名;  
  • 修改字符集: alter table 表名 character set utf8;     

对数据操作

stu表:

create table stu(
    id int primary key auto_increment,
    name varchar(20) not null,
    math varchar(4),
    chinese varchar(4),
    pe varchar(4)
);

插入几条数据以后:

查询总分大于220分的所有同学

select * from stu where (math+chinese+pe) > 220;

 

查询语文分数为40,45,46的同学。(用in方式)

select * from stu where chinese in(40,45,46);

查询数学分数在 79-90之间的同学,并且语文成绩大于80。

select * from stu where math > 79 and math < 90 and chinese > 80;
或  select * from stu where math between 79 and 90 and chinese > 80

 

like      

 模糊查询        写法:like '张_' 或者 '张%';  

 _和%区别:占位符。_只表示一个字符,%可以表示多个

例如,有名字叫张三,张三丰的2人

  like '张_'    只能匹配到 张三

  而 like '张%'  能匹配到两个人

匹配姓张的人

select * from stu where name like '张%';

或

select * from stu where name like '张_';

  

对学生成绩按照数学进行降序排序,数学相同学员按照语文降序

select * from stu order by math desc,chinese desc;

结果张三竟然排在了lisi前面,寻找出错原因,发现chinese 列的类型为字符型的varchar,

不是数字类型,改为int 类型:

alter table stu modify chinese int(4);

重新排序

select * from stu order by math desc,chinese desc;

结果正常。(字符型 100 和 95 比大小这儿就不多做探讨了)

先更改一个数据

update stu set math = NULL where id = 2;

统计一个班级语文、体育、数学的成绩总和

select sum(math+pe+chinese) from stu
select sum(ifnull(math,0)+pe+chinese) from stu;
select sum(math)+sum(pe)+sum(chinese) from stu;

分析原因:sum(NULL+45+84) , NULL+45+84 = NULL

所以,并没有将张三的另两门成绩算入。

解决方法: ifnull(math,0)   空的话就设为 0

统计一个班级语文成绩平均分

select chinese,sum(chinese) / count(*) as avg from stu;

select avg(chinese) from stu;

取出数学成绩最高的学生成绩

select*from stu where math=(select max(math) from stu);

select * from stu order by math desc limit 0,1;

前一句涉及多条查询,显然,后者效率更高。

再来一张表:

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);
insert into orders(id,product,price) values(6,'电视',900);

group by    分组(一起使用)    条件过滤用 having,不能使用 where

对订单表中商品归类后,显示每一类商品的总价:

 

select product,count(*),sum(price) from orders group by product;

查询购买了几类商品,并且每类总价大于100的商品:

select product,sum(price) from orders group by product having sum(price) > 100;

 

注意

select 语句 : S-F-W-G-H-O 组合

select ... from ... where ... group by... having... order by ... ;
顺序不能改变

posted @ 2016-12-06 21:46  MatthewBlog  阅读(151)  评论(0)    收藏  举报

页脚