mysql的列约束和数据查询
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
步骤2:SELECT*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不合并相同数据
上一篇: Mysql Shell免密登录的思考及实际应用案例
下一篇: Idea连接Datasource时报时区错误的解决方法Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTime
推荐阅读
-
mysql查询某一列的数据最大字节
-
Sql查询MySql数据库中的表名和描述表中字段(列)信息
-
MySQL列类型的选择与MySQL的查询效率_MySQL
-
MYSQL查询 三列中的最大值
-
mysql一行对应多列的关联查询问题,有实例及详细描述,
-
MySQL学习总结(八)DDL语言之常见约束/六大约束/添加约束/列级约束/表级约束/列级约束和表级约束的区别/复合主键/主键和唯一的区别/修改表时删除约束
-
MySQL数据库(四):DML(增、改、删)、DDL(表的创建、修改、删除、复制等)、约束、标识列(自增长列)
-
MySQL学习总结(六)DDL语言之库的创建/修改库名/修改库的字符集/库的删除/表的创建/修改列名/添加列/修改列的类型或约束/删除列/修改表名/表的删除/表的复制
-
十一、mysql中数据表的字段(列)的属性(约束)详解
-
MySQL查询某个列中相同值的数量统计_MySQL