MySQL数据库

来源:互联网 发布:万能进销存软件注册码 编辑:程序博客网 时间:2024/06/03 14:05

数据库特点:

持久化:把程序中的数据写入到文件中;

数据库作用:

1、数据有统一的格式,方便管理2、有专门的查询算法,方便数据的查询3、可以给不同的用户赋予不同的操作权限,方便对用户管理4、数据库可以降低数据冗余。

数据库分类:

1、关系型数据库:其中的数据是以二维表的形式进行存储的,而且表与表之间具有关系:一对一关系,一对多关系,多对多关系;2、非关系型数据库(KV)

数据库基础:

DB:DateBase:数据库(文件没有功能,通过DBMS操作文件)

DBMS:DateBaseManagermentSystem:数据库管理系统:操作数据库中的所有文件;

RDBMS:RelationShipDBMS:关系型数据库管理系统

常见的关系型数据库: MySql、Oracle、DB2(IBM)、SQLServer(MS)】

CRUD:增删改查
C:create  增R:read    查(比较复杂)U:update  改D:delete  删

列:属性(Attribute)、列(column)、字段(field)都是列,表中的属性以列进行描述。

行:记录。

NaicvCat:是一个数据库的客户端程序,并不是数据库本身。

naicvcat快捷键1、ctrl + q:打开查询窗口2、ctrl + w:关闭查询窗口3、ctrl + shift + r:运行已选择的代码4、ctrl + r :运行语句

SQL语言分类:

1、DQL:DataQuaryLanguage:数据查询语言    select2、DML:DataManipulateLanguage:数据操作语言    insert、update、delete3、DDL:DataDefinitionLanguage:数据定义语言    create、    alter(修改表结构)、    modify(后边一定跟数据类型,改列的数据类型,加非空唯一约束)、    drop、truncate(对表结构进行操作)、    rename(修改表名)    change(改列名、列的数据类型)4、DCL:DataControllerLanguage:数据控制语言    grant/revoke、commit、rollback

用DOS命令操作MySQL数据库:

导入脚本:

1、将mysql文件夹下的bin文件加到环境变量中;

linux 中输入:sudo service mysql start

2、在DOS中进入MySQL:

musql -u root(用户名) -p回车之后输入密码  (若显示MYSQL提示符:mysql>,则成功)连接到远程主机上的MYSQL上的格式:mysql -h 主机地址 -u 用户名 -p 用户密码

注意:刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中;

3、打开数据库:

use 数据库名;

4、在打开数据库的前提下才能导入sql脚本:

source 脚本路径(路径中最好不要出现中文);

5、退出mysql:

exit/quit

6、退出输sql语句模式: 在 ’ -> ’ 之后输入 “\c”;

