JavaEE学习11--数据库语言SQL

来源:互联网 发布:mac的常用快捷键 编辑:程序博客网 时间:2024/06/05 20:28

一、SQL简介

       StructuredQuery Language结构化查询语言

       概述:是一种定义、操作、管理关系数据库的句法。

       各大数据库厂商都支持ANSISQL标准,但也都对SQL进行了扩展。

       SQL:标准和扩展的东西(方言)

二、SQL语句的组成 

       *DQL:数据查询语言

       *DML:数据操作语言

       *DDL:数据定义语言

       DCL:数据控制语言

       TPL:事务处理语言

       CCL:指针控制语言

三、DDL:数据定义语言

作用:

用于描述数据库中要存储的现实世界实体的语言。即创建数据库和表的结构。

常用关键字:

CREATE ALTERDROP TRUNCATE

对库的操作:

       显示所有的数据库

       SHOW DATABASES;

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

       CREATE DATABASE mydb1;

       查看数据库的创建细节,可以看到使用的字符集。

       SHOWCREATE DATABASE mydb1;

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

       CREATE DATABASE mydb2 CHARACTER SET gbk;

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

       CREATE DATABASE mydb3 CHARACTER SET gbk COLLATE gbk_chinese_ci;

       删除前面创建的mydb3数据库

       DROP DATABASE mydb3;

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

       ALTER DATABASE mydb2 CHARACTER SET utf8;

对表结构的操作:

       显示当前的数据库

       SELECT DATABASE();

       选择数据库

       USEmydb1;

       创建一个员工表

       CREATETABLE employee(

              idint,

              namevarchar(100),

              gendervarchar(10),

              birthdaydate,

              entry_datedate,

              jobvarchar(100),

              salaryfloat(8,2),

              resumetext

       );

       查看库中的所有表格

       SHOW TABLES;

       查看表的结构

       DESC employee;

       查看表的创建细节

       SHOW CREATE TABLE employee;

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

       ALTER TABLE employee ADD image blob;

       修改job列,使其长度为60

       ALTER TABLE employee MODIFY job varchar(60);

       删除image列。

       ALTER TABLE employee DROP image;

       表名改为user

       RENAME TABLE employee TO user;

       修改表的字符集为utf8

       ALTER TABLE user CHARACTER SET utf8;

       列名name修改为username

       ALTER TABLE user CHANGE name username varchar(100);

四、DML:数据操作语言

作用:

用于向数据库表中插入、删除、修改数据

常用关键字:

INSERT UPDATE DELETE

特别注意:

MySQL,字符串或日期要包含在单引号中。

空值:NULL

对数据库进行操作

       查看表中的所有记录

       SELECT* FROM user;

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

       INSERTINTO user VALUES(1,'zxn','female','1995-12-02','2014-09-16','CEO',100000,'beauty');

       INSERTINTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES(2,'lyx','male','1945-12-02','2014-09-16','UFO',100000,'beates');

       插入中文数据:

              查看数据库使用的编码:

             使用命令:  mysql> SHOW VARIABLES LIKE 'character%';

             数据库显示的编码设置:

                   +--------------------------+------------

                   -----------+

                   |Variable_name           | Value

                                   |

                   +--------------------------+------------

                   -----------+

                   |character_set_client    | utf8    *客户端使用的编码

                               |

                   |character_set_connection | utf8      数据库连接时使用的编码

                               |

                   |character_set_database  | utf8     数据库用的编码

                               |

                    | character_set_results   | utf8      *查询结果集用的编码

                               |

                    | character_set_server    |utf8      服务器使用的编码

                               |

                    | character_set_system    | utf8     系统使用的编码

      

       用可视化的工具是没有这个问题的。     

       告知服务器客户端使用的编码:

       SETcharacter_set_client=gbk;

       告知服务器返回的结果集请使用UTF8

       SETcharacter_set_results=gbk;

       INSERTINTO user (id,username,gender,birthday,entry_date,job,salary,resume) VALUES(3,'杜小文','male','1935-12-02','2014-09-16','CTO',100000,'杜总');

      

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

       UPDATEuser SET salary=5000;

       将姓名为’zxn’的员工薪水修改为3000元。

       UPDATEuser SET salary=3000 WHERE username='zxn';

       将姓名为’lyx’的员工薪水修改为4000,job改为ccc

       UPDATEuser SET salary=4000,job='OOO' WHERE username='lyx';

       将杜小文的薪水在原有基础上增加1000元。

       UPDATEuser SET salary=salary+1000 WHERE username='杜小文';

       删除表中名称为’zxn’的记录。

       DELETEFROM user WHERE username='zxn';

       删除表中所有记录。

       DELETEFROM user;(一条一条的删除)

       使用truncate删除表中记录

       TRUNCATETABLE user;(摧毁整张表格,重新建立表结构)

