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

顺序不能变.

sql语句操作的更多相关文章

  1. SQL语句操作大全

    SQL语句操作大全   本文分为以下六个部分: 基础部分 提升部分 技巧部分 数据开发–经典部分 SQL Server基本函数部分 常识部分 一.基础 1.说明:创建数据库CREATE DATABAS ...

  2. Shell脚本中执行sql语句操作mysql的5种方法【转】

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  3. Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...

  4. 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

    在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector ...

  5. SQL语句操作全集

    SQL语句操作全集 下列语句部分是MySQL语句 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDAT ...

  6. 【MySQL】使用SQL语句操作MySQL

    前言: MySQL在工作中是最常用的数据库,但在使用Django和Flask的时候,都是使用ORM进行操作,除了select语句外,其他的SQL语句操作MySQL的能力没有啥提高,为了解决这个问题, ...

  7. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  8. 043:Django使用原生SQL语句操作数据库

    Django使用原生SQL语句操作数据库 Django配置连接数据库: 在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django 连接数据库,不需要单独的创建一个连 ...

  9. Shell脚本中执行sql语句操作mysql

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

随机推荐

  1. Tomcat编码问题及访问软链接文件设置

    Tomcat编码问题及访问软链接文件设置 一.编码问题:让其支持UTF-8格式 修改tomcat中server.xml Connector port=" protocol="org ...

  2. jquery 中的事件冒泡

    废话少说,先来一段代码热热身: <!DOCTYPE html> <html> <head> <title>demo</title> < ...

  3. php简单实用的操作文件工具类(创建、移动、复制、删除)

    php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) {  // 原目录,复制到的目录 $dir = opend ...

  4. CString

    CString gray("Gray"); CString cat("Cat"); CString graycat = gray + cat;   与其用 sp ...

  5. objective-c与c++的差异

    oc的编译指令为 clang -fobjc-arc -framework Foundation test.m -o test oc中,1表示YES,0表示NO.并不是非0值都是YES,这是因为BOOL ...

  6. JUnit之持续集成(CI,Continuous Integration)

    序,测试驱动开发告诉我们,要尽早测试,经常测试.如果我们进行一点小改动时,都把所有的单元测试.集成测试和功能测试执行一遍,这就会非常浪费时间.为了避免这一点,在开发期间我们只执行单元测试,那么集成测试 ...

  7. 第二章平稳时间序列模型——AR(p),MA(q),ARMA(p,q)模型及其平稳性

      1白噪声过程: 零均值,同方差,无自相关(协方差为0) 以后我们遇到的efshow如果不特殊说明,就是白噪声过程. 对于正态分布而言,不相关即可推出独立,所以如果该白噪声如果服从正态分布,则其还将 ...

  8. Win7与XP共享互相访问及共享注意事项!

    win7共享方法和XP类似,主要需要检查以下操作: 1,首先将Guest账户打开 2,右击文件夹-属性-共享选项-高级共享 3,将共享文件√打上,应用-确定即可! 4,查看自己IP(开始-运行-cmd ...

  9. 遇到了IAR烧写程序出错,附解决办法The stack plug-in failed to set a breakpoint on "main"

    今天做无线串口调试的时候用IAR7.51往CC2530无线模块烧程序的时候遇到了问题: 先是下载过程中有许多警告,然后就是提示无法跳断点,找不到main方法,每次烧程序都出现: The stack p ...

  10. vc++6.0各种报错合集(附:VC++6.0调出打印窗口的方法)

    背景: 由于VC++6.0对于现在的我来说,只是一个工具,暂时没有太多的时间分配到这块去深究它,由于不明其原理,因此也只是在此把错误积累下来,以备下次相同错误出现时能快速排除,节省时间. 正文 一.出 ...