提示符 含义 mysql> 准备好接收新命令。 -> 等待多行命令的下一行。 ‘> 等待下一行,等待以单引号开始的字符串的结束。 “> 等待下一行,等待以双引号开始的字符串的结束。 `> 等待下一行,等待以反斜点开始的识别符的结束。 /*> 等待下一行,等待以/*开始的注释的结束。

导出脚本:

1、备份数据库:

方法一:

mysqldump -u 用户名 -p 密码 数据库名 > 路径+文件名.sql

方法二:

①、新建一个表   create database new charaster set 'utf8';②、进入DOS输入命令   mysql -u root new < 脚本

2、备份表:

mysqldump -u 用户名 -p 密码 数据库名 表名 > 路径+文件名.sql

3、备份数据库结构:

mysqldump -u 用户名 -p 密码 -d  数据库名 > 路径+文件名.sql

4、给现有表导入数据:

load data infile '文件路径' into table 表名;

注意:

要导入的文件格式为txt,文件内只写数据,并且要和列名对应

5、将数据库中的数据保存到文件中:

select * into outfile '文件路径和文件名' from 表名字;

注意:

 “文件路径” 之下不能已经有同名文件。

修改密码:

1、DOS命令修改:

mysqladmin -u root -p password 

2、UPDATE user 语句:

update user set password=PASSWORD('新密码') where user= '用户名';

3、SET PASSWORD语句:

SET PASSWORD FOR root@localhost=PASSWORD('123456');

关于昨天下午说的MySQL服务无法启动的问题,解决之后没有进入数据库,就直接关闭了电脑。
今早打开电脑,开始-运行 输入“mysql -uroot -pmyadmin”后出现以下错误:
“Access denied for user ‘root’@’localhost’ (using password:YES)”
直接输入“mysql” 也回报类似的错误:应该是:
“Access denied for user ‘ODBC’@’localhost’ (using password:NO)”具体的不记得了,貌似是这个。

关于这个问题,找了很久的解决方案,也换了盘符重装了好几次,问题依旧。
有网上说打开MySQL 的 MySQL 5.5 Command Line Client,在里面进行一系列的操作即可。但是此界面进来就要输入密码:
Access denied for user ’root’@’localhost’ (using password:YES) 解决方案
无论输入什么都直接退出。没撤了。
(哦,对了,期间,我还试过,在安装MySQL的时候不设置密码。安装成功后,还是报错。)
网上看了一大堆的解决办法,都不行。最后,结合一些办法,终于解决问题了。至于我的做法对不对?我不知道,但是确实解决了问题。也许还有其他的更好的解决方案,如果兄弟姐妹们知道的话,希望也能与我分享一下,不胜感激。

解决方案:
1、打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件。
2、重启MySQL服务。
3、在命令行中输入“mysql -uroot -p”(不输入密码),回车即可进入数据库。
4、执行,“use mysql;”使用mysql数据库。
5、执行,“update user set password=PASSWORD(“rootadmin”) where user=’root’;”(修改root的密码)
(期间我还select下user表中的记录,查询全部的时候显示了一些乱码,然后我只查询了user表中的Host、User、Password字段,貌似当时显示了3条记录,有1个没有名称。当然,为了解决问题,这些我也管不了了。)
6、打开MySQL目录下的my.ini文件,删除最后一行的“skip-grant-tables”,保存并关闭文件。
7、重启MySQL服务。
8、在命令行中输入“mysql -uroot -prootadmin”,问题搞定!

增加用户:

1.给用户分配空间:

grant:赋予   usage:使用*.*所有数据库的所有表grant USAGE on *.* to 'nb520'@'localhost'    IDENTIFIED by '123456' with grant option;

2.给用户赋予CRUD的权限:

grant all PRIVILEGES on *.* to 'nb520'@'localhost'    IDENTIFIED by '123456';

3、刷新权限:

flush PRIVILEGES;

4、查看mysql中的所有用户:

select * from mysql.user;

SQL语句

数据库操作:

查看数据库列表:

show databases;

新建数据库:

create database 数据库名 CHARACTER set 'utf8';(并设置了字符集)

打开数据库:(先打开数据库才能对表进行操作)

use 数据库名;判断数据库是否存在:show database if exists 数据库名;

删除数据库:

drop database 数据库名;

表操作:(在打开数据库的前提下)

查看表列表:

use 数据库名;show tables;

创建表:

在指定数据库下创建表 insert 数据库名.表名create table <表名1>(    列名a 数据类型(数据长度) comment '别名/注释',    列名b 数据类型(数据长度),    列名c 数据类型(数据长度))ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=1;ENGINE=InnoDB 是选择引擎DEFAULT CHARSET=gbk 默认字符集AUTO_INCREMENT=1 是设定该字段为自增字段,每次增加1ENGINE=InnoDB  DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;为什么这几句是括号外边呢?因为这句话描述的是table本身的信息而不是内部字段的信息
数据类型 大小(字节) 用途 格式 INT 4 整数 FLOAT 4 单精度浮点数 DOUBLE 8 双精度浮点数 ENUM 单选,比如性别 ENUM(‘a’,’b’,’c’) SET 多选 SET(‘1’,’2’,’3’) DATE 3 日期 YYYY-MM-DD TIME 3 时间点或持续时间 HH:MM:SS YEAR 1 年份值 YYYY CHAR 0~255 定长字符串 VARCHAR 0~255 变长字符串 TEXT 0~65535 长文本数据

查看建表语句:

show create table 表名

查看表结构:

desc 表名;

显示表记录:

select * from 表名;

删除表记录:

alter table 表名 drop 列名;(删除表结构,连同列名删除)alter table 表名 drop column 列名;delete from 表名 where 列名 = 当前列的值;(此句删的是行,不是列)delete from 表名;  (删除完之后insert 自增的主键依然增加)truncate table 表名; (不删除表结构,inert之后自增的主键从零开始)

注意:

a、delete后一定要跟where子句,不然将会删除全部,delete操作的是行,delete不能跟列名b、delete保留表结构,主键继续自增,删除速度略慢c、truncate保留表结构,主键清零后自增d、truncate对整表删除比delete效果高e、drop删除表结构,同时删除表数据

删除表:

drop table 表名;

增加一列:

alter table 表名 add 列名 数据类型(数据长度);alter table 表名 add column 列名 数据类型(数据长度);增加的列默认在表的最后一行,若想插到指定位置则用(after):插入到该列名之后alter table 表名 add column 列名 数据类型(数据长度) default 默认值 after 列名; 新插一列到第一列:alter table 表名 add column 列名 数据类型(数据长度) default 默认值 first; 

修改列名:

alter table 表名 change 老列名 新列名 数据类型(数据长度);

注意:

change在改列名的同时也可以修改列的数据类型,可能会导致数据丢失,所以要慎重使用。“数据类型” 不能省略,否则重命名失败。

修改该列的数据类型:

alter table 表名 modify 列名 修改后的数据类型(数据长度);alter table 表名 change 老列名 新列名 修改后的数据类型(数据长度);数值类型的(长度):表示显示长度,并非存储长度字符类型的(长度):表示存储长度数值类型:int、bigint、loat、double日期类型:timestamp(1970-...)          date(无时分秒)          datetime(1000-...)          year           字符类型:char(定长) varchar(变长) text(大文本)

修改表名:

rename table 老表名 to 新表明;alter table 老表名 rename 新表名;alter table 老表名 rename to 新表名;

给表添加数据:
①、给该行的所有列添加值,若不想添加,则在对应值的位置写null

insert into 表名 values(对该表所有列insert);

②、非空约束的列必须insert,无法跳过,除非有默认值

insert into 表名(列名1,列名2...) values(值1,值2...);

③、三连插(一次性insert多行)

注意values的顺序一定要跟创建表时列的顺序一致 insert into values(值1,值2...),(值1,值2...),(值1,值2...);

④、替换字符串:

insert(原字符串,起始位置,替换长度,替换后的字符串);select insert('xxooooxx',3,9,'FF'); 结果:xxFFreplace(原字符串,要被替换的字符,替换后的字符);select replace('xxooooxx','xx','YY'); 结果:YYooooYYinsert起始位置从1开头,replace会替换所有符合条件的字符。

⑤、截取字符串:

substring(原字符串,起始位置,截取长度);select substring('dd长度:10mm',6,3);   结果:10m

⑥、插入表数据

insert into 表名 select ..(对应的列名)  from 另一个表

注意:

1、非空约束的列在insert 时必须给值,除非:

a、列有默认值b、该列为自增主键想给空列添加值不能使用insert ,而是update;update是对已有的一行或多行数据进行修改;

2、先把表结构和主外键建立完毕后再添加数据,否则有无法创建主外键

3、先给主表赋值,再给从表赋值

4、错误提示Duplicate entry ‘XXX’ for key 1

意思是:对有唯一约束的列insert了重复值

修改表数据:

update 表名 set 列1 = 值1, 列2 = 值2... where 列3 = 

置空数据:用 = null,注意null不加双单引号

update 表名 set 要置空的列名 = null; (置空该列所有数据)update 表名 set 要置空的列名 = null where 条件;

单行多列求和:

update 表名 set 列名 = (列名1, 列名2, ....);    

注意:
①、给某些行或者某些行中的空值列赋值使用的是:update…. where

update 表名 set 列名 = value...where

②、insert 操作的是行,update 操作的是列

③、update 一定要跟where 条件,不然一列都会被更新;

从老表中复制数据到新表

create table 表名 select 老表; 新表未建立insert into 表名 select 老表; 新表已建立注意:每个派生出来的表都必须有一个自己的别名

视图:

在使用SELECT语句查询的时候,语句中WHERE里面的条件,会自动判断有没有可用的索引。

create view 视图名(列1, 列2, 列3...) as select 列a, 列b, 列c... from(表名);

注意:

视图也可以建立在多张表上,只需在SELECT语句中使用子查询或连接查询具体的操作和普通表一样

临时表:

查询表:

select是对表中的数据进行查询,返回结果为一个逻辑视图,并非物理表。 select不会改变表结构和表数据。

1、对列进行筛选

select 列名 from 表名;加别名,别名最好加双单引号。select 列名1 as 别名, 列名2 别名... from 表名 别名;

2、查询 n —— m之间的某列数据:(between 区间查询,用于数组列)

select * from 表名 where 列名 between n and m;

3、查询分散的某几列:

select * from 表名 where 列名 in(值1, 值2...);查询出值1、值2对应列之外的列select * from 表名 where 列名 not in(值1, 值2...);

4、合并多列为一列查询:

select CONCAT('兑馁老母','MotherFucker','妈妈shui');显示结果:兑馁老母MotherFucker妈妈shui;select concat('_', 列名1, 列名2, ...) from 表名;(只在第一个位置加分隔符)select concat_ws('-', 列名1, 列名2, ...) from 表名;(在多列之间加分隔符)

5、模糊查询 like:

①、%表示0个或多个任意字符②、_表示一个任意字符select * from 表名 where 列名 like 'aaa%';

另类模糊查询:

INSTR(字段名, 字符串)select name from 用户表 where instr('name‘,'')>0;//返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始)//instr相当于java中indexof

6、查询数据去重 distinct:

完全一样则去重:select distinct 列名 from 表名;多列的组合不完全一样即为不重复select distinct 列名1, 列名2.. from 表名;

7、查询记录为null的列:

查询的时候使用 is nullselect * from 表名 where 列名 is null;

8、分页查询:

语法:

limit 起始行(下标从0开头), 连续取几行limit 2;  取前多少行每页n行数据,查询第x页select * from 表名 limit n * (x - 1), n;分页查询前一般需要 order by 

9、分组查询:

分组相当于把多个表按某种规则拆分为多个小表,然后再一张张分别进行统计

目的:统计某一类数据的个数,分组后一般使用聚合函数

注意:

where 和 having:    where 是对整个表:一行一行的去筛选;    having 是对分组后的结果进行筛选

10、查询函数:

curdate():获取当前日期,没有时分秒curtime():获取当前时间,只有时分秒now():获取当前日期和时间,年月日时分秒week(date datetime):获取当前日期在本年第几周select year('1997-07-01');select DAY(now());  day获取在本月的号数select hour(now());select minute(now());select SECOND(now());datediff(大,小):计算两个日期之差,若写成小前大后则在datediff之前加个负号;select -datediff('2017-01-01','2017-08-10');ceil():直接进位select ceil(2.1);floor():舍去小数位select floor(2.9);select rand();    生成0-1之间的小数生成n-m之间的随机数:select floor(rand()*(m-n+1)+n);

排序:

语句最后加上(order by 列名)对数据进行排序,默认升序    asc---->升序           desc---->降序

子查询:

一个查询的结果做另外一个查询的条件/列/表

子查询原则上可以写到任何地地方,但是一般都写在条件语句中(where 和 having):子查询是解决复杂查询(跨表)的一种常用的思路。

1、单行子查询:查询结果为单行,一般和关系运算连用

2、多行子查询:查询结果为多行,一般和in 、any、all连用
any,all必须和关系运算结合使用

select ... from ... where exists(子查询):如果子查询有查询结果才会去执行外部查询如果子查询无查询结果则外部查询不再执行也就是说通过where exists实现了子查询控制外部查询

多表关联:

把一张表或多张表通过外键关联成一张大表,方便查询关联后,只是逻辑相关,物理上仍是独立的表

多表关联分类:1.内连接 inner join:通过外键进行等值连接2.左外连接  left join:左表的数据完全展示:a.有匹配的进行匹配b.无匹配用null值填充3.右外连接  right join右表的数据完全展示:a.有匹配的进行匹配b.无匹配用null值填充

注意:

①、默认使用内连接,内连接的inner可省略②、多表关联和子查询往往结合使用

例:根据每个学生每个学科的最终考试时间制作成绩单

1、先进行表关联2、第一个 where 找出当前学生的所有课程的考试日期3、之后 参数绑定 当前学生当前课程的所有考试日期
select s.student_name '姓名', sub.subject_no '学科',     g.grade_id '年级', r.exam_date '考试日期',     r.student_result '成绩' from result r join student s on r.student_no = s.student_nojoin subject sub on r.subject_no = sub.subject_nojoin grade g on r.grade_id = g.grade_idwhere exam_date = (    select max(exam_date) from result r2     where r.student_no = r2.student_no    and r.subject_no = r2.subject_no)order by s.student_name, sub.subject_no;

列2:五表关联

-- quarter:四分之一、一刻钟、季度-- quarter(日期列):取该列对应的季度
-- 1.查询各个季度的房屋总量select quarter(htime) '季度', '合计','','',count(*) '房屋总量'    from hos_house     group by quarter(htime)union-- 2.查询各个季度各个区县的房屋总量select quarter(h2.htime) '季度',d2.dname '区县', '小计','',count(*) '房屋总量'from hos_house h2 join hos_street s2 on h2.sid = s2.sidjoin hos_district d2 on s2.sdid = d2.did    group by quarter(h2.htime), d2.dnameunion-- 3.查询各个季度各个街道各个户型的房屋总量select quarter(h3.htime) '季度', d3.dname '区县', s3.sname '街道', t3.htname '户型', count(*) '房屋总量'from hos_house h3 join hos_street s3 on h3.sid = s3.sidjoin hos_district d3 on s3.sdid = d3.didjoin hos_type t3 on h3.htid = t3.htidgroup by quarter(h3.htime), d3.dname, s3.sname,t3.htnameorder by 1,2,3,4;

where子句中的关键字使用:

①、not 一般和 is 连用;②、不等于:!=, <>;查询不是 值1 的所有员工select * from 表名 where 列名 <> '值1';select * from 表名 where 列名 not in('值1');select * from student where sname != '值1';③、and 与、or 或;④、算术运输仅限于数组列,对varchar的列不要进行算术运算   select 列名 + 数值 from 表名;⑤、条件语句中的=:表示判断是否相等⑥、in 和 not in: 只查询in内的数据,而not in查询之外的数据

伪列:

给筛选出的数据表加上序号;

rownum行号, 注意这是伪列@rownum:=@rownum+1伪列值的改变规则select @rownum:=@rownum+1 行号,    student_no,student_result from         -- select @rownum:=0伪列初始值,一定要起别名        (select @rownum:=0) rn,result            where exam_date='2017-04-09'                order by student_result DESC

关于null:

①、null不是空字符串也不是空格,表示为赋值(空值)②、可以当任意类型使用③、null值参与算术运算, 结果还是null④、null值参与拼接结果仍为null

注意:

①、select中的where子句是对整个表的所有行进行筛选,无where子句:查出所有行②、关系运算只能单行结果比较③、* 指的是所有列

分组函数(统计函数、聚合函数):

对数据进行分组,目的是为了进行统计

sum():求和

②、count():求总数:(会自动跳过 被置空 的行)

select count(*) '总行数' from 表名;select count(列名) from 表名;

③、avg():求平均值

-- 按部门统计平均工资select dept_id,avg(salary) from emp group by dept_id;

④、max():求最大值

select count(列名) '最大值' from 表名;min():求最小值

注意:

①、聚合函数会忽略null值②、分组后select后只能写分组的列名和聚合函数③、对分组后的结果进行筛选使用having子句,不能使用where。

sql语句书写顺序:

1.where:对整个表的所有行进行筛选 2.group by:分组3.having:对分组后的结果进行筛选4.order by写到最后:筛选全部进行完毕再进行排序5.limit:分页显示

添加约束:

索引:

建立索引:

create index 索引名 on 表名(列名);   //给列名添加索引alter table 表名 add index 索引名(列名);   //给列名添加索引

查看表中的索引:

select index from 表名;

注意:

在使用SELECT语句查询的时候,语句中WHERE里面的条件,会自动判断有没有可用的索引。

一、添加列的时候可以添加约束:

add 列名 数据类型 约束条件;

二、通过modify进行添加:(modify后一定跟数据类型)

alter table 表名 modify/add 约束条件;alter table student add id int not null;alter table student modify id int unique not null;

修改主键为自增:

alter table 表名 modify 主键名 数据类型 auto_increment;

修改主键为非自增:

alter table 表名 modify 主键名 数据类型;

注意:语法上允许对非空且唯一的整数列加自增,但是注意一般只对主键进行自增。

三、通过constraint添加:

alter table 表名 add constraint 约束名(pk_表名) 约束类型(primary key)(列名);

1、主键约束(primary key):
①、建表时加入主键方式一:

列名 数据类型(数据长度) primary key

②、建表时加入主键方式二:

constraint 主键名字(自定义) primary key(列名)

③、特殊主键(复合主键):

constraint 主键名字(自定义) primary key(列名1, 列名2)

④、删除主键:

alter table 表名 drop primary key;

⑤、删除主键,且该主键为另一张表的外键:

a、删除从表的外键:

alter table 表名 drop index 索引名;或者:alter table 表名 drop foreign key 外键别名;

b、把主键设置为非自增

alter table 表名 modify 主键名 数据类型;

c、删除主表的主键

alter table 表名 drop primary key;alter table 表名 drop 主键别名;

注意:

a、非空且唯一若没有主键,则默认为主键

2、默认值约束(default):
①、建表时加入默认值约束:(默认添加unique约束)

列名 数据类型(数据长度) default '10'

注意:
a、当有默认值约束的列,插入数据为空,将使用默认值。
b、默认值约束只会在使用insert语句是体现出来。
c、如果被 DEFAULT 约束的位置没有值, 那么这个位置将会被 DEFAULT 的值填充;

3、唯一约束(唯一索引unique):指定列的值都是唯一的,不可重复
①、建表时加入唯一约束:

unique(列名)

注意:

a、当insert语句插入的数据和已有的数据重复时,若有unique约束,则失败。

4、非空约束(not null):

①、建表时加入非空约束:

列名 数据类型(数据长度) not null

②、添加非空约束:

alter table 表名 modify 列名 数据类型 not null;

③、删除非空约束:

alter table 表名 modify 列名 数据类型;alter table 表名 drop index 索引名;

注意:
a、对有空值的列无法加非空约束;
b、值插入该列时,必须为非空;若违反,只警告,不报错,MySQL版本5.5以上的会报错

5、外键约束(foreign key):一个表的主键做另外一个表的外键。既能确保数据完整性,也能表现表之间的关系

一个实体的某个字段指向另一个实体的主键,就称为外键被指向的实体,称之为主实体(主表),也叫父实体(父表)。
负责指向的实体,称之为从实体(从表),也叫子实体(子表)

①、建表时加入外键约束:(外键约束)外键列的值只能通过其关联表的主键来生成。

constraint 外键名字(自定义) foreign key(要设外键的列名) references 主表名(主表的主键)

②级联删除:删除主表的数据,其关联的从表数据也会删除 on delete cascade

on delete set null注意:删除主表时把从表的外键置null 

③级联更新:更新主从表也会同步更新 on update cascade;

alter table 表名 add constraint 外键名 foreign key(外键名) references 主表名(主表的主键) on delete cascade on update cascade

④、删除外键:

alter table 表名 drop foreign key 外键名;

⑤、Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。
解决方法:

a、在Mysql中取消外键约束:SET FOREIGN_KEY_CHECKS=0;  b、将原来表的数据导出到sql语句,重新创建此表后,再把数据使用sql导入c、设置外键约束: SET FOREIGN_KEY_CHECKS=1;  

⑥、查看表中的外键

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE  where REFERENCED_TABLE_NAME='表名';

注意:

用语句创建外键之后,NaviCat中不能显示,Ctrl+SINSERT 时,如果被外键约束的值没有在参考列中有对应,则INSERT 失败。先删外键,再删主键

目的:

①、限制从表的数据:保证了数据一致性②、表关联,多个表通过外键进行关联*先给主表赋值再给从表赋值

6、CHECK 约束: CHECK 约束用于限制列中的值的范围。

a、如果对单个列定义 CHECK 约束,那么该列只允许特定的值。b、如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制

①、创建check约束:

a、建表时创建:    Id_P int NOT NULL CHECK (Id_P>0)    或者:    CHECK (Id_P>0)    或者创建多个check约束或者需要命名 CHECK 约束:    CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')b、已建表:    ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes');

②、删除check约束:

ALTER TABLE 表名 DROP CHECK check约束别名;

关于字符集:

查看客户端字符集:

show VARIABLES like 'character_set_client';

查看用户所有文件的字符集:

show variables like 'character_set_%'

这里写图片描述
设置字符集:

set names 'utf8';

错误:

ERROR:Every derived table must have its own alias解决方法:给派生表加一个别名,每个派生出来的表都必须有一个自己的别名。ERROR:Incorrect column specifier for column '列名'解决方法:将设有自动增长列的数据类型改为INT型