个人感觉SQL语句不用刻意的去记忆,多使用,用到的时候忘记了就查找一下,使用的频繁,自然就记住了。
SQL语句使用:数据库操作SQL、数据表操作SQL、数据记录操作SQL
(一)数据库SQL
1、创建数据库
create database 数据库名称;
例如创建一个名字为mydb1的数据库:
create database mydb1;
在创建数据库时,为数据库指定字符集及字符集比较方式:
create database 数据库名称 character set 编码集 collate 比较方式;
*如果不指定字符集和比较方式,使用默认
例如创建一个使用utf-8字符集并带校对规则的mydb2数据库:
create database mydb2 character set utf8 collate utf8_unicode_ci;
*注意这里是utf8而不是utf-8
什么是校对规则?
即比较的一个标准,对于排序,对于张三和李四,按拼音排序,按笔画排序还是按照名字数量排序,因此,一个字符集对应多种校对规则。
2、查看和删除数据库
查看所有数据库:
show databases;
查看当前数据库编码集:
show create database 数据库名;
例如查看前面创建的数据库mydb2的编码集:
show create database mydb2;
删除数据库:
drop database 数据库名;
3、修改数据库编码
alter database chatarter set 编码集;
4、切换数据库
如果想对数据库中数据表和数据记录进行操作,必须先切换到指定数据库
use 数据库名称;
查看当前正在使用的数据库:
select database();
在mysql语句中是可以换行的,以分号“;”为界限。
(二)数据表table—表结构SQL
注意,创建数据表之前需要切换到要创建表的数据库,即use 数据库名
,然后再使用table相关操作创建数据表。
关系模型的数据储存在数据表中
1、创建数据表
create table 表名(列名 类型(长度),列名 类型(长度)...)character set 编码集;
*如果不设置编码集,数据表将采用数据库默认字符集
注意:数据库中的类型与java中的数据类型是不同的,需要找到对应的数据类型
数据库类型
1、整数类型 tinyint (byte) 、 smallint(short) 、int(int)、 bigint(long) float 、double
2、字符串类型 varchar 、char 长度取值0-255 ---- String
varchar变长 ,例如:varchar(20) ,向数据库存入hello ,因为变长,列长度会根据保存内容自动调整
char定长 char(8) ---- 例如:向数据库存入hello ,因为定长,保存hello + 3个空格
因此,例如我们创建一个数据表table:
创建一个员工表employee
id 整形
name 字符型
gender 字符型
birthday 日期型
entry_date 日期型
job 字符型
salary 小数型
resume 大文本型
//例如可以分行来进行书写,代码更美观,可读性强
create table employee (
id int,
name varchar(40),
gender varchar(10),
birthday date,
entry_date date,
job varchar(20),
salary double,
resume longtext
);
char与varchar类型必须指定长度,其他类型都具有默认长度,可以不用指定
2、通过desc语句来查看表结构
desc 表名;
3、单表约束
主键约束:唯一标识一条记录
primary key 不能为空,不能重复(所以一般与非空连用)
*主键如果为数字类型,一般设置主键自动增长,这样就避免了重复,一般使用 auto_increment设置
例如主键约束非空并且自动增长:
id int primary key not null auto_increment;
删除主键
alter table employee drop primary key;
唯一约束:该字段的内容不许重复
name varchar(40) unique;
非空约束:值不许为空
salary double not null;
定义单表约束后,2中的数据表可以改写为:
create table employee (
id int primary key not null auto_increment ,
name varchar(40) unique not null,
gender varchar(10) not null,
birthday date not null,
entry_date date not null,
job varchar(20) not null,
salary double not null,
resume longtext not null
);
再次查看表结构:
其中PRI代表主键,UNI代表唯一,Null栏中的NO表示非空,auto_increment表示自动增长
4、数据表的修改(增删改查)
向已有数据表添加一列:
alter table 表名 add 列名 类型(长度)约束;
改变已有数据表的一列类型、长度:
alter table 表名 modify 列名 类型(长度) 约束;
改变已有数据表一列的名称 :
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
删除已有一列 :
alter table 表名 drop 列名;
修改表名:
rename table 旧表名 to 新表名;
修改表的字符集:
alter table 表名 character set 字符集;
使用show create table 表名;
查看表的编码集,注意改变表table的编码集,并没有改变数据库database的编码集
数据表的删除
drop table 表名;
通过show tables;
查看当前数据中所有表
(三)对数据表中数据记录进行增删改查
1、表记录的插入insert
insert into 表名(列名,列名,...) values(值,值,...);
*值的个数应该与列的个数相同且顺序对应,并且值的类型与列字段类型匹配
例如,接着前面的例子(已经设置为自动增长的可以在值的位置填写null,插入数据时,字符串和日期添加单引号‘’,插入空值用null代替):
insert into employee(id,name,gender,birthday,entry_date,job,salary,resume) values(null,'megustas','male','1990-01-10','2012-10-10','hr',3000,'he is a good man');
通过一下语句查看插入的数据:
select * from 表名;//查询插入的数据(此表中所有插入的数据)
可以查看我们已经插入的两条信息。
注意插入数据不仅要数据类型匹配,长度也要注意,例如varchar(10),那么插入的字符长度不能超过10
在插入数据时,如果有些列存在默认值或者可以为null ,插入省略部分列
create table person(
id int primary key not null auto_increment,
name varchar(40) not null,
introduce varchar(255)
);
这里只要写不能为空列就可以了
insert into person(name) values('zs');
或者再插入语句时,省略所有列名(省略所有列名,必须为所有列提供value值,按照数据表中列顺序),也是较为常用的一种插入的方式
insert into person values(null,'lisi',null);
插入数据时中文乱码问题:
insert into employee values(null,'小丽','female','1995-10-08','2015-11-12','Sales',2000,'是一个有潜质的女孩子!');
会报错“Data too long for column ‘name’ at row xxx”,但是实际的原因并非超出长度(40),而是由于编码的问题造成的。
查看数据库相关编码集:
show variables like 'character%';
mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。
服务器端相关:database server system(永远无法修改 就是utf-8)
客户端相关: connection client results
解决插入乱码问题:将客户端相关三个编码集设置 gbk
快速设置客户端相关三个编码集 (临时设置当前窗口编码集,当关闭窗口之后就会还原):
set names gbk;
再次使用show variables like 'character%';
此时,客户端的编码方式已经变为gbk编码,再插入中文便不会报错。
修改mysql 配置文件,永久改变客户端编码集
在mysql的安装目录mysql/my.ini文件中:
2、数据表记录修改操作 update
update 表名 set 列名=值,列名=值 where 条件语句;
例如:
修改所有员工的工资为5000:
update employee set salary=5000;
将表employee姓名为’lisi’的员工薪水修改为4000元,job改为ccc:
update employee set salary = 4000, job='ccc' where binary name = 'lisi';
将表employee中wangwu的薪水在原有基础上增加1000元:
update employee set salary=salary+1000 where name='wangwu';
3、数据表记录删除操作 delete
delete from 表名 where 条件语句;
删除一个表所有记录
truncate 表名;
truncate与delete 使用上区别 ?
例子:
删除表employee中名称为’zs’的记录 :
delete from employee where name='zs';
删除表employee中所有记录:
delete from employee;
演示事务的回滚 ,通过delete在事务中删除可以恢复的
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from employee;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from employee;
Empty set (0.00 sec)
mysql> rollback;
使用truncate删除表中记录(数据永远删除,不会恢复):
truncate employee;
**4、数据表记录查询操作(最核心部分) **
(1)基本语法:
select [distinct] *|{column1,column2,column3...} from 表名;
查看当前数据表所有记录:
select * from employee;
查看employee的 gender列数据 :
select gender from employee;
查看employee表所有性别 ,排重(因为性别有重复):
select distinct gender from employee;
(table操作小结:create创建表-insert插入数据-delete删除数据-select查询数据)
创建scores:
create table scores(
id int primary key not null auto_increment,
name varchar(40),
math double,
chinese double,
english double
);
插入数据:
insert into scores values(null,'老黎',85,90,76);
insert into scores values(null,'老刘',70,65,80);
insert into scores values(null,'老冯',60,70,65);
过滤表中重复数据:
select distinct * from scores;
(2)查询时进行运算:
select 列名运算表达式 from 表名;
select 列名 as 列别名 from 表名;
例如,在所有学生英语分数上加10分特长分:
select name,english+10 from scores;
统计每个学生的总分:
select name,math+chinese+english from scores;
给学生总分起一个别名(更有助于显示结果):
select name,math+chinese+english as 总分 from scores;
select name,math+chinese+english 总分 from scores;
(3)查询数据时通过比较运算添加where条件,过滤查询内容
例如,查询姓名为老黎的学生总成绩:
select math+chinese+english from scores where name='老黎';
查询英语成绩大于80分的同学:
select * from scores where english > 80;
查询总分大于200分的所有同学:
select * from scores where math+chinese+english > 200;
(4)select 其它比较运算
查询语文成绩不为90 分学生(注意不等号的表示方式):
select * from scores where chinese <> 90;
between …and… 查询语文在70-80之间同学 :
select * from scores where chinese<=80 and chinese>=70;
select * from scores where chinese between 70 and 80 ;//先写小的后写大的
查询语文成绩为70分或者80分或者90分同学:
select * from scores where chinese in (70,80,90);
模糊查询:例如浏览器中搜索java,会出现所有与java相关的内容
查询学生中姓老的所有人(% 代表任意字符串):
select * from scores where name like '老%';
is null 判断一列是否为空
查询无数学成绩所有人:
select * from scores where math is null;
(5)对select查询结果通过order by语句进行排序
select * from 表名 where条件语句 order by 列名 asc|desc , 列名 asc|desc ... ;
用 DESC 表示按倒序排序(即:从大到小排序) —降序排列
用 ACS 表示按正序排序(即:从小到大排序)—升序排列
对数学成绩排序后输出(默认是升序):
select * from scores order by math;
对总分排序按从高到低的顺序输出:
select name,chinese+math+english from scores order by chinese+math+english desc;
(6)聚集函数(分组函数)—结合查询进行数据统计
通过:count返回查询结果记录条数
统计一个班级共有多少学生:
select count(*) from scores;
统计总分大于250的人数有多少:
select count(*) from scores where math+chinese+english>250;
**sum 对一列的数据求和 **
统计一个班级语文、英语、数学各科的总成绩 :
select sum(math),sum(chinese),sum(english) from scores;
统计一个班级语文成绩平均分:
select sum(chinese)/count(chinese) from scores;
**avg对一列数据求平均值 **
求一个班级数学平均分(比使用sum与count的组合简便):
select avg(math) from scores;
注意:null数据不参与运算
max和min 对一列数据计算最大值和最小值
求班级总分最高分和总分最低分(数值范围在统计中特别有用):
select max(math+chinese+english),min(math+chinese+english) from scores;
语文最高分:
select max(chinese) from scores;
或者使用“组合语句”
select name from scores where chinese = (select max(chinese) from scores);
where 和 having 添加条件使用上区别 ?
where 是在分组之前执行,having是在分组之后执行,where 不能使用分组函数,having使用分组函数 。
select product,sum(price) from orders where sum(price)>100 group by product;
select product,sum(price) from orders group by product having sum(price)> 100;
数据库的备份与恢复
1、数据库备份
将文件导出,例如文件名处可以:c:\megustas.sql
mysqldump -u 用户名 -p 数据库名 >文件名.sql
注意:是在cmd环境下,因此需要先musql >quit退出mysql再在cmd执行如上语句
删除数据库:
drop database 数据库名;
2、数据库恢复
(1)创建一个空的新数据库:
mysql> create database megustas_back;
(2)恢复数据库
第一种方式:source 文件名.sql;//在musql内部使用
mysql> use megustas_back;
mysql> source c:\megustas.sql;
第二种方式: mysql -u 用户名 p 数据库名 <文件名.sql;//在cmd下使用
mysql -u root -p megustas_back < c:\megustas.sql;
验证是否导入成功,从cmd使用登录语句登录进行验证即可。
外键约束
语法:
foreign key(ordersid) references orders(id)
任何一个软件系统都是由多个数据表组成,在这里简要谈一下多表设计中的外键约束问题,如上的例子,系统中已经存在employee表,此时向系统中添加dept表(部门表):
create table dept (
id int primary key not null auto_increment,
name varchar(40) unique not null
);
插入数据:
insert into dept values(null,'人力资源部');
insert into dept values(null,'产品研发部');
insert into dept values(null,'财务部');
insert into dept values(null,'行政部');
为了使两个表的数据建立某种联系,可以使用外键约束,在employee表添加外键约束,使得dept_id的值 引用 dept的id字段,为employee表添加一个外键约束:
alter table employee add foreign key (dept_id) references dept(id );
添加了外键约束,就不能随便取值,取值是引用表存在主键值,不能随便删除数据
总结
SQL基本部分:
1、数据库操作相关SQL ---- database
创建数据库 create database 数据库名称; ------ 在sql后通过 character set 指定数据库本身字符集,如果没有指定将服务器默认
查看当前有哪些数据库 show databases;
修改数据库(修改数据库字符集) 数据库字符集存放mysql安装目录/data/数据库文件夹/db.opt
alter database 数据库名称 character set 字符集;
删除数据库 drop database 数据库名称;
切换数据库(设置当前使用数据库) use 数据库名称;
2、数据表操作相关SQL ---- table表结构
创建数据表 create table 表名(列名 类型(长度) 约束,列名 类型(长度) 约束… ) ----- 在创建表之前必须指定数据库
查看数据表表结构 desc table;
修改表结构:
修改列类型(长度) : alter table 表名 modify …
添加一个新列 : alter table 表名 add …
修改列名称 : alter table 表名 change …
删除列 : alter table 表名 drop 列名
修改表名 : rename table 旧表名 to 新表名
删除表 drop table 表名;
3、数据记录增删改查 insert update delete select
数据记录插入 insert into 表名(列,…) values(值,…);
数据查看 select * from 表名;
数据记录修改 update 表名 set 列名=值,列名= 值 where 条件语句
数据记录删除 delete from 表名 where 语句
select 语句
S - F - W - G - H - O
select … from … where … group by … having … order by … ; 顺序固定的
1、from 指定查询数据表
2、where 前置过滤条件 — 将表数据过滤掉一部分
3、group by 对where 过滤后数据进行分组
4、having 对分组后结果添加条件过滤
5、select 指定检索哪些字段
6、order by 对检索结果排序
4、数据库备份和恢复
备份命令: mysqldump -u 用户名 -p 数据库名 > sql脚本位置 (回车输入密码)
恢复命令: mysql -u 用户名 -p 数据库名 < sql脚本位置 (回车输入密码 )
5、数据库完整性约束 ----- 保证数据表中记录完整性
主键约束 primary key : 用来指定数据表数据记录的唯一标识
唯一约束 unique : 该字段取值唯一
非空约束 not null ; 该字段值不能为null
外键约束 foreign key : 当两个数据表存在关联时,添加外键约束,外键约束引用另一张表主键
条件约束 check : mysql不支持 Oracle支持 check age<100 ; 向数据表存入age值,必须小于100
开启事务Transaction