SQL:结构化查询语句
概念:通过sql语言可以操作所有的关系型数据库。每种数据库之间会存在差异,称为 “方言”
sql分类:

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(增、删、改);
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
DDL:操作数据库和表

操作数据库:

  • 创建:create database 数据库名称;
  • 删除:drop database 数据库名称;
  • 修改:ALTER DATABASE mydb1 CHARACTER SET 要修改的字符集名称;
  • 查询:show databases; – 查询所有数据库的名称
    show create database 数据库名称; – 查询创建数据库语句
创建数据库
列的数据类型:
* int:整型		id int,
* double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
					money double(5,2)
char:固定长度字符串类型;
		name char(10)		"张三"
* varchar:可变长度字符串类型;
		name varchar(10)	"张三"

text:字符串类型;存大格式的文本 比如存个小说 一般不用
blob:字节类型;存字节类型的数据  比如电影字节  图片字节 但是一般不会把字节数据存到数据库当中
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
datetime:日期时间类型   yyyy-MM-dd hh:mm:ss
* timestamp:时间戳类型	 yyyy-MM-dd hh:mm:ss
	* 如果该类型的字段不给赋值,则默认当前时间

语法:

create table 表名(
	列名1 类型1,
	列名2 类型2,
	...
	列名n 类型n

);

create table student(
	sname varchar(20),
	age int,
	gender varchar(6)
);
删除数据库:drop table 表名;
修改数据库
1.	修改之添加列:给stu表添加classname列:
	ALTER TABLE stu ADD (classname varchar(100));
2.	修改之修改列类型:修改stu表的gender列类型为CHAR(2):
	ALTER TABLE stu MODIFY gender CHAR(2);
3.	修改之修改列名:修改stu表的gender列名为sex:
	ALTER TABLE stu change gender sex CHAR(2);
4.	修改之删除列:删除stu表的classname列:
	ALTER TABLE stu DROP classname;
5.	修改之修改表名称:修改stu表名称为student:
	ALTER TABLE stu RENAME TO student;
查询数据库
show tables; -- 查询该数据库下所有表名称
	desc 表名; -- 查询表结构
* 注意:操作表之前,应该先选择一个数据库使用:use 数据库名称;
DML:操作表中的数据

数据库的增加:

* 语法:
 insert into 表名(列名1,列名2,...)	values(值1,值2,....);
* 注意:如果表的所有列都添加值,则列名可以省略

insert into stu(sname,age) values("lisi",23);
insert into stu(sname,age,sex) values("zhangsan",23,'1');
insert into stu values("ww",23,'2');

数据库的删除:

* 语法:
* delete from 表名 [where 条件];
* truncate table 表名;-- 删除所有记录
	* 先删除表,再创建表。

delete from stu	where sname = 'lisi'

数据库的修改:

* 语法:
* update 表名	set 列名1 = 值1 , 列名2 = 值2... [where 条件]
update stu set sex = "1" where sname = "lisi";
update 
	customer 
set 
	money = 500000
where 
	id = xxx;
DQL:查询
* 语法:
SELECT 
	selection_list /*要查询的列名称*/
FROM 
	table_list /*要查询的表名称*/
WHERE 
	condition /*行条件*/
GROUP BY 
	grouping_columns /*对结果分组*/
HAVING 
	condition /*分组后的行条件*/
ORDER BY 
	sorting_columns /*对结果分组*/
LIMIT 
	offset_start, row_count /*结果限定*/
条件查询:where语句
=、!=、<>(不等于)、<、<=、>、>=;
BETWEEN…AND;  在什么范围之间
IN(set);
IS NULL;为空
IS NOT NULL 不为空
AND; 并且
OR;   或者
NOT;非
模糊查询:like
_:匹配单个任意字符
比如: 我要查询姓名是3个任意字符组成的
select  * from student sname like='___';
例如:我要查询第二个字符是m的
select * from student where sanme like '_m%';


* %:匹配多个任意字符
例如:我要查询名字中包含m的 select * from student where sname like '%m%';
例如我要查询名字是a开头的 select * from student where sname like 'a%';
例如我要查询名字是b结尾的 select * from student wher like '%b';
字段控制
* 修改字段的别名:AS (可以省略)
				* 给字段起别名:
				例如:   select sname as 姓名, sage 年龄 from student;
				*给运算字段起别名:
				 例如: select sname as 姓名, (工资+奖金) as 总收入 from student;
				* 给表起别名:给每一张表起一个别名。简化书写
				例如: select stu.sname, stu.sage from student as stu;
* 字段运算:
				* null参与的运算,结果都为null  
				比如 工资 是100  奖金是null  我们让这两个字段运算 那结果就为null
				* 一般会将null替换为0: ifnull(字段名称,如果是null的替换值)  ifnull 是mysql的方言				
				所有如果奖金字段为null 一般我们把奖金替换为0
				例如: select sname,(工资+ifnull(奖金,0)) as 总收入from student;						
* 去除重复记录   比如我查询工资是3000的 出现了多条工资为3000 的记录 那我只想展示一条3000的记录  所以可以用 distinct 去除重复记录
				* DISTINCT     
				例如: select distinct 工资  from student;
聚合函数
* 聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数; 统计个数的 比如我统计有多少个学生
select count(sid) from student;  或者传个星 号    select count(*) from student;        
 一般不要传有null 值的字段

MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
例如 查询工资最大值    select max(工资) as 最高工资 from student;

MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
例如 查询 最少工资   select min(工资) as 最小工资 from student;
SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
 例如 计算总工资  select sun(工资) as 总支出 from student;

AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
例如:计算平均 工资 select avg(工资) as 平均工资 from student;
分组查询:group by 一般配合聚合函数使用 查出的数据才有意义
* 查询的字段:
			1.分组字段本身
			2.聚合函数
比如我按部分编号分组  比如有三个部门 然后我求每个部门的平均工资  那展示出来的数据应该有三条
例如: select 部门编号,AVG(工资) from student group by 部门编号;

1.例如查询 每个部门的部门编号 已经每个部门工资大于1500的人数
select 部门编号, count(*) from student where 工资>1500 group by 部门编号;
注意这里的 where 是对分组前的条件限定 也就是说不满足条件的 不参与分组

	
* where和having
	* where:在分组之前对条件进行限定。不满足条件,就不会参与分组
	* having:在分组之后,对结果集的筛选

2.例如 我要查询 各个部门平均工资 大于2000 的部门

select 部门编号,avg(工资) from student group by 部门编号 having avg(工资)>2000;

3. 例如我要查询 各个部门  员工工资大于1500 的平均工资  并且平均工资 大于2000的部门

 上面这句话怎么理解呢? 首先查询各个部门 那肯定要按部门编号分组 分组前的条件限定是 员工工资大于1500的才参与分组
计算出平均工资  然后对结果再进行筛选 筛选出 平均工资 大于2000的部门

select 部门编号,avg(工资) from student group by 部门编号 where avg(工资)>1500 having  avg(工资)>2000;
分页查询:limit
* limit 0,5 开始的记录索引, 每一页显示的条数     索引从0开始
	开始的记录索引  = (页码-1)*每一页显示的条数

例如 我显示第一页  每页5条记录
select * from student limit 0,5 ;  这是第一页 5 条记录
select * from student limit 5,5 ; 这是第二页 5条记录
select * from student limit 10,5 这是第三页 5条记录


* oracle:rownum 分页方言
* sqlserver:top 分页方言