一、数据库
1、MySQL:关系型数据库,即使用二维表格来储存数据。
2、常见数据库
- Oracle:甲骨文(占用率最高);
- DB2:IBM;
- SQL Servlet:微软;
- Sybase:赛尔斯;
- MySQL:甲骨文;
3、RDBMS(Relational database management system):关系型数据库管理系统。
二、SQL:
1、SQL概述:
- SQL 指结构化查询语言(Structured Query Language)。
- SQL 使我们有能力访问数据库
- SQL 是一种 ANSI 的标准计算机语言,SQL99。
- SQL方言,某种DBMS不只会支持SQL标准,而且还有一些自己独有的语法,称之为方言,例如limit语句只在MySQL中可以使用。
2、SQL语法
- SQL语句可以在单行或多行书写,以分号结尾
- 可以使用空格和缩进来增强语句的可读性
- MySQL不区分大小写,关键字建议使用大写
3、SQL语句分类
①SQL 中最重要的 DDL ( Data Definition Language 数据定义语言)语句:
用来定义数据库对象(库、表、列等),创建、删除、修改库、表结构。
② SQL 的 DML(Data Manipulation Language 数据操作语言 ) 语言:
用来定义数据库记录(数据),增、删、改表记录;
③SQL的DCL(Data Control Language 数据控制语言)语言:用来调用访问权限和安全级别;
④SQL的DQL(Data Query Language 数据查询语言)语言:用来查询记录(数据);
三、DDL语句
1、数据库
- 查看所有数据库:SHOW DATABASES;
- 切换(选择要操作的)数据库:USE 数据库名;
- 创建数据库:CREATE DATABASE IF NOT EXISTS mydb1 CHARSET=utf8;
- CREATE DATABASE mydb1
- 删除数据库:DROP DATABASE [IF EXISTS] mydb1;
- DROP DATABASE mydb1;
- 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8;
2、数据类型(列类型)
- int:整型
- double:浮点型,例如double(5,2)表示最多5位,其中必须有两位小数,即最大值为999.99;
- decimal:浮点型,在表单前方面使用该类型,因为不会出现精度缺失问题;
- char:固定长度字符串类型,如char(255),数据的长度不足指定长度,补足道指定长度。
- varchar:可变长度字符串类型,varchar(65535),张三
- text(clob):字符串类型
-
- 很小
- 小
- 中
- 大
- blob:字节类型:
- 很小
- 小
- 中
- 大
-
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss;
- timestamp:时间戳类型;
在数据库中所有的字符串类型,必须使用单引号,不能使用双引号。日期类型也要使用单引号。
3、表
- 创建表:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
.......
列名 列类型
);
- 查看当前数据库中所有表名称:SHOW TABLES;
- 查看指定表的创建语句:SHOW CREATE TABLE 表名;
- 查看表结构:DESC 名;
- 删除表:DROP TABLE 表名:
- 修改表:前缀:ALTER TABLE 表名
- 修改之添加列:
ALTER TABLE 表名 ADD (
列名 列类型,
列名 列类型,
.......
列名 列类型
);
-
- 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据):ALTER TABLE 表名 MODIFY 列名 列类型;
- 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
- 修改之删除列:ALTER TABLE 表名 DROP 列名;
- 修改表名称:ALTET TABLE 原表名 RENAME TO 新表名;
四、DML语句
DQL:SELECT * FROM 表名;
DML(数据操作语言),对表记录的操作(增、删、改)
1、插入数据
- INSERT INTO 表名(列名1,列名2,.....)VALUES(列值1,列值2,….);
- 在表名后给出要插入的列名,其他没有指定的列等同于插入null值,所有插入记录总是插入一行,不可能是半行。
- 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
- INSERT INTO 表名 VALUES(列值1,列值2)
- 没有给出要插入的列,那么表示插入所有列。
- 值的个数必须是该表列的个数。
- 值的顺序,必须与表创建时给出的列的顺序相同。
2、修改数据
- UPDATE 表名 SET 列名1=列值1,列名2=列值2,.... [WHERE 条件]
- 条件(条件可选的):
- 条件必须是一个boolean类型的值或表达式:UPDATE t_person SET sex=‘男’,age=age+1 WHERE sid=‘1’;
- 运算符:=、!=、<>、>、<、>=、<=、BETWEEN.....AND、IN(.....)、IS NULL、NOT、OR、AND
- UPDATE stu SET age=36 WHERE name in('zhangsan','lisi');
- UPDATE stu SET age=10 WHERE age IS NULL;
3、删除数据
- DELETE FROM 表名 WHERE 条件;
- 如果不加添加则删除整个表。
- TRUNCATE TABLE 表名:TRUNCATE是DDL语句,它先删除drop该表,再create该表,而且无法撤销。
五、DCL
一个项目创建一个用户,一个项目对应的数据库只有一个。
这个用户只能对这个数据库有权限,其他数据库你就操作不了。
1、创建用户
- CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
- 用户只能在指定的IP地址上登录。
mysql> CREATE USER zhangsan@localhost IDENTIFIED BY '123';Query OK, 0 rows affected (0.00 sec)mysql> QUIT;Bye$ mysql -u zhangsan@localhost -pEnter password:ERROR 1045 (28000): Access denied for user 'zhangsan@localhost'@'localhost' (using password: YES)$ mysql -u zhangsan -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.
- CREATE USER 用户名@‘%’ IDENTIFIED BY '密码';
- 用户可以在任意IP地址上登录
2、给用户授权
- GRANT 权限1,.....,权限n ON 数据库.* TO 用户名@IP地址;
- 权限、用户、数据
- 给用户分派在指定的数据库上的指定的权限
- 例如:GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
- 给user1用户分派在mydb1数据库上的create、alter、drop、insert、update、delete、select权限。
- GRANT ALL ON 数据库.* TO 用户名@IP地址;
- 给用户分派指定数据库上的所有权限。
3、撤销授权
- REVOKE 权限1,....,权限n ON 数据库.* FROM 用户名@IP地址;
- 撤销指定用户在指定数据库上的指定权限。
- 例如:REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
- 撤销user1用户在mydb1数据库上的create、alter、drop权限
4、查看权限
- SHOW GRANTS FOR 用户名@IP地址
- 查看指定用户的权限
5、删除用户
- DROP USER 用户名@IP地址
六、DQL
数据查询语言,查询不会修改数据库表记录
(一)基本查询
1、字段(列)控制
1)查询所有列
SELECT * FROM 表名;
SELECT * FROM emp;
-->其中“*”表示查询所有列
2)查询指定列
SELECT 列1 [,列2,......,列N] FROM 表名;
SELECT empno,ename,sal,comm FROM 表名;
3)完全重复的记录只有一次
当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这可能性就大。
SELECT DISTINCT * | 列1 [,列2,.....,列N] FROM 表名;
SELECT DISTINCT sal FROM emp;
--->保证查询员工表的工资,如果存在相同的工资只显示一次。
4)列运算
①数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
SELECT sal+comm FROM emp;
②字符串类型可以做连续运算
SELECT CONCAT('$',sal) FROM emp;
例如:SELECT CONCAT('我叫',ename,'我的工作是',job) FROM emp;
③转换NULL值
有时需要把NULL转换成其他值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当成0来运算。
SELECT IFNULL(comm,0)+1000 FROM emp;
④给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列起个别名,这样在结果集中列名就显示别名了。
SELECT IFNULL(comm,0)+1000 AS 奖金 FROM emp;
-->其中AS可以省略。
SELECT CONCAT('我叫',ename,'我的工作是',job) 描述 FROM emp;
2、条件控制
1)条件查询
与前面结束的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE语句来控制记录。
- SELECT empno,ename,sal,comm FROM emp WHERE sal >10000 AND comm IS NOT NULL;
- SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
- SELECT empno,ename,job FROM emp WHERE jab IN(‘经理’,‘董事长’);
2)模糊查询
当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询
- SELECT * FROM emp WHERE ename LIKE '张_';
模糊查询需要使用运算符:LIKE,其中匹配一个任意字符,注意,一个“_”只匹配一个字符而不是多个。
- SELECT * FROM emp WHERE ename LIKE '___';/*三个下划线,姓名由3个字组成的员工*/
- SELECT * FROM emp WHERE ename LIKE '张%';/*姓张,名字字数不定*/
“%”匹配0~N个任意字符
- SELECT * FROM emp WHERE ename LIKE '%阿%';
姓名中含“阿”的员工。
(二)排序
1)升序
SELECT * FROM WHERE emp ORDER BY sal ASC;
--->按sal排序,升序
--->其中ASC是可以省略的
2)降序
SELECT * FROM WHERE emp ORDER BY sal DESC;
--->按sal排序,降序
--->其中DESC是不可以省略的
3)使用多列作为排序条件
SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;
--->使用sal升序,如果sal相同,使用comm的降序排列。
(三)聚合函数
聚合函数用来做某列的纵向运算。
1)COUNT
SELECT COUNT(*) FROM emp;
--->计算emp表中所有列都不为NULL的记录的行数。
SELECT COUNT(comm) FROM emp;
--->计算emp表中comm列不为NULL的记录的行数。
2)MAX
SELECT MAX(sal) FROM emp;
--->查询最高工资
3)MIN
SELECT MIN(sal) FROM emp;
--->查询最低工资
4)SUM
SELECT SUM(sal) FROM emp;
--->查询工资合计
5)AVG
SELECT AVG(sal) FROM emp;
--->查询平均工资
(四)分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息。
例如:查看所有部门的记录数。
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
--->使用deptno分组,查询部门编号和每个部门的记录数。
SELECT job, MAX(sal) FROM emp GROUP BY job;
--->使用job分组,查询每种工作的最高工资。
组条件
分组前条件,工资大于15000,以部门分组,查询每组记录数,分组后条件为记录数大于等于2
SELECT deptno,COUNT(*) FROM emp WHERE sal>15000 GROUP BY deptno HAVING COUNT(*)>=2;
(五)limit子句(方言)
LIMIT用来限定查询结果的起始行,以及总行数。
例如:查询起始行为第5行,一共查询3行记录。
SELECT * FROM emp LIMIT 4,3;
--->其中4表示从第5行开始,其中3表示一共查询3行,即第5,6,7行记录。