SQL语言   

    Structured Query Language, 结构化查询语言

    非过程性语言

    美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准

    为加强SQL的语言能力,各厂商增强了过程性语言的特征

    如Oracle的PL/SQL 过程性处理能力

    SQL Server、Sybase的T-SQL

    SQL是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能


1.操作数据库

(1)创建数据库CREATE  DATABASE

CREATE  DATABASE  [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]

create_specification:

[DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name

 

1.~创建一个名称为mydb1的数据库。

create database mydb1;

2.~创建一个使用gbk字符集的mydb2数据库。

create database mydb2 character set gbk;

3.~创建一个使用utf8字符集,并带校对规则的mydb3数据库。

create database mydb3 character set utf8 collate utf8_bin;

 

(2)查看数据库SHOW DATABASES

1显示数据库语句:

SHOW DATABASES

2显示数据库创建语句:

SHOW CREATE DATABASE db_name

1.~查看当前数据库服务器中的所有数据库

show databases;

2.~查看前面创建的mydb2数据库的定义信息

show create database mydb3;

 

(3)修改数据库ALTER  DATABASE

ALTER  DATABASE  [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...]

alter_specification:

[DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name

 

1.~查看服务器中的数据库,并把其中mydb2字符集修改为utf8

alter database mydb2 character set utf8;

 

(4)删除数据库DROP DATABASE

DROP DATABASE  [IF EXISTS]  db_name

 

1.~删除前面创建的mydb1数据库 drop database mydb1;

drop database mydb1;

 

(5)选择数据库USE

进入数据库:use db_name;

查看当前所选的数据库: select database();

 

2.操作表

(1)创建表 CREATE TABLE

CREATE TABLE table_name

(

field1  datatype,

field2  datatype,

field3  datatype,

)

[character set 字符集] [collate 校对规则]

field:指定列名 datatype:指定列类型

MySQL常用数据类型

1字符串型  VARCHAR(可变长度字符串)CHAR

2大数据类型BLOB(大2进制数据,4GTEXT(大文本数据,4G

3数值型TINYINT SMALLINTINTBIGINTFLOATDOUBLE

3逻辑型 BIT1位,表示01boolean类型

4日期型DATETIMEDATETIMETIMESTAMP(保存数据最后修改时间)

 

定义单表字段的约束

1定义主键约束 primary key不允许为空,不允许重复

2删除主键:alter table tablename drop primary key ;

3主键自动增长 :auto_increment

4定义唯一约束 unique  

    例如:name varchar(20) unique

5定义非空约束 not null  

    例如:salary double not null

6外键约束

 

1.~创建一个员工表employee

create table employee(

id int primary key auto_increment,

name varchar(20) unique,

gender bit not null,

birthday date,

entry_date date,

job varchar(40),

salary double,

resume text

);

 

(2)查看表 DESCSHOW TABLES

查看表结构:desc tabName

查看当前数据库中所有表:show tables

查看当前数据库表建表语句 show create table tabName;

 

(3)修改表ALTER TABLE

ALTER TABLE table  ADD/MODIFY/DROP/CHARACTER SET/CHANGE  (column datatype [DEFAULT expr][, column datatype]...);

*修改表的名称:rename table 表名 to 新表名;

 

1.~在上面员工表的基本上增加一个image列。

alter table employee add image blob;

2.~修改job列,使其长度为60

alter table employee modify job varchar(60);

3.~删除gender列。

alter table employee drop gender;

4.~表名改为user

rename table employee to user;

5.~修改表的字符集为gbk

alter table user character set gbk;

6.~列名name修改为username

alter table user change name username varchar(20);

 

(4)删除表DROP TABLE

DROP TABLE tab_name;

1.~删除user

drop table user;


3.操作表记录

查看客户端与数据库服务器之间联系的编码方式show variables like character%;

设置当前客户端与数据库服务器之间的联系编码方式 set names gbk;

修改所有客户端的编码集:

E:\Program-Files\DevelopmentTool\cn\MYSQL5.0\my.ini文件修改

default-character-set=gbk

(1)INSERT INTO

语法:INSERT INTO table [(column [, column...])] VALUES (value [, value...]);

注意事项:

1.插入的数据应与字段的数据类型相同。

2.数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。

3.values中列出的数据位置必须与被加入的列的排列位置相对应。

4.字符和日期型数据应包含在单引号中。

5.插入空值:不指定或insert into table value(null)

6.如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表

举例:

1.~使用insert语句向表中插入三个员工的信息

insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)values (null,'张飞',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');

insert into employee values (null,'关羽',1,'1998-08-08','1998-10-01','财神爷',9999999.00,'老大的二弟,公司挣钱都指着他了');

insert into employee values (null,'刘备',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'赵云',1,'2000-01-01','2001-01-01','保镖',1000.0,'老大贴身人');


(2)UPDATE

语法:UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]

注意事项:

UPDATE语法可以用新值更新原有表行中的各列。

SET子句指示要修改哪些列和要给予哪些值。

WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行

 

举例子:

1.~将所有员工薪水修改为5000元。

update employee set salary = 5000;

2.~将姓名为’张飞’的员工薪水修改为3000元。

update employee set salary = 3000 where name='张飞';

3.~将姓名为’关羽’的员工薪水修改为4000,job改为ccc

update employee set salary=4000,job='ccc' where name='关羽';

4.~将刘备的薪水在原有基础上增加1000元。

update employee set salary=salary+1000 where name='刘备';

 

(3)DELETE FROM

语法:delete from tbl_name [WHERE where_definition]

注意事项:

1.如果不使用where子句,将删除表中所有数据。

2.Delete语句不能删除某一列的值(可使用update

3.使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。

4.insertupdate一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。--------外键约束

5.删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。

举例子:

1.~删除表中名称为’张飞’的记录。

delete from employee where name='张飞';

2.~删除表中所有记录。

delete from employee; 只是删除记录,表还在,再增加表记录时,主键自动增长。

3.~使用truncate删除表中记录。

truncate table employee; (效率高,只能删除整张表)

 

(4)*SELECT

1.基本查询

语法:SELECT [DISTINCT] *|{column1, column2. column3..} FROMtable;

举例子:

1.~查询表中所有学生的信息。

select * from exam;

2.~查询表中所有学生的姓名和对应的英语成绩。

select name,english from exam;

3.~过滤表中重复数据

select distinct english from exam;

4.~在所有学生分数上加10分特长分显示。(数据库的数据并没有更新,只是显示变了)

select name , math+10,english+10,chinese+10 from exam;

5.~统计每个学生的总分。

select name ,english+math+chinese from exam;

6.~使用别名表示学生总分。

select name as 姓名 ,english+math+chinese as 总成绩 from exam;

select name 姓名 ,english+math+chinese 总成绩 from exam;

select name english from exam;

 

2.使用where子句进行过滤查询

1.~查询姓名为张飞的学生成绩

select * from exam where name='张飞';

2.~查询英语成绩大于90分的同学

select * from exam where english > 90;

3.~查询总分大于230分的所有同学

select name 姓名,math+english+chinese 总分 from exam where math+english+chinese>230;

4.~查询英语分数在 80100之间的同学。

select * from exam where english between 80 and 100;

5.~查询数学分数为75,76,77的同学。

select * from exam where math in(75,76,77);

6.~模糊查询所有姓张的学生成绩。

select * from exam where name like '%';

select * from exam where name like '__';

7.~查询数学分>70,语文分>80的同学。

select * from exam where math>70 and chinese>80;

 

3.使用order by关键字对查询结果进行排序操作

SELECT column1, column2. column3.. FROMtable where... order by column asc|desc;

asc 升序 -- 默认就是升序

desc 降序

 

1.~对语文成绩排序后输出。

select name,chinese from exam order by chinese desc;

2.~对总分排序按从高到低的顺序输出

select name 姓名,chinese+math+english 总成绩 from exam order by 总成绩 desc;

3.~对姓张的学生成绩排序输出

select name 姓名,chinese+math+english 总成绩 from exam where name like '%' order by 总成绩 desc;

 

4.聚合函数

(1)Count -- 用来统计符合条件的行的个数(行的条件写清楚,列不用管,写啥都一样) 

select count(*) from exam  where 条件

举例子:

1.~统计一个班级共有多少学生?

select count(*) from exam;

2.~统计数学成绩大于90的学生有多少个?

select count(*) from exam where math>70;

3.~统计总分大于230的人数有多少?

select count(*)from exam where math+english+chinese > 230;

 

(2)SUM -- 用来将符合条件的记录的指定列进行求和操作(列的名称写清楚)

举例子:

1.~统计一个班级数学总成绩?

select sum(math) from exam;

2.~统计一个班级语文、英语、数学各科的总成绩

select sum(math),sum(english),sum(chinese) from exam;

3.~统计一个班级语文、英语、数学的成绩总和

select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

在执行计算时,只要有null参与计算,整个计算的结构都是null

此时可以用ifnull函数进行处理

4.~统计一个班级语文成绩平均分

select sum(chinese)/count(*) 语文平均分 from exam;

 

(3)AVG -- 用来计算符合条件的记录的指定列的值的平均值(列要写清楚)

举例子:

1.~求一个班级数学平均分?

select avg(math) from exam;

2.~求一个班级总分平均分?

select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

 

(4)MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值(列要写清楚)

举例子:

1.~求班级最高分和最低分

select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;



5.分组查询

举例子:

1.~对订单表中商品归类后,显示每一类商品的总价 (对组里的数据聚合)

select product,sum(price) from orders group by product;

2.~询购买了几类商品,并且每类总价大于100的商品(分组之后进一步过滤)

select product 商品名,sum(price)商品总价 from orders group by product having sum(price)>100;

 

where子句和having子句的区别:

1.where子句在分组之前进行过滤having子句在分组之后进行过滤

2.having子句中可以使用聚合函数where子句中不能使用

3.很多情况下使用where子句的地方可以使用having子句进行替代

举例子:

1.~查询单价小于100而总价大于150的商品的名称

select product from orders where price<100 group by product having sum(price)>150;

 

 sql语句书写顺序:

select from where group by having  order by

 sql语句执行顺序:

from where select group by having order by


备份恢复数据库

备份:cmd窗口下 mysqldump -u root -p  mydb2>e:/mydb2.sql

恢复:方式1:cmd窗口下 mysql -u root -p  mydb2<e:/mydb2.sql

方式2:mysql命令下, source  e:/mydb2.sql

注意恢复数据只能恢复数据中的表,数据库没法恢复需要先自己创建出数据后才能进行恢复.


二、多表设计多表查询

1.外键约束

表是用来保存显示生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,向这种约束就叫做外键约束。

create table dept(

id int primary key auto_increment,

name varchar(20)

);

insert into dept values(null,'财务部'),(null,'人事部'),(null,'销售部'),(null,'行政部');

 

create table emp(

id int primary key auto_increment,

name varchar(20),

dept_id int,

foreign key(dept_id) references dept(id)

);

insert into emp values(null,'奥巴马',1),(null,'哈利波特',2),(null,'本拉登',3),(null,'朴乾',3);

 

2.多表设计

一对多:在多的一方保存一的一方的主键做为外键

一对一:在任意一方保存另一方的主键作为外键

多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系


3.多表查询

笛卡尔积查询:

将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用

select * from dept,emp;

 

内连接查询:查询的是左边表和右边表都能找到对应记录的记录

select * from dept,emp where dept.id = emp.dept_id;

select * from dept inner join emp on dept.id=emp.dept_id;

 

外连接查询:

左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录

select * from dept left join emp on dept.id=emp.dept_id;

 

右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录

select * from dept right join emp on dept.id=emp.dept_id;

全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录

select * from dept full join emp on dept.id=emp.dept_id; -- mysql不支持全外连接

可以使用union关键字模拟全外连接:

select * from dept left join emp on dept.id = emp.dept_id

union

select * from dept right join emp on dept.id = emp.dept_id;