show databases;


查看当前选择的数据库

select database();

use test3;(使用表)

查询编码格式(这样可以避免在doc下看到的乱码)

show variables like 'character%';


set character_set_client=gbk;

set character_set_results=gbk;

开始创建表


create table student(

id int,

name varchar(20),

chinese float,

english float,

math float

);

insert into student(id,name,chinese,english,math) values(1,'陈冠希',89,78,90);

insert into student(id,name,chinese,english,math) values(2,'郭美美',67,98,56);

insert into student(id,name,chinese,english,math) values(3,'阿娇',88,98,90);

insert into student(id,name,chinese,english,math) values(4,'李一',87,78,77);

insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);

insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);

insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);

然后插入数据


distinct 明显的,独特的



查询表中所有的学生信息

select * from STUDENT;

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

select NAME,ENGLISH from STUDENT;


显示英语成绩,过滤表中重复数据

select distinct ENGLISH from STUDENT;


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

select NAME,MATH+10 from STUDENT;


统计每个学生的总分。

select NAME MATH+CHINESE+ENGLISH from STUDENT;


使用别名表示学生分数。

select NAME as 姓名,MATH+ENGLISH+ENGLISH 总分 from STUDENT;(注意在使用别名的时候的as是可以省略的)



查询姓名为"陈冠希"的学生成绩

select * from STUDENT where NAME='陈冠希';


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


select * from STUDENT where ENGLISH > 90;


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

select * from STUDENT where(MATH+CHINESE+ENGLISH)>200;


查询英语分数在 80-90之间的同学。


select * from STUDENT where ENGLISH between 80 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 and CHINESE>80;



注意:not and or 优先级依次降低。一元运算符比二元的要高。


对数学成绩排序后输出。

select MANE,MATH from STUDENT order by MATH;


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


select NAME,MATH+CHINESE+ENGLISH 总分 from STUDENT order by 总分 desc;


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


select NAME,CHINESE from STUDENT where NAME like '李%' order by CHINESE; 


注意:订单,order。创建表时要注意不要和关键字冲突。

解决办法:

1、把用户定义的内容用反引号引起来。`(Esc按键的下方)

2、数据库命名习惯:表名ORDERS (建议)这样将表名变为复数形式

这样可以避免和关键字冲突


create table order(id int);


这样的输入会报错,所以我们必须加上`(Esc按键下方)的反引号


应该这样输入:

create table `order`(int int);


查看表格式

desc `order`;



二、完整性约束


数据完整性的意义:

数据完整性是为了保证插入到数据中的数据时正确的,

它防止了用户可能输入错误。

数据完整性有以下三类


1、实体完整性:

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

实体完整性通过表的主键来实现。

主键:不能为null;唯一


创建一个表格T1,并声明一个主键


写法一(只能指定一个字段作为主键)

create table T1(

ID int primary key,

NAME varchar(100)

);


insert into T1(ID,name) values(1'aa');



写法二:(指定联合主键)


create table T2(

ID int,

NAME varchar(100),

primary key(ID)

);


用desc T2;

查看表的结构


比较写法一和写法二:

推荐写法二:可以指定联合主键


 写法三:(创建没有任何约束的表格,最后再修改约束) 

 create table T3(

ID int,

NAME varchar(100)

 );

alter table T3 add primary key(ID);



三种方法比较后:

极力推荐写法三

写法三的好处是:如果两张表的主键受到另外一张表的约束的时候,在数据还没有插入完毕的时候,

在插入数据的过程中会报错。所以我们选择写法三的话,就可以避免这样的错误。


注意:

逻辑主键(建议):除了唯一标识一条记录外,没有别的意义,一般

取名ID

业务主键:还有一定的业务意义。

在MySql中:

create table T4(

ID int key auto_increment,#自动增长,不建议使用,

并不是所有的数据库都支持自动增长,比如Qracle就不支持。

NAME varchar(100)

);

域的完整性

指数据库表的列(即字段)必须符合某种特定的数据类型偶约束。比如NOT NULL

1、约束数据的类型:强类型

2、非空约束: not null

3、唯一约束 unique

实例:

create table T5(

ID  int  primary key auto_increment,

USERNAME varchar(100) not null unique,

PHONE_NUM varchar(11) unique,

GENDER varchar(10) not null

);

参照完整性(多表的设计)定义外键

注意:类和表的结构关系;对象和记录的关系(帮助学习ORM:Hibernate MyBatis)

一对多(实例:客户对订单)

CUSTOMERS                       ORDERS

ID(PK) NAME  PADDRESS ID(PK)   ORDER_NUM AMOUT      CUSTOMER_ID(FK)

  1 张三   四川               1        2016101301     10          1

  2    李四   湖北               2        2016101302     12          2

                                      3        2016101303     15          2

                                      4        2016101304     16          1

如何描述订单与客户的关系呢?

我们可以在ORDERS中增加一列CUSTOMER_ID(FK),这个CUSTOMER_ID 的值受到CUSTOMERS 的ID的约束

即一个订单只能对应一个客户(一对多),反过来,一个客户可以有多个订单(多对一)

建表:

create table CUSTOMERS(

ID int primary key,

NAME varchar(100),

ADDRESS varchar(100)

);

create table ORDERS(

ID int primary key,

ORDER_NUM varchar(100),

AMOUNT float(10,2),

CUSTOMER_ID int,

constraint CUSTOMER_ID_FK foreign key (CUSTOMER_ID) references CUSTOMERS(ID)

);

说明:CUSTOMER_ID_FK为约束名称(一个库中约束名称唯一)

insert into CUSTOMERS values(1,"周莉",'四川');

insert into ORDERS values(1,'0001',100.00,2);(这句会报错的,因为有外键的约束)

我们插入:

insert into ORDERS values(1,'0001',100.00,1);这样就是完美的。