SQL语句(增删改查)

个人感觉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个空格

  • varchar经常使用,char性能更好
    3、逻辑型 bit 表示一位,存储0或者1,一般用来表示boolean类型
    4、日期类型 data、 time 、datetime、 timestamp
    date 只能保存日期
    time 只能保存时间
    datetime 日期和时间都有
    timestamp 日期和时间都有,自动更新 ---- 操作数据表,timestamp字段自动更新当前时间
    5、大数据类型 text、blob
    text 文本类型数据,主要存储字符文件 — 文本文件
    blob 二进制文件 ,存储任何类型文件(音乐、电影)
  • blob和text最大类型 longtext longblob 最大可以保存4GB文件

因此,例如我们创建一个数据表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 
);

SQL语句(增删改查)_第1张图片
char与varchar类型必须指定长度,其他类型都具有默认长度,可以不用指定

2、通过desc语句来查看表结构

desc 表名;

SQL语句(增删改查)_第2张图片

3、单表约束

主键约束:唯一标识一条记录

  • primary key 不能为空,不能重复(所以一般与非空连用)
    *主键如果为数字类型,一般设置主键自动增长,这样就避免了重复,一般使用 auto_increment设置

    例如主键约束非空并且自动增长:

    id int primary key not null auto_increment;
    
  • 删除主键
    alter table employee drop primary key;

唯一约束:该字段的内容不许重复

  • unique
  • 例如name varchar(40) unique;

非空约束:值不许为空

  • not null
  • 例如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
);

因此可以删除2中的数据表,将新的数据表创建:
SQL语句(增删改查)_第3张图片

再次查看表结构:

SQL语句(增删改查)_第4张图片

其中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 表名;//查询插入的数据(此表中所有插入的数据)

SQL语句(增删改查)_第5张图片
可以查看我们已经插入的两条信息。
注意插入数据不仅要数据类型匹配,长度也要注意,例如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%';

SQL语句(增删改查)_第6张图片
使用mysql客户端 — 黑色窗口界面使用gbk输入方式

mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。

  • client是客户端使用的字符集。
  • connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
  • database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
  • results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
  • server是服务器安装时指定的默认字符集设定。
  • system是数据库系统使用的字符集设定。(utf-8不可修改)

服务器端相关:database server system(永远无法修改 就是utf-8)
客户端相关: connection client results

解决插入乱码问题:将客户端相关三个编码集设置 gbk

快速设置客户端相关三个编码集 (临时设置当前窗口编码集,当关闭窗口之后就会还原):

set names gbk;

再次使用show variables like 'character%';

SQL语句(增删改查)_第7张图片

此时,客户端的编码方式已经变为gbk编码,再插入中文便不会报错。

修改mysql 配置文件,永久改变客户端编码集

在mysql的安装目录mysql/my.ini文件中:

  • [mysql] ---- 客户端配置
  • [mysqld] ---- 服务器端配置
    因此把[mysql]中的编码集改为gbk就可以了,不会因为重启mysql服务而改变。

2、数据表记录修改操作 update

update 表名 set 列名=值,列名=值 where 条件语句;
  • UPDATE语法可以用新值更新原有表行中的各列。
  • SET子句指示要修改哪些列和要给予哪些值。
  • WHERE子句指定应更新哪些行。如没有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 条件语句;
  • 如果不使用where子句,将删除表中所有数据。
  • Delete语句不能删除某一列的值(可使用update)。
  • 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。

删除一个表所有记录

truncate 表名;

truncate与delete 使用上区别 ?

  • truncate 删除记录后不可恢复的,不受事务管理,原理:先删除整个表,重新创建
  • delete 可以被事务管理 ,在事务中删除数据可以回滚恢复,原理: 一行一行删除数据记录
  • 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;

SQL语句(增删改查)_第8张图片

使用truncate删除表中记录(数据永远删除,不会恢复):

truncate employee;

**4、数据表记录查询操作(最核心部分) **
(1)基本语法

select [distinct] *|{column1,column2,column3...} from 表名;
  • select 指定查询哪些列的数据
  • column指定列名
  • *号代表查询所有列
  • from指定查询哪张表
  • distinct可选,指显示结果时,是否剔除重复数据

查看当前数据表所有记录:

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;

SQL语句(增删改查)_第9张图片

统计每个学生的总分:

select name,math+chinese+english from scores;

给学生总分起一个别名(更有助于显示结果):

select name,math+chinese+english as 总分 from scores;

SQL语句(增删改查)_第10张图片
注意:对于起别名,as可以省略,直接写别名就可以:

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;

SQL语句(增删改查)_第11张图片
(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使用分组函数 。

  • having可以替换where
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 指定数据库本身字符集,如果没有指定将服务器默认

  • 服务器默认字符集 mysql安装目录/my.ini [mysqld] default-character-set

查看当前有哪些数据库 show databases;

修改数据库(修改数据库字符集) 数据库字符集存放mysql安装目录/data/数据库文件夹/db.opt
alter database 数据库名称 character set 字符集;

  • collate 校对方式 ----- 用于数据库排序; 每一种字符集都存在一种默认校对方式(可以不用修改)

删除数据库 drop database 数据库名称;

切换数据库(设置当前使用数据库) use 数据库名称;

  • select database(); 查看当前使用数据库

2、数据表操作相关SQL ---- table表结构
创建数据表 create table 表名(列名 类型(长度) 约束,列名 类型(长度) 约束… ) ----- 在创建表之前必须指定数据库

  • 查看当前有哪些数据表 show tables;

查看数据表表结构 desc table;

修改表结构:
修改列类型(长度) : alter table 表名 modify …
添加一个新列 : alter table 表名 add …
修改列名称 : alter table 表名 change …
删除列 : alter table 表名 drop 列名
修改表名 : rename table 旧表名 to 新表名

  • table 在创建时 character set 指定表字符集,如果没有指定采用数据库默认字符集

删除表 drop table 表名;

3、数据记录增删改查 insert update delete select
数据记录插入 insert into 表名(列,…) values(值,…);

  • 值的顺序和列顺序一致,个数一致 , 在开发中经常省略列名,值按照表结构所有字段进行设值

数据查看 select * from 表名;

数据记录修改 update 表名 set 列名=值,列名= 值 where 条件语句

数据记录删除 delete from 表名 where 语句

  • truncate 与 delete区别 ? truncate删除表,重新创建, delete from 逐行删除----- 性能truncate好于 delete,delete被事务控制,删除后回滚取消删除,truncate不可恢复

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脚本位置 (回车输入密码 )

  • 在mysql连接后,通过source 进行数据库恢复 source sql脚本位置

5、数据库完整性约束 ----- 保证数据表中记录完整性
主键约束 primary key : 用来指定数据表数据记录的唯一标识
唯一约束 unique : 该字段取值唯一
非空约束 not null ; 该字段值不能为null
外键约束 foreign key : 当两个数据表存在关联时,添加外键约束,外键约束引用另一张表主键
条件约束 check : mysql不支持 Oracle支持 check age<100 ; 向数据表存入age值,必须小于100

  • 完整性约束有5类

开启事务Transaction

SQL语句(增删改查)_第12张图片

你可能感兴趣的:(数据库)