在千锋“逆战”学习第40天
每日一句:的一个程序有时正常有时不正常,而你已经完全遵循编程的规则,为什么?事实上我认为相信只要遵循别人所说就能得到想当然的结果的人其实是个傻瓜。
今天学习SQL语句中的查询以及增删改的内容。
明天继续努力。
笔记
8.16 表连接查询
语法:SELECT 列名 FROM 表1 连接方式 表2 ON 连接条件;
8.16.1 内连接查询(INNER JOIN ON)
#查询所有有部门的员工信息,显示部门名称(不包括没有部门的员工) SQL标准
SELECT * FROM t_employees
INNER JOIN t_departments
ON t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`;
#MYSQL标准
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME FROM
t_employees,t_departments
WHERE t_employees.`DEPARTMENT_ID` = t_departments.`DEPARTMENT_ID`;
#1.两张表连接查询,要有关联条件。但是关联条件的列重复了。需要明确查询的是哪个表的列
#2.表名比较长,表名多次重复出现。容易混淆.可以给别名
SELECT EMPLOYEE_ID,FIRST_NAME,d.DEPARTMENT_ID,DEPARTMENT_NAME FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
8.16.2 内连接查询
#查询所有岗位的员工信息,显示岗位名称
SELECT EMPLOYEE_ID,FIRST_NAME,JOB_TITLE
FROM t_employees AS e
INNER JOIN t_jobs AS j
ON e.`JOB_ID` = j.`JOB_ID`;
8.16.3 三表连接查询
#查询所有员工工号、名字、部门名称、部门所在城市的名称
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME,CITY
FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`
INNER JOIN t_locations AS l
ON d.`LOCATION_ID` = l.`LOCATION_ID`;
8.16.4 多表连接查询
#查询所有员工工号、名字、部门名称、部门城市名称、所在城市的国家
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME,CITY,COUNTRY_NAME
FROM t_employees AS e
INNER JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`
INNER JOIN t_locations AS l
ON d.`LOCATION_ID` = l.`LOCATION_ID`
INNER JOIN t_countries AS c
ON l.`COUNTRY_ID` = c.`COUNTRY_ID`;
8.16.5 左外连接查询(LEFT JOIN ON)
#查询所有员工信息,以及对应的部门名称(没有部门的员工,也在查询结果中,但是部门名称以NULL填充)
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME
FROM t_employees AS e
LEFT JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
8.16.6 右外连接查询(RIGHT JOIN ON)
#查询所有部门信息,以及部门中的员工信息
#(没有员工的部门,也在查询结果中,员工信息以NULL填充)
SELECT EMPLOYEE_ID,FIRST_NAME,DEPARTMENT_NAME
FROM t_employees AS e
RIGHT JOIN t_departments AS d
ON e.`DEPARTMENT_ID` = d.`DEPARTMENT_ID`;
九、 DML操作(增、删、改)
9.1 新增(INSERT)
9.1.1 添加一条信息
#添加一条员工信息
INSERT INTO t_employees
(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)
VALUES('209','Ya','Suo','[email protected]','515.123.6666','2010-03-18','Center',900,NULL,'123','50')
#多行添加,在值列表外边追加,再写一个值列表
,('208','Ya','Suo','[email protected]','515.123.6666','2010-03-18','Center',900,NULL,'123','50');
#添加一条城市信息
INSERT INTO t_countries(COUNTRY_ID,COUNTRY_NAME)VALUES('AL','阿尔巴尼亚');
SELECT * FROM t_departments;
#添加一条部门信息
INSERT INTO t_departments(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID)
VALUES('280','Teach','111','1500')
9.2 修改(UPDATE)
9.2.1 修改一条信息
#修改员工编号为208的员工名字为TOM Jackson
UPDATE t_employees
SET FIRST_NAME='TOM', LAST_NAME = 'Jackson'
WHERE EMPLOYEE_ID = '208';
9.3 删除
DELETE FROM 表名 WHERE 条件
9.3.1 删除一条信息
#删除一条员工,编号为207的
DELETE FROM t_employees
WHERE EMPLOYEE_ID = '207'
9.4 清空(TRUNCATE)
TRUNCATE TABLE 表名;
9.4.1 清空整张表
#清空t2整张表
TRUNCATE TABLE t2;
十、库表操作
10.1 数据库创建(CREATE)
CREATE DATABASE 库名
10.1 创建数据库
#创建默认字符集的数据库
CREATE DATABASE MYDB1;
#创建指定字符集的数据库
CREATE DATABASE MYDB1 CHARACTER SET UTF8;
10.2 修改数据库
ALTER DATABASE 库名 操作
10.2.1 修改数据库的字符集
#修改mydb1的字符集给gbk
ALTER DATABASE MYDB1 CHARACTER SET GBK;
10.3 删除数据库
DROP DATABASE 库名
10.3.1 删除数据库
#删除mydb1数据库
DROP DATABASE MYDB1;
10.4 数据类型
MySQL大致可以分为三类:数值、日期/时间、字符串(字符)类型。对于我们建表,约束列的类型有很大的帮助
10.4.1 数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
INT | 4字节 | (-2147483648,2147483647) | (0,4294967295) | 整数值 |
DOUBLE | 8字节 | (-1.797E+308,-2.22E-308) | (0,2.22E-308,1.797E+308) | 双精度浮点值 |
DOUBLE(M,D) | 8字节,M表示长度,D表示小数位数 | 同上,受M和D的约束。DOUBLE(5,2)-999.99-999.99 | 同上,受M和D的约束 | 双精度浮点值 |
DECIMAL(M,D) | 保存精确值 | 依赖M和D。 | 依赖M和D | 小数值 |
10.4.2 日期类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值 |
YEAR | 1 | 1901/2155 | YYYY | 年分值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM–DD HH:MM:SS | 混合日期时间值 |
10.4.3 字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字符 | 定长字符串 CHAR(10) 10个字符 |
VARCHAR | 0-65535 | 可变长字符串 VARCHAR(10) 10个字符 |
BLOB(binary large object) | 0-65535 | 二进制形式的长文本数据 |
TEXT | 0-65535 | 长文本 |
10.5 数据表的创建(CREATE)
…
列名 数据类型 [约束] //最后一列的创建,末尾不需要加逗号
)[charset=utf8]; //根据需要指定表的字符编码集
10.5.1 创建表
#创建科目表
#科目编号、科目名称、科目学时
#Subject
CREATE TABLE `Subject`(
subjectId INT,
subjectName VARCHAR(20),
subjectHours INT
)CHARSET=utf8;
INSERT INTO `subject`(subjectid,subjectname,subjecthours)
VALUES(1,'Java',10);
INSERT INTO `subject`(subjectid,subjectname,subjecthours)
VALUES(2,'HTML5',20);
INSERT INTO `subject`(subjectid,subjectname,subjecthours)
VALUES(3,'BIGDATA',5);
十一、约束
10.1 实体完整性约束
表中一行数据代表一个实体(entity),实体完整性约束是标识每一行数据不重复、实体唯一。
10.1.1 主键约束
PRIMARY KEY 唯一,标识表中的一行数据,此列的值不可重复,且不能为NULL
#创建表中,选择适合做主键的列,添加主键约束
CREATE TABLE Student(
stuid INT PRIMARY KEY,#标识每一个学生的编号是唯一的,不能为NULL
stuName VARCHAR(20),
phone VARCHAR(11)
)CHARSET=utf8;
10.1.2 唯一约束
UNIQUE 唯一,标识表中的一行数据,不可重复,可以为NULL
#表中的手机号列,添加唯一约束!不能重复,但是可以为NULL
CREATE TABLE Student(
stuid INT PRIMARY KEY,#标识每一个学生的编号是唯一的,不能为NULL
stuName VARCHAR(20),
phone VARCHAR(11) UNIQUE
)CHARSET=utf8;
10.1.3 自动增长列
AUTO_INCREMENT 自动增长,给主键数值列添加自动增长。从1开始,每次加1。不能单独使用,和主键搭配
#为表中的主键列添加自动增长,避免ID重复,也容易忘记
CREATE TABLE Student(
stuid INT PRIMARY KEY AUTO_INCREMENT,#会从1开始,根据添加数据的顺序依次+1
stuName VARCHAR(20),
phone VARCHAR(11) UNIQUE
)CHARSET=utf8;
10.2 域完整性约束
限制列的每一个单元格的数据正确性
10.2.1 非空约束
NOT NULL 非空,约束此列的每一个单元格不允许有NULL
#加了NOT NULL的约束列,必须有值
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
empName VARCHAR(20)NOT NULL,#约束名字这一列必须有值
address VARCHAR(50) NOT NULL
)CHARSET=utf8;
INSERT INTO emp(empName,address) VALUES(null,'北京市海淀区');#error,课程名称必须有值
10.2.2 默认值约束
DEFAULT 为列赋予默认值,当新增的数据不指定值时,可以书写DEFAULT,以定义好的默认值进行填充
#默认值约束,如果没有指定值,填充DEFAULT,默认值。
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
empName VARCHAR(20)NOT NULL,#约束名字这一列必须有值
address VARCHAR(50) NOT NULL,
sex CHAR(1) DEFAULT '女'
)CHARSET=utf8;
10.2.3 引用完整性约束
语法:CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCES 被引用表名(列名)
详解:FOREIGN KEY 引用外部表的某个列的值,新增数据时,约束此列的值必须是引用表中存在的值
#专业表
CREATE TABLE Speciality(
id INT PRIMARY KEY AUTO_INCREMENT,
SpecialName VARCHAR(20) UNIQUE NOT NULL#唯一,且不能为空
)CHARSET=utf8;
#课程表
CREATE TABLE `subject`(
subjectid INT PRIMARY KEY AUTO_INCREMENT,
subjecname VARCHAR(20) UNIQUE NOT NULL,
subjecthours INT DEFAULT 20,
specialid INT NOT NULL,
CONSTRAINT fk_subject_specialid
FOREIGN KEY(specialid)
REFERENCES Speciality(id)
)CHARSET=utf8;
SELECT * FROM SUBJECT;
#存在引用关系的表。要先添加被引用的表数据(主键表).再添加引用表的数据(外键表)
INSERT INTO Speciality (SpecialName) VALUES('Java');
INSERT INTO Speciality (SpecialName) VALUES('HTML5');
INSERT INTO `subject`(subjecname,subjecthours,specialid)
VALUES('JavaSE',10,1);
INSERT INTO `subject`(subjecname,subjecthours,specialid)
VALUES('JavaScript',20,2);
INSERT INTO `subject`(subjecname,subjecthours,specialid)
VALUES('BIGDATA',20,3);#error 约束:主键表不存在3.所以外键表不能插入3