五、DQL:数据查询语言

DQL:Data Query Language

作用:

查询数据,返回结果集。

常用关键字:

SELECT

对数据库数据进行查询的操作:

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

SELECT * FROM student;

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

SELECT name,english FROM student;

过滤表中重复数据。

SELECT DISTINCT english FROM student;

 

在所有学生数学分数上加10分特长分。

SELECT name,math+10 FROM student;

统计每个学生的总分。

SELECT name,chinese+english+math FROMstudent;

使用别名表示学生分数

SELECT name AS 姓名,chinese+english+math总分 FROM student;

 

查询姓名为王五的学生成绩

SELECT * FROM student WHERE name='王五';

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

SELECT * FROM student WHERE english>90;

查询总分大于200分的所有同学

SELECT * FROM student WHERE(chinese+english+math)>200;

 

查询英语分数在 8090之间的同学。

SELECT * FROM student WHERE english BETWEEN80 AND 90;

查询数学分数为89,90,91的同学。

SELECT * FROM student WHERE math IN(89,90,91);

查询所有姓李的学生成绩。

SELECT * FROM student WHERE name LIKE '%';

查询数学分>80,语文分>80的同学。

SELECT * FROM student WHERE math>80 ANDchinese>80;

 

对数学成绩排序后输出。

SELECT name,math FROM student ORDER bymath;

对总分排序后输出,然后再按从高到低的顺序输出

SELECT name AS 姓名,chinese+english+math总分 FROM student ORDER BY 总分DESC;

对姓李的学生成绩排序输出

SELECT * FROM student WHERE name LIKE '%' ORDER BY chinese;

六、数据完整性

       数据完整性是为了保证插入到数据中的数据是正确的,它防止了用户可能的输入错误。

