遇到的一些问题:
Q1:如果在MySQL中一个表test中的id字段设为auto_increment插入两条记录后id=2,此时删除一条记录再插入一条变成id自增时跳过了2,如何设置在新插入一条时,id从2开始技术使用.
问题如图:
解决办法有两个:
法一:插入数据时直接设置好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 字符集;
- 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 字段
记忆:
在进行更新语句操作的时候, 一定要备份, 一定要备份, 一定要备份.