sql语句操作

时间:2022-05-30 12:33:14

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

sql语句操作

* 语句:

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

顺序不能变.