sql语句(接mysql)

320 阅读4分钟

约束

  1. 作用: 对表中的数据进行限定,保证数据的正确性、有效性、完整性!

  2. 分类:

主键约束: PRIMARY KEY

     作用:  唯一+非空,一个表只允许一个主键(可以是联合主键),在数据库中用于标识唯一的数据使用
     
  1. 在建表时添加主键约束
CREATE TABLE USER(
	id INT PRIMARY KEY
)
  1. 删除主键约束 ALTER TABLE userDROP PRIMARY KEY

  2. 建表后添加主键约束 ALTER TABLE userMODIFY id INT PRIMARY KEY

主键自增约束(方言)

    作用:主键为整数时,每次添加数据id自增1
    注意:当删除掉某条记录,自增时不会补充该id,会按照删除前的id自增数继续自增
CREATE TABLE book(
	bid INT PRIMARY KEY AUTO_INCREMENT 
)

唯一约束: UNIQUE

     作用:  作用于在列上,该列不允许出现重复的值
     
CREATE TABLE `user`(
	`name` VARCHAR(20) UNIQUE  
)

非空约束: NOT NULL

     作用:  作用于在列上,该列不允许出现null
CREATE TABLE `user`(
	`name` VARCHAR(20) NOT NULL 
)

外键约束: FOREIGN KEY

作用:  作用于一个特殊的字段上,此字段必须依赖于其他的表字段
当表与表之间的数据有相关联性的时候,如果没有相关的数据约束,则无法保证数据的准确性
外键列引用的父表中不存在的数据是冗余数据
引用外键约束后的常见问题:
 1.子表的外键必须添加主表的主键存在的数据。
 2.因为有外键约束,所以父标被引用的数据不能删除。如果想删除,需要将子表中引用的所有数据全部删除,再删除父标数据
 3.因为有了外键约束,虽然保证了数据的安全性和完整性,但是导致父表数据操作非常繁琐,所以在日常开发中,经常不添加外键约束
  1. 建表时添加外键约束
CREATE TABLE `user`(
	id INT PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAR(20),
	rid INT,
	CONSTRAINT fk_user_room FOREIGN KEY (rid) REFERENCES room(id)
)
  1. 删除外键约束
    ALTER TABLE `user` DROP FOREIGN KEY fk_user_room
  1. 建表后添加外键约束
ALTER TABLE `user` 
ADD CONSTRAINT pk_user_room 
FOREIGN KEY (rid) 
REFERENCES room(id)

默认值约束: DEFAULT

     作用:  作用于列上,此列不输入值的时候,会使用默认值
 CREATE TABLE `user`(
	sex VARCHAR(1) DEFAULT '男'
)

练习

●创建一张图书(book)表

要求:

  1. bid 为数字类型 要求主键自增
  2. bookname 书名 为字符串类型 长度30 不允许为空
  3. bookid 书籍编号 为字符串类型 长度15 唯一约束
CREATE TABLE book(
	bid INT PRIMARY KEY AUTO_INCREMENT,
	bookname VARCHAR(30) NOT NULL,
	bookid VARCHAR(15) UNIQUE
)

image.png

表操作

格式:ALTER TABLE 表名 操作

往表中添加字段 column可以省略不写 添加一个price字段

ALTER TABLE 表名ADD COLUMN 字段名称 字段类型;

ALTER TABLE book ADD COLUMN price INT

修改表中字段的类型 将price的类型修改为varchar

ALTER TABLE 表名 MODIFY 字段名称 字段类型;

ALTER TABLE book MODIFY price VARCHAR(10000)

修改表中字段的名字 将price 修改为 money

ALTER TABLE 表名 CHANGE 旧列名 新列名 字段类型;

ALTER TABLE book CHANGE price money INT

删除字段 删除money字段

ALTER TABLE 表名 DROP 字段名称;

ALTER TABLE book DROP money

修改表名 将book改名为newbook

ALTER TABLE 旧表名 RENAME TO 新表名;

ALTER TABLE book RENAME TO newbook

表关系

一对多,多对多,一对一(特殊的一对多)

多表查询

内连接查询

  1. 显式内连接
SELECT *
FROM emp e
INNER JOIN dept d
ON e.dept_id=d.id
  1. 隐式内连接
SELECT *
FROM emp e,dept d
WHERE e.dept_id=d.id

外连接查询

不论是左外连接或者右外连接都是以一张表数据为主,将该表数据全部查询出来,再匹配另一张表,如果匹配不了则显示为null

  1. 左外连接
SELECT * 
FROM emp e
LEFT OUTER JOIN dept d
ON e.dept_id =d.id
  1. 右外连接
SELECT * 
FROM dept d
RIGHT OUTER JOIN emp e
ON e.dept_id=d.id

子查询

查询语句中嵌套了查询语句,我们就将嵌套的查询称为子查询

  1. 结果是单行单列的

    查询作用:可以将查询的结果作为另一条语句的查询条件,使用运算符判断。 = > >= < <= 等。

    查询工资最高的员工是谁?

SELECT * 
FROM emp
WHERE salary=(SELECT MAX(salary)FROM emp)
  1. 结果是多行单列的

    查询作用:可以作为条件,使用运算符 IN 或 NOT IN 进行判断。

    查询工资大于5000的员工,来自于哪些部门的名字

SELECT NAME
FROM dept
WHERE id IN (SELECT emp.dept_id FROM emp WHERE emp.salary>5000)
  1. 结果是多行多列的

    查询作用:查询的结果可以作为一张虚拟表参与查询。

SELECT *
FROM (SELECT * FROM emp WHERE join_date>2010-12-31) e
LEFT JOIN dept d
ON e.dept_id=d.id