欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql的列约束和数据查询

程序员文章站 2022-04-04 23:20:44
...

1.列约束

(1)主键约束 PRIMARY KEY

NULL,空,表示一个无法确定的值。例如暂时无法确定的商品价格,无法确定一个员工的电话。。。。

主键约束的列不允许为空,主键约束不能为NULL,NULL不能加引号,例如:编号不能为NULL

例如:

CREATE TABLE t3(
	id INT primary key
);

(2)非空约束 NOT NULL

声明了非空约束的列上禁止插入NULL

例如:

CREAT TABLE t3(
	age INT NOT NULL
);

(3)唯一约束 UNIQUE

声明了唯一约束的列不允许出现重复的值,允许插入NULL,甚至多个NULL。两个NULL之间不能划等号。

唯一约束可能会影响数据排序。

例如:

CREATE TABLE t3(
	user_name varchar(10) unique
);

(4)默认值约束 DEFAULT

例如:

CREATE TABLE t3(
	age INT DEFAULT 12,
	user_name varchar(10) DEFAULT '小明',
    phone_num int DEFAULT 110
);

插入数据的具体方式有两种:

INSERT INTO t3(age,user_name) VALUES(18,'小刚');      #phone_num未填写值,则直接为默认值 
INSERT INTO t3 VALUES(18,DEFAULT,138888888);

(5)检查约束 CHECK

也称为自定义约束,用户可以自己指定约束条件。mysql不支持检查约束,会影响数据插入速度,给服务器造成压力。

(6)外键约束

为了建立表之间的关联,外键约束列上的值,必须得再另一个表的主键列中出现过。

外键列和对应的主键列的列类型要保持一致

语法:FOREGIN KEY (外键列)Q AZ`1另一个表 (主键列)

CREATE TABLE t1(
	id int primary key
);
插入数据INSERT INTO........
CREATE TABLE t2(
	aid int primary key,
	foreign key (aid) references t1(id)
);
插入数据INSERT INTO........

(7)自增列 AUTO_INCREMENT

自动自增,插入数据的时候,不需要设置编号 只需要设置为NULL,就会获取当前的最大值,然后+1插入。

CREATE TABLE t1(
	id int AUTO_INCREMENT
);


2.简单查询数据

(1)查询整个数据表数据

SELECT*FROM t1;

(2)查询数据表中某列的数据

SELECT age,name,salary FROM t1;

(3)给列取别名再查询

SELECT age AS 年龄,name AS 姓名,salary AS 工资 FROM t1;    #AS可以用空格代替

(4)显示不同的记录

SELECT DISTINCT age FROM t1;     #显示表1中不同age的数据,相同的则不显示

(5)查询时计算

SELECT (salary+1000)*12+20000 年薪 FROM t1;     #计算t1表中年薪(月薪递增1000 年终奖为20000)

(6)查询结果集排序

SELECT*FROM t1 ORDER BY salary ASC(DESC);       #把表t1中的工资数据以升(降)序 排列     ASC=ascendant  DESC=descendant    #如果不加排序规则,默认是ASC升序.

(7)按指定条件查询

SELECT*FROM t1 WHERE age>25 AND salary>=10000;  #按年龄在25岁以上 工资大于等于10000来查询表t1的数据.
-----------------------------------------------------------------------------------------
SELECT*FROM t1 WHERE salary>=5000 AND salary<=10000 AND age=25;  #按年龄为25岁 工资5000-10000来查询表t1的数据.  
(工资5000-10000也可以用WHERE salary BETWEEN 5000 AND 10000 #来表示,不能用5000<=salary<=8000这种形式)
-----------------------------------------------------------------------------------------
SELECT*FROM t1 WHERE salary is null;  #查询没有明确工资的员工     
SELECT*FROM t1 WHERE salary is not null;   #查询有明确工资的员工  NULL 不可以=或者!来运算 只能用is或者is not 
-----------------------------------------------------------------------------------------
SELECT*FROM t1 WHERE salary=5000 OR salary=10000;
SELECT*FROM t1 WHERE salary in(5000,10000);    #以上两个代码都可以查询出t1表中工资为5000或者10000的员工。
SELECT*FROM t1 WHERE salary not in(5000,1000)   #此行代码为查询t1表中工资不是5000或者10000的员工。

(8)模糊条件查询

通常用与搜索

SELECT*FROM t1 WHERE name LIKE '%o%';                    #查询t1表中名字中间含有o的员工
SELECT*From t1 WHERE name LIKE '%o';                     #查询t1表中名字以o结尾的员工
SELECT*FROM t1 WHERE name LIKE '_o%';                    #查询t1表中名字中第二个字符为o的员工
SELECT*FROM t1 WHERE name LIKE '%o_';					 #查询t1表中名字中倒数第二个字符为o的员工

(9)分页查询

查询的结果集中有太多的数据,这些数据一次显示不完,可以做成分页显示。

需要有两个已知的条件:当前的页码,每页数据的数量。

#语法:SELECT * FROM t1 LIMIT 开始的值,每页数据的数量
练习:我想查第10页的数据,每页显示10条数据
SELECT*FROM t1  LIMIT 90,10;

*开始的值=(当前的页码-1)每页的数据量


3.复杂查询

(1)聚合查询/分组查询

示例:查询出所有员工数量

函数:是一个功能体,提供若干个数据,返回处理的结果

count() sum() max() min() avg()
数量 总和 最大 最小 平均
SELECT AVG(salay) FROM t1 WHERE sex=1;  #查询t1表中男员工的平均工资.
SELECT AVG(salary),MAX(salary),MIN(salary),sex FROM t1 GROUP BY sex; #查询t1表中平均工资,最高工资和最低工资,按照性别来分组。
SELECT name,YEAR(birthday) FROM t1 WHERE YEAR(birthday)=1993;  #查询t1表中1993年出生的人员

(2)子查询

查询市场部的员工有哪些?

步骤1:查询出市场部的部门编号

SELECT did FROM dept WHERE dname='市场部';            #查询出结果为市场部编号为20

步骤2SELECT*FROM emp WHERE deptId=20;               #查询出市场部员工的数据

一步到位: SELECT*FROM emp WHERE deptId=(SELECT did FROM dept WHERE dname='市场部')

(3)多表查询

查询出所有员工的姓名及其部门名称

SELECT emp.ename,dept.dname FROM dept,emp where emp.deptId=dept.did;         

#emp为员工表 dept为部门表 deptId为员工所在部门编号 did为部门编号。

新的多表查询法

  • 内连接-----------------和上面代码块的查询结果一致。

    SELECT ename,dname FROM emp INNE JOIN dept ON depId=did;
    
  • 左外连接

    SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON depId=did;
    #先写哪个表 哪个表就是左,左侧表所有记录都显示   outer关键字可以省略 
    
  • 右外连接

    SELECT ename,dname FROM emp RIGHT JOIN dept ON deptId=did;
    #后写哪个表 哪个表就是右,右侧表中所有记录都显示
    
  • 全连接
    FULL JOIN mysql 不支持~

    可以用 UNION或者UNION ALL 来查询

    SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON depId=did;
    UNION (ALL)
    SELECT ename,dname FROM emp RIGHT JOIN dept ON deptId=did;
    #UNION 合并相同数据   UNION ALL不合并相同数据