SQL语句
0. MYSQL登陆
mysql -u root -p
1. 创建数据库
CREATE DATABASE <name>;
2. 查看数据库
SHOW DATABASES ;
3. 删除数据库
DROP DATABASES <name>;
4. 使用数据库
USE <name>;
5. 创建表
这里给出MySQL常见数据类型的链接
CREATE TABLE table_name (column_name column_type);
MySQL
CREATE TABLE student(
student_id INT NOT NULL AUTO_INCREMENT,
student_name VARCHAR(20) NOT NULL,
student_score INT check(student_score>=0 and student_score<=100),
student_age INT check(student_age >=0),
PRIMARY KEY ( student_id )
);
外键:
CREATE TABLE class(
student_id INT PRIMARY KEY,
class VARCHAR(20) NOT NULL,
CONSTRAINT FOREIGN KEY (student_id ) REFERENCES student(student_id)
);
MySQL注释
6. 表的详情
desc +表名用来显示表的状态,包括列名(column name),各个列的类型(Type),各个列的值类型,主外键(Key),默认值,其他;示例如下:
desc <name>;
7. 删除表
DROP TABLE <name>;
8. 插入数据
基础语法
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
实例
INSERT INTO student ( student_id , student_name,student_score,student_age )
VALUES
( 1, "李雷", 60, 19 );
插入多条数据
INSERT INTO table_name (field1, field2,...fieldN)
VALUES
(valueA1,valueA2,...valueAN),
(valueB1,valueB2,...valueBN),
(valueC1,valueC2,...valueCN);
插入数据也有其他两种语句
INSERT INTO student VALUES ( 1, "李雷", 60, 19 );
INSERT INTO student (student_id ,student_name) VALUES (1, "李雷");
9. 查询数据
SELECT student_id ,student_name
FROM student [AS]<name>
[WHERE Clause]
[OFFSET M ][LIMIT N]
- 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
- SELECT命令可以读取一条或者多条记录。
- 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
- 你可以使用 WHERE语句来包含任何条件。
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
- 你可以使用 LIMIT 属性来设定返回的记录数。
例如:
挑选前三个student_id>1的学生
SELECT *
FROM student
WHERE student_id >1
LIMIT 3;
10. where 子句
语句语法
WHERE <查询条件> {<判定运算1>,<判定运算2>,…}
1. <表达式1>{=|<|<=|>|>=|<=>|<>|!=}<表达式2>
其中: <> 为不等于,<=> 为严格比较两个NULL值是否相等
SELECT *
FROM student
WHERE student_id = 1;
2. <表达式1>[NOT]LIKE<表达式2>
LIKE 为模糊查询
常用符号:
- % 是 MySQL 中常用的一种通配符,在过滤条件中,百分号可以表示任何字符串,并且该字符串可以出现任意次
- _ 下划线通配符和百分号通配符的用途一样,下画线只匹配单个字符,而不是多个字符,也不是 0 个字符
例如:
挑选出名字中含雷的学生
SELECT *
FROM student
WHERE student_name LIKE "%雷%";
3. <表达式1>[NOT][REGEXP|RLIKE]<表达式2>
REGEXP 为MySQL中的正则表达式
这里涉及正则表达式的内容,我这里给出一个正则表达式的链接
挑选不以A开头的学生
SELECT *
FROM student
WHERE student_name REGEXP "^[^a]";
4. <表达式1>[NOT]BETWEEN<表达式2>AND<表达式3>
BETWEEN 常用于查询在某一段日期直接或是在某一段区间
SELECT *
FROM student
WHERE student_age BETWEEN 16 AND 20;
5. <表达式1>IS[NOT]NULL
挑选年龄不为空的学生
SELECT *
FROM student
WHERE student_age IS NOT NULL;
11. 更新表信息
UPDATE <name> SET field1=new-value1, field2=new-value2
[WHERE Clause]
将所有60分以下的学生的成绩改成60分
UPDATE student set student_score =60
where student_score<60;
将所有60分以下的学生的成绩改成60分
UPDATE student set student_score =60
where student_score<60;
将所有60分以下的学生的年龄改为18(毫无逻辑,仅仅为举例子)
UPDATE student set student_age=18
where student_score<60;
12. NULL 值处理
- IS NULL: 当列的值是NULL,此运算符返回true
- IS NOT NULL: 当列的值不为NULL, 运算符返回true
- <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true
我们可以使用前面的 UPDATE 语句进行NULL的处理,如将空值附上值
UPDATE student set student_score=60
where stduent_score is null;
将非空值清空:
UPDATE student set student_score=NULL
where stduent_score is not null;
13. 删除表信息
DELETE FROM table_name
[WHERE Clause]
将成绩小于60的学生删除(被退学了)
DELETE FROM table_name
where student_score<60;
14. 排序
对我们挑选的数据进行排序
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
选择名字里带雷的学生,并按照成绩进行顺序排序 (ASC:顺序,DESC:逆序)
SELECT * FROM student
where student_name = "%雷%"
ORDER BY student_score ASC;
15. 分组查询
常见的统计函数
函数 | 作用 |
---|
COUNT | 求数量 |
MAX | 最大值 |
MIN | 最小值 |
SUM | 求和 |
AVG | 求平均值 |
POW(x,y) | 求x的y次方 |
…… | …… |
SELECT COUNT(salary) 人数 ,MAX(salary) 最大薪水,MIN(salary) 最小薪水,AVG(salary) 平均薪水 from employee;
更多的函数见https://www.runoob.com/mysql/mysql-functions.html
使用group by 分组展示
按 salary 分组:
SELECT salary,COUNT(*) FROM employee
GROUP BY salary;
16. 连接查询
select语句也可以做常见的连接
以下面两表为例:
1. employee表
2. department表
SELECT a.name,a.age,b.people_num FROM employee a,department b
where a.in_dpt=b.dpt_name;
JOIN语句
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反
INNER JOIN
SELECT column_name(s) FROM table1 JOIN table2
ON table1.column_name=table2.column_name;
以下面两表为例:
1. employee表
2. department表
SELECT a.name,a.age,b.people_num FROM employee a join department b
on a.in_dpt=b.dpt_name;
LEFT JOIN
SELECT a.name,a.age,b.people_num FROM employee a left join department b
on a.in_dpt=b.dpt_name;
因为 employee 的 in_dpt 在 department 中的 dpt_name 都存在
RIGHT JOIN
SELECT a.name,a.age,b.people_num FROM employee a right join department b
on a.in_dpt=b.dpt_name;
其他JOIN
17.子查询
子查询的效率较低于连接查询,而且子查询均可用连接查询替换
常用操作符:
- IN : 判断一个给定值是否存在于子查询的结果集中,当存在则返回TRUE
- ALL : 用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,会返回 TRUE
- SOME(ANY) : 只要与子查询结果集中的某个值满足比较关系,就返回TRUE
- EXIST : 若子查询的结果集不为空,则返回 TRUE;否则返回 FALSE
以下面两表为例:
1. employee表
2. department表
通过 department表 查询employee 的 in_dpt 所对应的 people_num>11 的员工的名字
SELECT name FROM employee
WHERE in_dpt in
(SELECT dpt_name FROM department
WHERE people_num>11)
如果 in_dpt 的值在department表的 department 存在,就返回
SELECT * FROM employee
WHERE EXISTS
(SELECT dpt_name FROM department
WHERE dpt_name=in_dpt)
其它的我就不多举例子了,大家可以多多自行尝试
18. 修改表
ALTER TABLE 语句来改变原有表的结构,例如增加或删减列、创建或取消索引、更改原有列类型、重新命名列或表等。
修改表名
ALTER TABLE OLD_TABLE_NAME RENAME TO NEW_TABLE_NAME;
ALTER TABLE student RENAME TO student_new;
修改表结构
增加列
ALTER TABLE table_name
ADD column_name datatype
ALTER TABLE student_new
ADD tele int(11);
DESC student_new;
改变数据类型实例
ALTER TABLE student_new
modify COLUMN tele CHAR(11);
删除列
ALTER TABLE student_new
DROP COLUMN tele;
已删除tele...
更新数据
对于如下课程表经学分数置为原来2倍
UPDATE 课程表 SET 学分数=2*学分数;
将不为高等数学的科目的学时数+2
UPDATE 课程表 SET 学时数=学时数+2 where (课程名<>'高等数学');
这里的使用方法与select相似,不多赘述了
19. MySQL导入导出sql文件(windows)
导入:
mysql -u 用户名 -p 数据库名 < 存放位置
mysqljump -u root -p test < c:/a.sql
导出:
mysqldump -u 用户名 -p 数据库名 > 存放位置
mysqldump -u root -p test > c:/a.sql
20. 创建视图
视图基础
1. employee表
2. department表
3. 创建视图
CREATE VIEW my_view AS
(SELECT a.name,a.age,a.phone,a.in_dpt,b.people_num FROM employee a join department b
WHERE a.in_dpt=b.dpt_name)
21. 查看视图
DESCRIBE <view name>;
22. 删除视图
删除视图需要有权限,超级管理员当我没说…
DROP VIEW <视图名>
23. 修改视图
视图是一个虚拟表,实际的数据来自于基本表,所以通过插入、修改和删除操作更新视图中的数据,实质上是在更新视图所引用的基本表的数据,然而并非所有的视图都可以更新所引用的基本表:只有视图来自于基本表的行列子集才可以更新
对于 ALTER VIEW 语句的使用,需要用户具有针对视图的 CREATE VIEW 和 DROP 权限,以及由 SELECT 语句选择的每一列上的某些权限。
当然也可通过修改 ALTER VIEW 外,也可以使用 DROP VIEW 语句先删除视图,再使用 CREATE VIEW 语句来实现
ALTER VIEW <视图名> AS <SELECT语句>
具体删除字段的写法
alter view 视图名 as
select 你想要留下来的字段(不写你要删除的字段)
from 视图名
同理视图的更新等同于表的更新
UPDATE <视图名> SET <修改的内容>
UPDATE 课程视图 SET 学时数=学时数+2 where (课程名<>'高等数学');
对于上面的表 课程表
CREATE VIEW 课程视图 AS (SELECT * FROM 课程表);
UPDATE 课程视图 SET 学时数=学时数-2 where (课程名<>'高等数学');
这里的表和视图均发生了改变
24. 完整性约束
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)