mysql教程看这一篇就足够了
数据库的基本操作
查看数据库:show database 数据库名字;
创建数据库:CREATE DATABASE <数据库名>
修改数据库:ALTER DATABASE [数据库名]
删除数据库:DROP DATABASE <数据库名>
使用数据库:use 数据库名字
数据库注释
'# '单行注释
‘-- 空格’多行注释
/**/多行注释
数据表的操作
创建表
create table 表名字 (
字段名字 字段类型,长度 约束条件
…
);
实例
CREATE TABLE emp
(
id INT(11),
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
查看表 desc 表的名字;
修改表名字
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
实例
ALTER TABLE student RENAME TO students;
修改字符集
ALTER TABLE 表名 [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校对规则名>;
ALTER TABLE tb_students_info CHARACTER SET gb2312 DEFAULT COLLATE gb2312_chinese_ci;
修改字段名
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
ALTER TABLE tb_emp1 CHANGE col1 col3 CHAR(30);
修改字段类型
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
ALTER TABLE tb_emp1 MODIFY name VARCHAR(30);
删除字段
ALTER TABLE <表名> DROP <字段名>;
ALTER TABLE tb_emp DROP id;
删除数据表
DROP TABLE 表名字;
drop table student;
数据库的约束
主键约束 (PRIMARY KEY)
表示该字段是唯一的。
每个表只能由一个主键,并且该字段不能为空,一个字段只能在联合主键出现一次,联合主键不能包含多余的字段。
定义单字段主键
在字段的后面加 primary key,或者字段定义完成的时候在后面加。
create table ss (
id int primary key
);
create table ss1(
id int,
primary key(id)
);
创建表的时候创建联合主键
create table s (
id int,
name varchar(50),
primark key(id,name)
);
在修改表的时候创建主键
ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);
alter table student add primary key(id);
删除主键
ALTER TABLE <数据表名> DROP PRIMARY KEY;
alter table student drop primary key;
主键自增长
create table (
id int primary key AUTO_INCREMENT
)
外键(FOREIGN KEY)
规则
主表必须已经存在或者是当前的表。
主键不能包含空值,但允许在外键中出现空值。
在主表的表名后面指定列名或列名的组合。
外键中列的数目必须和主表的主键中列的数目相同。
外键中列的数据类型必须和主表主键中对应列的数据类型相同。
在创建表的时候创建外键
语法:[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES <主表名> 主键列1 [,主键列2,…]
CREATE TABLE tb_dept1
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
-location VARCHAR(50)
);
在修改表的时候创建外键
ALTER TABLE <数据表名> ADD CONSTRAINT <外键名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
ALTER table student add CONSTRAINT fk_s_t
FOREIGN key (id) REFERENCES teacher (t_id);
删除外键
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
ALTER table student drop FOREIGN key fk_s_t;
唯一约束(unique)
语法:<字段名> <数据类型> UNIQUE
在创建表的时候创建唯一性约束
create table s (
id int unique
);
在修改表的时候创建唯一性约束
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
ALTER TABLE tb_dept1 ADD CONSTRAINT unique_name UNIQUE(name);
删除唯一性约束
ALTER TABLE <表名> DROP INDEX <唯一约束名>;
ALTER TABLE tb_dept1 DROP INDEX unique_name;
检查性约束(check)
创建表的时候创建检查性约束
create table ss (
int price,
-- 约束字段值大于 0 且小于 10000
check(price >0 and price <1000)
);
在修改表时创建检查约束
ALTER TABLE tb_emp7 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
ALTER TABLE tb_emp7 ADD CONSTRAINT check_id CHECK(id>0);
删除检查性约束
ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;
ALTER TABLE tb_emp7 DROP CONSTRAINT check_id;
默认值约束
在创建表的时候创建默认值约束
<字段名> <数据类型> DEFAULT <默认值>;
create table ss (
id int default 1
);
在修改表的时候创建,默认值约束
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
ALTER TABLE tb_dept3 CHANGE COLUMN id in DEFAULT 2;
删除默认值约束
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;
LTER TABLE tb_dept3CHANGE COLUMN id int DEFAULT NULL;
非空约束
字段值不能为空
在创建表的时候创建非空约束
create table ss (
id int not null
);
在修改表的时候创建非空约束
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名>
<字段名> <数据类型> NOT NULL;
ALTER TABLE tb_dept4 CHANGE COLUMN id id int NOT NULL;
删除非空约束
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
ALTER TABLE tb_dept4 CHANGE COLUMN id id int NULL;
查看表的约束
SHOW CREATE TABLE <数据表名>;
运算符
MySQL 中的 IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。
NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中;如果不是,返回值为 1,否则返回值为 0。
数据表增删改查
insert(增加)
-- 向表中所有的数据添加数据,多条数据逗号隔开
语法: insert into 表名 values (value1,value2....)
insert into student values (1,'sd'),(2,'sd').....;
-- 向表中添加指定的数据
语法:insert into 表名 (字段1,字段2....) values (value1,value2...)
insert into student (id,name)values (1,'sd'),(2,'sd').....;
-- 复制表数据
语法:INSERT INTO…SELECT…FROM
insert into newstudent (id,name) select id,name from student
delete(删除)
删除单个数据
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
删除表全部数据
DELETE FROM tb_courses_new;
删除满足条件的数据
select * from studet where 条件;
select name from studet where id = 2;
修改数据(update)
语法:UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]
-- 把id为1的id修改成2
update student set id=2 where id=1;
查询(select)
1、查询全部数据
语法:SELECT * FROM 表名;
select * from student;
2、查询指定字段数据
语法 :select 字段 from 表名;
select name from student;
3、查询字段不重复的值
语法:SELECT DISTINCT <字段名> FROM <表名>;
select distinct name from student;
4、查询指定条数的数据
LIMIT 关键字可以指定查询结果从哪条记录开始显示,显示多少条记录。
不指定初始行数
-- 查询四条数据
SELECT * FROM student LIMIT 4;
指定行数
查询
第 4 条记录开始的行数为 5 的记录
SELECT * FROM tb_students_info LIMIT 3,5;
5、对查询结果进行排序
语法:ORDER BY <字段名> [ASC|DESC]
默认升序:asc
降序:desc
-- id进行降序排序
SELECT * FROM student ORDER BY id desc;
6、条件查询
AND:记录满足所有查询条件时,才会被查询出来。
OR:记录满足任意一个查询条件时,才会被查询出来。
XOR:记录满足其中一个条件,并且不满足另一个条件时,才会被查询出来。
带 BETWEEN AND 关键字的查询条件,查询什么在什么之间的数据。
-- 查询 age 大于 21,并且 height 大于等于 175 的学生信息
SELECT name,age,height FROM tb_students_info WHERE age>21 AND height>=175;
SELECT name,age,height FROM tb_students_info WHERE age>21 OR height>=175;
SELECT name,age,height FROM tb_students_info WHERE age>21 XOR height>=175;
-- 查询年龄18在25之间的数据
SELECT age FROM tb_students_info age between 18 and
25
7、like 模糊查询
带有“%通配符的查询
%前面的字符表示匹配以什么开头,%后面的字符表示匹配以什么字符结尾,%字符%表示匹配以什么字符包含。
-- 查询以a开头的数据
select * from student where name like 'a%';
带有“”通配符的查询
“”只能代表单个字符,字符的长度不能为 0。
-- 查询名字包含五个字符的人
select * from student where name like '_____';
8、空值查询
is not null --不为空
is null --为空
-- 查询id不为空
select * from student where id is not null;
9、聚合函数查询
聚合函数包括 COUNT(),SUM(),AVG(),MAX() 和 MIN()。其中,COUNT() 用来统计记录的条数;SUM() 用来计算字段值的总和;AVG() 用来计算字段值的平均值;MAX() 用来查询字段的最大值;MIN() 用来查询字段的最小值。
select count(name) from student;
select max(price) from student;
select min(price) from student;
select avg(price) from student;
select sum(price) from student;
10、分组查询
语法:GROUP BY <字段名>
-- 按照sex进行分组
SELECT name`,sex FROM tb_students_info GROUP BY sex;
过滤分组HAVING <查询条件>
HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。
但是 WHERE 和 HAVING 关键字也存在以下几点差异:
一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组。
WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。
WHERE在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。
WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。
WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。
SELECT GROUP_CONCAT(name),sex,height FROM tb_students_info GROUP BY height HAVING AVG(height)>170;
11、内连接查询
内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。
没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的。
-- 使用内连接查询学生对应的老师
SELECT s.name,t.t_name from student s INNER JOIN teacher t
on s.id=t.t_id;
-- 在这里的查询语句中,两个表之间的关系通过 INNER JOIN 指定,连接的条件使用 ON 子句给出。
12、外连接查询
内连接的查询结果都是符合连接条件的记录,而外连接会先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录。
外连接可以分为左连接(left join)和right join右连接。
左连接(left join)
语法:SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>。
可以省略 outer子句。
-- 使用内连接查询学生对应的老师包括没有老师的学生
SELECT s.name,t.t_name from student s left JOIN teacher t
on s.id=t.t_id;
右连接(right join)
右外连接又称为右连接,右连接是左连接的反向连接。使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。
可以省略 outer
-- 使用内连接查询学生对应的老师包括没有学生的老师
SELECT s.name,t.t_name from student s right JOIN teacher t
on s.id=t.t_id;
13、交叉查询
交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。
语法:SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
或者SELECT <字段名> FROM <表1>, <表2> [WHERE子句]
-- 查询两个表的笛卡尔积
SELECT * from student CROSS JOIN teacher;
--查询两个表id相等的内容
SELECT * FROM student s CROSS JOIN teacher t
where s.id=t.t_id;
14、子查询
注意:单列子查询不要取别名,多列子查询需要取别名。
子查询指将一个查询语句嵌套在另一个查询语句中。
语法:WHERE <表达式> <操作符> (子查询)
1)IN | NOT IN
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。
2)EXISTS | NOT EXISTS
用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。
-- 查询张老师教的学生
-- 首先查询出来张老师然后根据张老师得出对应的学生
SELECT id,name FROM student where t_id in
(SELECT t_id FROM teacher where t_name ='张老师');
本文地址:https://blog.csdn.net/qq_44982298/article/details/107307423