1、实体()完整性

              规定表的一行(即每一条记录)在表中是唯一的实体。

              通过定义主键约束来实现。

              主键(PRIMARY KEY

                     特点:不能为null,且唯一。

              主键分类:

                     逻辑主键:比如ID,不代表实际的业务意义,只是用来唯一标识一条记录。(推荐)

                     业务主键:比如username作为主键。

定义主键的方式:

       方式一:

              CREATETABLE t1(

                     idint PRIMARY KEY,

                     namevarchar(100)

              );

       方式二:可以定义联合主键

              CREATETABLE t2(

                     idint,

                     namevarchar(100),

                     PRIMARYKEY(id)

              );

       方式三:(推荐)

              CREATETABLE t3(

                     idint,

                     namevarchar(100)

              );

              ALTERTABLE t3 ADD PRIMARY KEY (id);

       自动增长的主键:(Oracle没有的)

              CREATETABLE t4(

                     idint PRIMARY KEY AUTO_INCREMENT,

                     namevarchar(100)

              );

2、域()完整性

              指数据库表的列(即字段)必须符合某种特定的数据类型或约束

              数据类型

              长度

              非空约束:NOT NULL

              唯一约束:UNIQUE

              CREATETABLE t5(

                     usernamevarchar(100) NOT NULL UNIQUE,

                     gendervarchar(100) NOT NULL,

                     phonenumvarchar(100) UNIQUE

              );

3、参照完整性(Hibernate):

多表,外键约束

多表设计:

一对多:(最多,最复杂)

                     CREATETABLE customers(

                            idint,

                            namevarchar(100),

                            addressvarchar(255),

                            PRIMARYKEY(id)

                     );

                     CREATETABLE orders(

                            idint PRIMARY KEY,

                            order_numvarchar(100),

                            pricefloat(8,2),

                            statusint,

                            customer_idint,

                            CONSTRAINTcustomer_id_fk FOREIGN KEY(customer_id) REFERENCES customers(id)

                     );

                    

                     类和数据库表结构对应,对象和数据库表中的记录对应。

                    

                     类的设计有方向

                     publicclass Customer{

                            privateint id;

                            privateString name;

                            privateString address;

                           private List<Order> orders =new ArrayList<Order>();

                     }

                    

                     publicclass Order{

                            privateint id;

                            privateString orderNum;

                            privatefloat price;

                            privateint status;

                            privateCustomer customer;

                     }

多对多

                     CREATETABLE teachers(

                            idint PRIMARY KEY,

                            namevarchar(100),

                            salaryfloat(8,2)

                     );

                     CREATETABLE students(

                            idint PRIMARY KEY,

                            namevarchar(100),

                            gradevarchar(100)

                     );

                     CREATETABLE teacher_student(

                            t_idint,

                            s_idint,

                            PRIMARYKEY(t_id,s_id),

                            CONSTRAINTteacher_id_fk FOREIGN KEY(t_id) REFERENCES teachers(id),

                            CONSTRAINTstudent_id_fk FOREIGN KEY(s_id) REFERENCES students(id)

                     );

                    

                     类如何设计:

                     publicclass Teacher{//多对多

                            privateint id;

                            privateString name;

                            privatefloat salary;

                            privateList<Student> students;

                     }

                     publicclass Student{

                            privateint id;

                            privateString name;

                            privateString grade;

                            privateList<Teacher> teachers;

                     }

一对一:

       实际应用中很少用

七、多表查询

    1、链接查询:

              a、交叉链接:

                     SELECT* FROM customers,orders;返回的是两张表记录的笛卡尔积。(隐式查询:不使用关键字)

                     或者

                     SELECT* FROM customers CROSS JOIN orders;

              b、内连接:

                     SELECT* FROM customers c,orders o WHERE c.id=o.customer_id;

                     或者

                     SELECT* FROM customers c INNER JOIN orders o ON c.id=o.customer_id;

              c、外连接:

                     查询所有的客户信息,同时把对应的订单查询出来。

                     左外:返回符合链接条件的记录,同时返回左表中不满足链接条件的剩余记录

                            SELECT* FROM customers c LEFT OUTER JOIN orders o ON c.id=o.customer_id;

                     右外:

                            SELECT* FROM customers c RIGHT JOIN orders o ON c.id=o.customer_id;

    2、几个简单的子查询

              嵌套查询,子查询的语句放到小括号之内。

             

              ID=1的这个老师教过哪些学员(语句的查询形式:多条SQL语句)

              SELECTs_id FROM teacher_student WHERE t_id=1;

              SELECT* FROM students WHERE id IN (1,2);

             

              子查询:

              SELECT* FROM students WHERE id IN (SELECT s_id FROM teacher_student WHERE t_id=1);

八、分组统计

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

SELECT COUNT(*) FROM student;

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

SELECT COUNT(*) FROM student WHEREmath>90;

统计总分大于250的人数有多少?

SELECT COUNT(*) FROM student WHERE (chinese+english+math)>250;

 

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

SELECT SUM(math) FROM student;

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

SELECT SUM(chinese),SUM(english),SUM(math)FROM student;

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

SELECT SUM(chinese+english+math) FROMstudent;

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

SELECT SUM(chinese)/COUNT(*) FROM student;

 

求一个班级数学平均分?

SELECT AVG(math) FROM student;//不会包含为null

求一个班级总分平均分

SELECT AVG(chinese+english+math) FROMstudent;

 

*****************注意:可以使用`反引号把关键字包含起来,当做普通字符串对待。*****************

 

对订单表中商品归类后,显示每一类商品的总价

SELECT product,SUM(price) FROM t_orderGROUP BY product;

查询购买了几类商品,并且每类总价大于100的商品

SELECT product,SUM(price) FROM t_orderGROUP BY product HAVING SUM(price)>100;

九、MySQL备份与恢复

备份:

c:/>mysqldump -h localhost -u root -pmydb1>d:/mydb1.sql

 

恢复:

先创建数据库名,并选择数据库

方式一:mysql>SOURCE d:/mydb1.sql;

方式二:c:/>mysql -u root -ptest<d:/mydb1.sql