mysql基础介绍

来源:互联网 发布:ug8.0编程教程 编辑:程序博客网 时间:2024/06/10 01:09

1.1 数据库

1.1.1 数据库的概述:

什么是数据库

数据库:就是一个文件系统,通过标准的SQL语句获得数据.

 

什么是关系型数据库:

关系型的数据库,存的都是实体之间的关系!!!

常见的关系型数据库:

MYSQL:免费的小型的数据库产品,现在已经被Oracle收购了!,MySQL6.x版本之后也开始收费.

Oracle:收费的大型的数据库产品.Oralce(甲骨文)公司产品.

SQL Server:收费的中型的数据库产品.微软公司的产品.(SQL Server主要针对微软平台.net).

DB2:收费的大型的数据库产品.IBM公司产品.(以后在银行的系统.IBM:WebSphere.

SYBase:收费的中型的数据库产品.(退出了历史舞台)

* PowerDesigner:数据建模的工具.

SQLite:嵌入式的小型数据库产品.Android系统中.

 

***** JavaEE开发的企业中一般都会使用MySQL Oracle.

1.2 MYSQL数据库:

1.2.1 卸载MYSQL数据库:

步骤1:查找系统中安装MYSQL的路径:

my.ini下查找两个路径:

* basedir="C:/Program Files/MySQL/MySQL Server 5.5/"

* datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"

 

步骤2:在控制面板中卸载MYSQL:

步骤3:删除MYSQL数据库卸载后的残留文件:

删除C:/Program Files/以及C:/Documents and Settings/All Users/Application Data/下面的mysql文件夹.

 

1.2.2 安装MYSQL数据库:

步骤1:安装MYSQL.

选择自定义安装:

* C:\Program Files\MySQL\MySQL Server 5.5\

* C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\

步骤2:MYSQL的默认端口号:

 

步骤3:修改MYSQL数据库的默认字符集:

 

步骤4:修改MYSQL的环境变量:勾选Include Bin Directory in Windows Path.

 

步骤5:设置MYSQL的最高管理员root的密码:

 

步骤6:安装成功之后:

 

步骤7:测试MYSQL是否安装成功:

* cmd>mysql -u root -p  回车

* Enter password:

如果出现该界面那么说明安装成功可以使用了!!!

 

1.2.3 重置root密码:

步骤1:停止MYSQL服务:

* services.msc--->停止MYSQL服务.

步骤2:打开一个cmd的窗口:

* mysqld --skip-grant-tables---- 相当于开启一个mysql的服务,但是跳过认证.

步骤3:重新打开一个cmd窗口:

* mysql -u root -p 回车

输入密码直接回车.

步骤4:连接了mysql之后输入以下命令:

* use mysql--- 使用mysql数据库.

步骤5:输入一个修改密码的命令:

* update user set password=password('新密码') WHERE user='root';

步骤6:关闭两个cmd窗口.

步骤7:在任务管理器中关闭一个进程mysqld.

步骤8:重启mysql服务.

1.2.4 MYSQL数据库存储结构:

安装了MYSQL的数据库,这台机器称为是MYSQL数据库服务器,在服务器的内部,可以存放多个数据库,一般一个软件对应一个数据库.一个软件中是有多个实体的(实体就是类),一般一个类对应一个表.表中记录对应的类的实例!!!

 

1.3 SQL语句

1.3.1 SQL的概述:

什么是SQL:

SQL:Structured Query Language, 结构化查询语言.

 

SQL的特性:

非过程性语言

过程性语言 :一条语句的执行需要依赖其他的语句.

* if(i <= 3){

System.out.println(“”);

}

非过程性语言一条语句救护有一个执行的结果,不需要依赖其他语句.

 

为加强SQL的语言能力,各厂商增强了过程性语言的特征

* OraclePL/SQL 过程性处理能力

* SQL ServerSybaseT-SQL

 

SQL的功能:

* DDL :数据定义语言 - Data Definition Language

* create altershowdrop.

* DML  :数据处理语言 - Data Manipulation Language

* updateinsertdelete.

* DCL:数据控制语言 – Data Control Language

* ifgrant..

* DQL:数据查询语言 – Data Query Language

* select

 

1.3.2 SQL对数据库进行操作(CRUD)

创建数据库:

语法:

* create database 数据库名称 [character set 字符集 collate 字符集校对规则];

校对规则:对排序的规则定义.

 

练习:

创建一个名称为mydb1的数据库。

* create database mydb1;

创建一个使用utf8字符集的mydb2数据库。

* create database mydb2 character set utf8;

创建一个使用utf8字符集,并带校对规则的mydb3数据库。

* create database mydb3 character set utf8 collate utf8_bin;

 

查看数据库:

查看数据库服务器中有哪些数据库:

语法:

* show databases;

查看当前的数据库定义的细节:

语法:

* show create database 数据库名称;

 

练习:

查看当前数据库服务器中的所有数据库

* show databases;

查看前面创建的mydb2数据库的定义信息

* show create database mydb2;

删除数据库:

语法:

* drop database 数据库名称;

 

练习:

删除前面创建的mydb1数据库

* drop database mydb1;

 

修改数据库:

语法:

* alterdatabase 数据库名称 character set 字符集 collate 校对规则;

 

练习:

修改之前创建的mydb2,改为gbk.

* alter database mydb2 character set gbk;

切换数据库:

语法:

* use 数据库名;

显示当前正在使用的数据库:

语法:

* select database();

---------------------------------------------属于DDL语句---------------------------------------------------------------------------------------------

1.3.3 SQL对数据库中表进行操作(CRUD)

创建表:

语法:

* create table 表名字段名 字段类型(长度约束,字段名 字段类型(长度约束,字段名 字段类型(长度约束)character set 字符集 collate 校对规则;

 

一般有一个实体类的时候,创建一个表与这个类对象.

class User{

int id;

String name;

double salary;

}

MYSQL常用数据类型:

JavaMYSQL

Stringcharvarchar

charvarchar的区别!

* char:代表的是固定长度的字符串,定义数据库的字段类型char(8),存入一个hello,那么在hello的后面添加3个空格补齐.

* varchar:代表的是可变长度的字符串,定义数据库的字段类型varchar(8),存入一个hello,那么存hello.

byteTINYINT 

shortSMALLINT

intINT

longBIGINT

floatFLOAT

doubleDOUBLE

booleanBIT

Datedatetimedatetimetimestamp

* datetime 和 timestamp类型都是即有日期又有时间区别!

* datetime:即有日期又有时间,必须手动传入一个日期,才会有值.

* timestamp:即有日期又有时间,如果没有给这列传值,采用系统当前的时间存入到该值上.

FileBLOBTEXT

* BLOB:用于存二进制文件,图片、mp3、视频.

* TEXT:用于存文件文件.txt

***** mysqlblobtext类型.Oracleblobclob.

 

练习;创建一个员工表employee 

***** 在创建表之前一定要选择数据库!use day15;

create table employee(

id int,

name varchar(20),

gender varchar(10),

birthday date,

entry_date date,

job varchar(50),

salary double,

resume text

);

***** 字符串长度必须写,其他的类型都有默认长度.  int默认长度是11.

 

建表约束:(单表约束)---为了保证数据的完整性.

主键约束:primary key.可以唯一确定一条记录字段.(非空唯一).主键是整形的,可以使用auto_increment

唯一约束:unique.创建这个字段不允许出现重复的值.

非空约束:not null.代表这个字段的值不能为空.

 

创建一个带有约束的表:

create table employee2(

id int primary key auto_increment,

name varchar(20) unique ,

gender varchar(10) not null,

birthday date  not null,

entry_date date not null,

job varchar(50) not null,

salary double not null,

resume text not null

);

 

查看表

语法:

* desc 表名;--- 查看表结构.

 

查看数据库中所有的表:

语法:

* show tables;

 

修改表:

语法:

* alter table 表名 add 字段名 类型(长度约束;---修改表添加列

* alter table 表名 modify 字段名 类型(长度约束;---修改表修改列的类型长度约束.

* alter table 表名 drop 字段名;---修改表删除列

* alter table 表名 change 旧字段名 新字段名 类型(长度约束; ---修改表修改列名

* rename table 旧表名 to 新表名;---修改表名

* alter table 表名 character set 字符集;---修改表的字符集

 

练习:

在上面员工表的基本上增加一个image列。

* alter table employee add image varchar(20);

修改job列,使其长度为60

* alter table employee modify job varchar(60);

删除gender列。

* alter table employee drop gender; 

表名改为user

* rename table employee to user;

修改表的字符集为utf8

* alter table user character set utf8;

列名name修改为username

* alter table user change name username varchar(30);

删除表:

语法:

* drop table 表名;

练习:

删除user

* drop table user;

-------------------------------------属于DDL语句-----------------------------------------------------------------------------------------------

1.3.4 SQL对数据库表中记录的操作(CRUD)

添加记录

语法:

语法一:添加部分字段

* insert into 表 (字段1,字段2,字段3...) values (1,2,3...)

语法二:添加所有字段

* insert into 表 values (1,2,3...);

 

***** 注意:

* 1.添加的字段的个数和类型要与值的个数和类型对应.

* 2.添加字段的值的时候,值不能超过字段的最大长度.

* 3.添加字段的值是字符串或者日期,需要使用单引号引起来.

 

练习:

添加3条记录

1.添加部分数据.

* insert into employee (id,name,gender,job,salary) values (1,'aaa','man','HR',3500);

2.添加所有数据.

* insert into employee values (2,'bbb','woman','1990-09-01','2012-05-01','WORKER',5500,'bbb');

3.添加带有中文的数据.

* insert into employee values (3,'张三','woman','1992-09-01','2013-05-01','WORKER',6500,'');

报错:Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name'

* MYSQL数据库总共有6个与字符集相关参数!!!

其中3个与mysql的客户端相关的参数,3个与mysql的服务器相当参数!

***** 解决插入中文数据乱码:

找到mysql安装路径:my.ini文件

* [mysql]

default-character-set=utf8

* [mysqld]

character-set-server=utf8

***** 将客户端的字符集改为gbk.重启mysql服务.

修改记录

语法:

* update 表 set 字段=,字段=;---修改表中的所有记录

* update 表 set 字段=,字段=值 where 条件;---按照条件进行修改记录.

 

练习:

将所有员工薪水修改为5000元。

* update employee set salary = 5000;

将姓名为’zs’的员工薪水修改为3000元。

* update employee set salary = 3000 where name = '张三';

将姓名为’bbb’的员工薪水修改为8000,job改为Manager

* update employee set salary = 8000 ,job='Manager' where name='bbb';

aaa的薪水在原有基础上增加1000元。

* update employee set salary = salary +1000 where name='aaa';

 

删除记录

语法:

* delete from 表名;--- 删除表中的所有记录

* delete from 表名 where 条件;--- 删除表中指定条件记录

 

***** 删除记录注意:

删除的时候删除一条记录,不能删除一条记录的某个字段(修改).

删除是删除表中的记录,删除整个表.drop table.

删除的时候一旦有外键关联,删除表中的记录,需要解除关系!

删除表中的记录truncate table 表名;删除表中的所有记录,delete from 表名;删除表中所有记录!

 

练习:

删除表中名称为’张三’的记录。

* delete  from employee where name = '张三';

删除表中所有记录。

* delete from employee;

使用truncate删除表中记录。

* truncate table employee;----删除表中所有记录

***** truncate 和 delete删除表中所有记录的区别?

* delete属于DML,事务作用在DML语句上.事务可以回滚!.delete语句执行后,如果在一个事务中,将数据找回来.delete将数据库表中的记录一条一条进行删除的.

事务:一组操作,要么一起成功,要么一起失败!

* truncate属于DDL.将整个表删除了,创建一个一样的表!

------------------------------------属于DML语句------------------------------------------------------------------------------------------------

查询记录(*****

创建一个学生成绩表 :

create table exam(

id int primary key auto_increment,

name varchar(20),

math int,

english int,

chinese int

);

insert into exam values (null,'张三',80,75,85);

insert into exam values (null,'李四',73,80,90);

insert into exam values (null,'王五',86,85,69);

insert into exam values (null,'赵六',91,75,88);

insert into exam values (null,'孙七',69,90,71);

insert into exam values (null,'张八',71,76,73);

insert into exam values (null,'张三丰',null,76,73);

insert into exam values (null,'小张',72,80,62);

基本select语句

语法:

* select [distinct] *|列名,列名 from 表名;

distinct:去掉重复值.

练习:

查询表中所有学生的信息。

* select * from exam;

查询表中所有学生的姓名和对应的英语成绩。

* select name,english from exam;

过滤表中重复数据。

* select distinct math from exam;

 

1.select语句执行运算及别名:

语法:

* select 表达式 from ;

* select 列 as 别名,列 as 别名 from ;---as可以省略

练习

在所有学生分数上加10分特长分。

* select name,math+10,english+10,chinese+10 from exam;

统计每个学生的总分。

* select name,math+english+chinese from exam;

使用别名表示学生分数。

* select name,math+english+chinese as sum from exam;

* select name,math+english+chinese sum from exam;

 

***** 注意:

* select math,chinese from exam;

* select math chinese from exam;

 

2.select语句条件过滤:

语法:

* select *|列名 from 表 where 条件;

练习:

查询姓名为张三的学生成绩

* select * from exam where name = '张三';

查询英语成绩大于90分的同学

* select * from exam where english > 90;

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

* select name,math+english+chinese from exam where (math+english+chinese)>250;

 

Where子句后的运算符:

* > < >= <= = <>

* in :一组值.

* where name = 张三;

* where name in (张三,李四);

* like:模糊查询.

使用占位符: _ 和 %.  _:只能代表一个字符。 %:代表任意个字符.like _ like %;

* %或者_的时候% ,%,%%

* is null:查找为空记录.

* andornot

练习:

查询英语分数在 8090之间的同学。

* select * from exam where english>80 and english <90;

* select * from exam where english between 80 and 90;

查询数学分数为69,80,86的同学。

* select * from exam where math in (69,80,86);

查询所有姓大的学生成绩。

* select * from exam where name like '_';

* select * from exam where name like '%';

查询数学分>80,语文分>80的同学。

* select * from exam where math>80 and chinese >80;

 

3.对查询的记录进行排序:

语法:

order by 列 asc/desc;asc升序desc降序.(默认是升序)

 

练习:

对数学成绩排序后输出。

* select * from exam order by math;

对总分排序按从高到低的顺序输出

* select name,math+english+chinese from exam order by (math+english+chinese) desc;

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

* select * from exam order by english desc ,chinese desc;

对姓张的学生总成绩排序输出

* select name,math+english+chinese from exam where name like '%' order by math+english+chinese;

 

5.聚集函数:(分组函数)

* count()---统计表中的数据记录个数

语法:

* select count(*|列名) from exam;

练习:

统计一个班级共有多少学生?

* select count(*) from exam;

统计数学成绩大于80的学生有多少个?

* select count(*) from exam where math > 80;

统计总分大于240的人数有多少?

* select count(*) from exam where math+english+chinese>240;

* sum()---求和

语法:

* select sum(列名) from exam;

练习:

统计一个班级数学总成绩?

* select sum(math) from exam;

统计一个班级语文、英语、数学各科的总成绩

* select sum(math),sum(english),sum(chinese) from exam;

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

* select sum(math)+sum(english)+sum(chinese) from exam;

* select sum(math+english+chinese) from exam;

* null+数字=null

使用ifnull()函数  ifnull(math,0)

* select sum(ifnull(math,0)+english+chinese) from exam;

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

* select sum(chinese)/count(*) from exam;

* avg()---求平均值

语法:

* select avg() from ;

练习:

求一个班级语文平均分?

* select avg(chinese) from exam;

求一个班级总分平均分

* select avg(ifnull(math,0)+english+chinese) from exam;

* max()---求最大值

* select max(chinese) from exam;

* min()---求最小值

* select min(english) from exam;

 

6.分组统计:

语法:

* group by 列名;

 

创建表:

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,'桔子',9);

 

练习 :

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

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

*  对订单表中商品归类后,显示每一类商品的数量

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

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

select product,sum(price) from orders where sum(price)>100  group by product ;---错误的

***** where条件后面不能加聚集函数的!!!

*** 使用另外关键字having.---条件过滤,主要用于group by 分组后的条件过滤,having后面可以跟聚集函数.

***** 正确写法:

* 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 ..

1.4 数据库的备份和还原

数据库备份:

mysqldump -u root -p day15>c:/day15.sql

 

数据库还原:

先创建一个空的数据库:day15

* 1.cmd窗口下还原:mysql -u root -p day15<c:/day15.sql

* 2.进入到mysql中进行还原:

* source c:/day15.sql

今天的内容总结:

1.数据库概述

数据库:就是一个文件系统,通过标准的sql进行操作.

关系型数据库:存的实体之间的关系.

常见:

mysqlSQL ServerOracleDB2SyBaseSqLite

2.MYSQL安装和卸载

重置root密码

* MYSQL数据库的结构

3.SQL语句:

* SQL:结构化查询语言.

* Oracle增强的SQLPL/SQL

* SqlServer增强的SQLTSQL

非过程性语言:一条SQL语句,就会有一个运行的结果.

* SQL的分类:

* DDL

* createalterdropshow

* DML

* updateinsertdelete

* DCL

* ifgrant..

* DQL

* select

4.SQL对数据库进行操作

* create database 数据库名;

* drop database 数据库名;

* alter database 数据库名 character set字符集 collate 校对;

* show databases; show create database 数据库名;

* use 数据库名; select database();

5.SQL对表进行操作

* create table 表名(字段 类型(长度约束,字段 类型(长度约束);

* drop table 表名;

* desc 表名; show tables;

* alter table addmodifydropchange

* rename

单表约束:

主键约束:primary key

唯一约束:unique

非空约束:not null

6.SQL对表中记录进行操作

* insert into 表 values (,)

* update 表 set 字段=,字段=值 where 条件;

* delete from 表 where 条件;

* Selete ... From ... Where ... Group by ... Having... Order by ...

 

7.数据库备份和还原:

备份:mysqldump

还原: mysqlsource

 

 

 

 

 

 

查看mysql版本的四种方法 

  1:在终端下:mysql -V。 以下是代码片段:

  [shengting@login ~]$ mysql -V
  mysql Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686)

  2:在mysql中:mysql> status;
  以下是代码片段:
  mysql> status;
  --------------
  mysql Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686)
  Connection id:          416
  SSL:                    Not in use
  Current pager:          stdout
  Using outfile:          ''
  Using delimiter:        ;
  Server version:         3.23.56-log
  Protocol version:       10
  Connection:             Localhost via UNIX socket
  Client characterset:    latin1
  Server characterset:    latin1
  UNIX socket:            /tmp/mysql_3311.sock
  Uptime:                 62 days 21 hours 21 min 57 sec
   Threads: 1 Questions: 584402560 Slow queries: 424 Opens: 59664208 Flush tables: 1 Open tables: 64 Queries per second avg: 107.551

  3:在help里面查找
  以下是代码片段:
  [shengting@login ~]$ mysql --help | grep Distrib
  mysql Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686)

  4:使用mysql的函数
  以下是代码片段:
  mysql> select version();
  +-------------+
  | version()   |
  +-------------+
  | 3.23.56-log |
  +-------------+
  1 row in set (0.00 sec)

 

 

1 0