1.1 SQL语句
1.1.1 什么是SQL
SQL:Structured Query Language, 结构化查询语言.
特点:
* 非过程性语言:
* 过程性语言特点:一个语句需要依赖上面的几条语句的执行.
if(flag){
System.out.println(“Hello”);
}
* 非过程性语言:一条语句一个执行结果.
* 各个厂商提供对SQL的增强:
* Oracle 提供 PL/SQL.
* SQL Server 提供 TSQL.
* 具有查询、操纵、定义和控制关系型数据库的四方面功能
1.1.2 SQL的分类
DDL:数据定义语言
* create 、show、alter...
DCL:数据控制语言
* if、grant...
DML:数据操纵语言
* update、delete、insert
DQL:数据查询语言
* select
1.1.3 使用SQL:
对数据库进行操纵(对数据库进行CRUD.)
1.创建数据库
创建数据库:
语法:
* create database 数据库名称;
* create database 数据库名称 character set 字符集;
* 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;
2.查看数据库
查看数据库:
语法:
查看数据库服务器中的所有数据库:show databases;
查看某一个数据库的定义的信息:show create database 数据库名称;
练习:
查看当前数据库服务器中的所有数据库
* show databases;
查看前面创建的mydb2数据库的定义信息
* show create database mydb2;
3.删除数据库
删除数据库:
语法:
* drop database 数据库名称;
练习:
删除前面创建的mydb1数据库
* drop database mydb1;
4.修改数据库
修改数据库:(修改数据库的字符集和校对规则)
语法:
* alter database 数据库名称 character set 字符集 collate 校对规则;
练习:
查看服务器中的数据库,并把其中某一个库的字符集修改为gbk;
* alter database mydb2 character set gbk;
5.数据库其他操作
切换数据库:
* use 数据库名称
查看当前正在使用的数据库:
* selete database();
**** 对数据库的操作的语句属于DDL.---------------------------------------------------
对数据库表进行操纵(对表进行CRUD)
1.创建表
创建表:一般情况下,一个Java类对应一个表.
* 语法:
* create table 表名(
字段名 字段类型(长度) 约束,
字段名 字段类型(长度) 约束,
字段名 字段类型(长度) 约束
);
* Java中类:
class User{
int id;
String name;
...
}
* MySQL常用的数据类型:
字符串型
VARCHAR、CHAR
* varchar类型和char类型有什么区别?
* char类型:固定长度的字符串.数据库中设置char(8).存入一个字符串hello.在hello字符串后面使用三个空格补全.
* varchar类型:可变长度的字符串.数据库中设置varchar(8).存入一个字符串hello.直接存的是hello.
大数据类型
BLOB、TEXT
* 向数据库中存文件.(一般不使用.)
* BLOB:存的是二进制文件如.jpg、.mp3...
* TEXT:存的是.txt文本文档.
***** Oracle中没有Text类型. CLOB、BLOB
数值型
TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
* tinyint :byte
* smallint :short
* int :int
* bigint :long
* float :float
* double :double
逻辑性
BIT
* bit :boolean
日期型
DATE、TIME、DATETIME、TIMESTAMP
* java中java.utils.Date.
* date:是只有日期的格式.
* time:是只有时间的格式.
* datetime和timestamp类型都是既有日期又有时间
* datetime和timestamp的区别?
* datetime:如果传入的数据是null,那么数据库就是一个null值.
* timestamp:如果传入的数据时null,将系统的当前时间存入该字段.
练习:
创建一个员工表employee
* 语句:
* 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
***** 在创建表的时候要先选择数据库!!!
use 数据库;
创建表.
create database day15;
use day15;
2.查看表
语法:
* 查看表结构:
* desc 表名;
* 查看数据库中所有表:
* show tables;
单表约束:
主键约束:primary key利用主键唯一确定一条记录.主键约束默认就是唯一非空.如果主键是整形数.可以采用auto_increment.自动增长.
唯一约束:unique.唯一就是字段中不可以出现重复的值.
非空约束:not null.字段不可以为空
***** 约束主要用来保证数据的完整性
* 练习:
* 创建一个带有约束的表employee2.
create table employee2(
id int primary key auto_increment,
name varchar(20) unique not null,
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
);
3.删除表
删除表:
语法:
* drop table 表名;
练习:
* drop table employee2;
4.修改表:
修改表:
语法:
* alter table 表名 add 字段名 类型(长度) 约束; ---修改表添加列.
* alter table 表名 modify 字段名 类型(长度) 约束; ---修改表修改列类型长度和约束.
* alter table 表名 change 旧列名 新列名 类型(长度) 约束; ---修改表修改列名.
* alter table 表名 drop 列名; ---修改表 删除列
* 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);
***** 对表的操作:属于DDL--------------------------------------------------
对数据库表记录进行操纵(对表记录CRUD)
1.插入记录
插入记录:
* 语法:
* insert into 表名 (字段名1,字段名2,字段名3...) values (值1,值2,值3...);
* insert into 表名 values (值1,值2,值3...);
* 注意:
* 插入的字段的类型与值的类型相同.
* 类型是字符串或者是日期类型,值的地方要使用单引号’’;
* 在values中列出的数据位置必须与被加入的列的排列位置相对应。
* 插入的值的长度不能超过字段的最大长度
* 插入3条记录
* insert into employee (id,name,gender) values (1,'aaa','man');
* insert into employee values (2,'bbb','man','1990-01-05','2013-09-12','HR',4500,null);
* insert into employee values (3,'张三','男','1990-01-05','2013-09-12','HR',4500,null);
* 插入第三条记录的时候 报错:中文 ‘张三’报错!
* show variables like 'character%';
* 查看与character相关的参数有6个.(3个与客户端相关的参数,3个与服务器相关参数)
* 解决mysql在cmd窗口中的乱码问题:
* 打开mysql/my.ini文件
[client]
将[client]下面的字符集改为gbk
default-character-set=gbk
* 重启mysql的服务.
2.修改记录
修改记录:
* 语法:
* update 表名 set 字段名=值,字段=值,字段=值 [where 条件];
* 练习:
将所有员工薪水修改为5000元。
* update employee set salary = 5000;
将姓名为’张三’的员工薪水修改为3000元。
* update employee set salary = 3000 where name = '张三';
将姓名为’bbb’的员工薪水修改为4000元,job改为WORKER。
* update employee set salary = 4000,job='WORKER' where name = 'bbb';
将aaa的薪水在原有基础上增加1000元。
* update employee set salary = salary + 1000 where name='aaa';
3.删除记录
删除记录:
* 语法:
* delete from 表 [where 条件];
* 注意事项:
* 如果不使用where子句,将删除表中所有数据。
* delete语句不能删除某一列的值(可使用update)
* 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
* 多表操作:外键约束.删除带有关联关系这种表,容易报错!
* 删除一条记录:
* delete from employee where id = 1;
* 面试:
* delete from 表; 和 truncate table 表名; 这两种都可以删除表中的所有记录!区别是什么?
* truncate table 删除表中的所有记录,将这个表删除掉,创建一个新表!
* delete from 表;删除表中的所有记录,一条一条删除!
* 但是事务作用在DML语句上.
* 事务:一组操作要么全都成功要么全都失败!
* delete的删除如果在事务中,可以被找回来.
* truncate删除的数据就找不回来
4.查询记录
查询记录:
* 语法一:
* select distinct [列名,列名] * from 表;
* 建表:
create table exam(
id int primary key auto_increment,
name varchar(20),
math int,
chinese int,
english int
);
insert into exam values (null,'苍老师',67,82,92);
insert into exam values (null,'石老师',72,61,83);
insert into exam values (null,'刘老师',81,73,64);
insert into exam values (null,'边老师',92,61,73);
* 练习:
查询表中所有学生的信息。
* select * from exam;
查询表中所有学生的姓名和对应的英语成绩。
* select name,english from exam;
过滤表中重复数据。
* select distinct chinese from exam;
* 语法二:
* select 列名 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;
以下sql的语法都是正确的:
* select math,chinese from exam;
* select math chinese from exam;
* 语法三:
* select 列名|* from 表 where 条件;
* 练习:
查询姓名为苍老师的学生成绩
* select * from exam where name = '苍老师';
查询英语成绩大于80分的同学
* select * from exam where english > 80;
查询总分大于220分的所有同学
* select * from exam where (math+chinese+english)>220;
* select name,(math+english+chinese) sum from exam where (math+english+chinese)> 220;
* where子句中使用的运算符:
* > < >= <= = <> :
* in :从多个值中获得数据
* 语法:where id in (1,2);
* like :模糊查询.查询姓张的同学.
* 语法:like中使用占位符:可以使 _ 或者 % _代表一个字符. %代表多个字符.
* where name like ‘张_’;
* where name like ‘张%’;
* where name like ‘%张%’;
* is null 、 is not null
* 语法:
* where name is null;
* where name is not null;
* and
* or
* not
* 练习:
查询英语分数在 80-90之间的同学。
* select * from exam where english > 80 and english <90;
* select * from exam where english between 80 and 90;
查询数学分数为67,72,81的同学。
* select * from exam where math in (67,72,81);
查询所有姓苍的学生成绩。
* select * from exam where name like '苍%';
查询数学分>80,语文分>70的同学。
* select * from exam where math > 80 and chinese > 70;
* 语法四:
* 语法:
* select * from 表 where 条件 order by 字段名 asc/desc;
* 注意:
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
Asc 升序、Desc 降序
ORDER BY 子句应位于SELECT语句的结尾。
* 练习:
对英语成绩排序后输出。
* select * from exam order by english;
对总分排序按从高到低的顺序输出
* select name,(math+english+chinese) from exam order by (math+english+chinese) desc;
对学生成绩按照语文进行降序排序,语文相同学员按照数学降序
* select * from exam order by chinese desc,math desc;
对姓苍的学生成绩排序输出
* select name,(math+chinese+english) from exam where name like '苍%' order by (math+chinese+english);
* 语法五:聚集函数
* count() :统计个数.
* 语法:
* select count(*|列名) from 表名;
* 练习:
统计一个班级共有多少学生?
* select count(*) from exam;
统计数学成绩大于80的学生有多少个?
* select count(*) from exam where math > 80;
统计总分大于220的人数有多少?
* select count(*) from exam where (math+chinese+english)>220;
* sum() :求和
* 语法:
* select sum(字段) from 表名;
* 练习:
统计一个班级数学总成绩?
* select sum(math) from exam;
统计一个班级语文、英语、数学各科的总成绩
* select sum(chinese),sum(english),sum(math) from exam;
统计一个班级语文、英语、数学的成绩总和
* select sum(chinese+english+math) from exam;
* chinese+english+math:null+某个值 = null
* select sum(chinese)+sum(english)+sum(math) from exam;
* select sum(chinese+english+ifnull(math,0)) from exam;
统计一个班级语文成绩平均分
* select sum(chinese)/count(*) from exam;
* max() :求最大值
* min() :求最小值
* 练习:求班级的语文最高分和数学的最低分.
* select max(chinese),min(math) from exam;
* avg() :求平均值
* 练习
求一个班级语文平均分?
* select avg(chinese) from exam;
求一个班级总分平均分
* select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
* 语法六:分组统计.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,'空调',2000);
insert into orders(id,product,price) values(4,'手电筒',50);
insert into orders(id,product,price) values(6,'手电筒',50);
insert into orders(id,product,price) values(5,'空调',2000);
练习:
* 对订单表中商品归类后,显示每一类商品的总价
* select product,sum(price) from orders group by product;
* 对订单表中商品归类后,显示每一类商品的总个数
* select product,count(*) from orders group by product;
* 查询购买了几类商品,并且每类总价大于500的商品
* 错误的:where条件后不能使用聚集函数.
* select product,sum(price) from orders where sum(price)>500 group by product;
* 正确的写法:having.对分组后的数据进行条件过滤 having后可以使用聚集函数.
* select product,sum(price) from orders group by product having sum(price)>500;
总结Select语句
S...F...W...G...H...O...
顺序不能变.