1.数据库结构:
以mysql为例,mysql服务器里面可以有多个数据库,一个数据库里面可以有多张表;
一般而言,一个系统(软件,项目)就设计一个数据库,一个数据库里面设计多张表,每一张表对应一个实体类;
2.什么是SQL?
Structure Query Language(结构化查询语言),通过SQL语句可以操作数据库。
SQL在windows中不区分大小写;
3.操作数据库:
-- 创建数据库 create database 数据库名 [character set 字符集][collate 校对规则]
create database mywork CHARACTER set utf8;
-- 查看数据库
SHOW DATABASES;
SHOW CREATE DATABASE mywork;
-- 删除数据库 drop database 数据库名;
DROP DATABASE mywork;
-- 修改数据库 alter database 数据库名 character set 字符集;
ALTER DATABASE mywork CHARACTER set utf8;
-- 选中数据库 use 数据库名;
use mywork;
-- 查看正在使用的数据库 select database();
select database();
4.操作数据表:
说明:可变长度 varchar(n) eg:varchar(20), 最大能存放20个字符. ‘aaa’, 占3个字符的空间
日期
- DATE 只有日期(年月日)
- DATETIME 日期和时间(年月日时分秒)
- TimeStamp 时间戳
约束:
not null: 非空 ; eg: username varchar(40) not null username这个列不能有null值
unique:唯一约束, 后面的数据不能和前面重复; eg: cardNo char(18) unique; cardNo 列里面不可以有重复数据
primary key;主键约束(非空+唯一); 一般用在表的id列上面.
注意:
1. 先设置了primary key 才能设置auto_increment
2. 只有当设置了auto_increment 才可以插入null 数据库自动增加值维护id
1.创建数据表:
create table student(
id int primary key auto_increment,
name varchar(40),
sex varchar(8),
age int
);
2.查看表:
1.查看当前数据库中的所有表:
show tables;
2.查看某张数据表的结构:例如:查看表 student
desc student;
3.修改表
1.在表中增加一列:例如:在表student增加列名address
alter table student add address varchar(40) not null;
2.修改列的类型约束:
alter table student modify sex varchar(10);
3.修改列的名称,类型,约束:修改表student中列名address为s_address,类型为varchar(20)
alter table student change address s_address varchar(20);
4.删除列:
alter table student drop s_address;
5.修改表名
rename table student to teacher;
SQL基本知识:
1.表与表之间的关系处理:
一对多:在多的一方创建一个列作为外键,指向一方主键;
多对多:新建一张中间表,至少包含两个列,都作为外键,分别指向各自的主键;
一对一:先当做一对多,在外键字段添加唯一约束;
外键添加的语法:
alter table 表 add foreign key(列[外键]) references 表(列[主键])
例如:alter table score add foreign key(sid1) references student(sid)
2.sql的连接查询:
1.内连接查询:
select * from a inner join b on 连接条件 [where 其它条件]
例如:SELECT * from t_category c INNER JOIN t_product p ON c.cid = p.cno;
2.外连接查询:
select * from a left outer join b on 条件
例如:SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno
内连接查询与外连接查询的区别:
- 内连接: 查询的是两个表的公共部分,满足连接条件的部分
- 左外连接: 以左边表为主表, 查询出左边表的所有的数据. 再通过连接条件匹配出右边表的数据, 如果满足连接条件,
展示右边表的数据; 如果不满足, 右边的数据通过null代替;
3.子查询:
1.子查询的结果是一个值的情况:
子查询结果是单行单列,肯定在WHERE后面作为条件,父查询使用:比较运算符,如:> 、<、<>、= 等
SELECT * FROM 表 WHERE 列 =(子查询);
例如: select * from product where cno = (SELECT cid FROM category where cname ='手机数码');
2.子查询的结果是单列多行的情况:
子查询结果是单例多行,结果集类似于一个数组,父查询使用IN运算符;
SELECT * FROM 表 WHERE 列 in (子查询);
例如:SELECT * FROM t_product WHERE cno in (SELECT cid FROM t_category WHERE cname in('手机数码','食物'));
3.子查询的结果是多行多列的情况:
子查询结果是多行多列,肯定在FROM后面作为表; 子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段;
例如:
SELECT MAX(c1.price) from (SELECT * FROM product where cno = 1) as c1;