SQL语法学习
DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
1.数据库操作
查看所有数据库show databases;
切换(选择要操作的)数据库:
use 数据库名;
创建数据库:
CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=utf8];
删除数据库:
DROP DATABASE [IF EXISTS] mydb1;
修改数据库编码:
ALTER DATABASE mydb1 CHARACTER SET utf8;
2.表操作
创建表
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
。。。
列名 列类型
);
查看当前数据库中所有表名称:
SHOW TABLES;
查看指定表的创建语句:
SHOW CREATE TABLE 表名;
查看表结构:
DESC 表名;
删除表:
DROP TABLE 表名;
修改表:
修改之添加列:
ALTER TABLE 表名
ADD (
列名 列类型,
列名 列类型,
...
);
修改之修改列类型:
(如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据)
ALTER TABLE 表名
MODIFY 列名 列类型;
修改之修改列名:
ALTER TABLE 表名
CHANGE 原列名 新列名 列类型;
修改之删除列:
ALTER TABLE 表名
DROP 列名;
修改表名称:
ALTER TABLE 原表名
RENAME TO 新表名;
3.数据操作
插入数据
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO *table_name*
VALUES (*value1*,*value2*,*value3*,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO *table_name* (*column1*,*column2*,*column3*,...)
VALUES (*value1*,*value2*,*value3*,...);
修改数据
UPDATE 语句用于更新表中已存在的记录。
UPDATE *table_name*
SET *column1*=*value1*,*column2*=*value2*,...
WHERE *some_column*=*some_value*;
删除数据
DELETE 语句用于删除表中的行。
DELETE FROM *table_name*
WHERE *some_column*=*some_value*;
4.DCL数据库控制
创建用户
CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';//用户只能在指定IP地址上登陆
CREATE USER 用户名@'%' IDENTIFIED BY '密码';//用户可以在任意IP地址登陆
给用户授权
GRANT 权限1,...,权限n ON 数据库.* TO 用户名@IP地址
权限、用户、数据库
给用户分配在指定的数据库上的指定的权限
例如:
给user1用户分配在 数据库1 上的create、alter、drop、insert、update、delete、select权限
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON 数据库1.* TO user1@localhost;
给用户分配指定数据库上的所有权限:
GRANT ALL ON 数据库.* TO 用户名@IP地址;
撤销授权
撤销指定用户在指定数据库上的指定权限:
REVOKE 权限1,...,权限n ON 数据库.* FROM 用户名@IP地址;
撤销user1用户在mydb1数据库上的create、alter、drop权限:
REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
查看权限
查看指定用户的权限:
SHOW GRANTS FOR 用户名@IP地址;
删除用户
DROP USER 用户名@IP地址;
5.基本查询之列控制
字段(列)控制
查询所有列
SELECT * FROM 表名;
SELECT * FROM emp;
其中 * 表示查询所有列
查询指定列
SELECT 列1,列2,...,列n FROM 表名;
SELECT empno,ename,sal,comm FROM 表名;
完全重复的记录只一次
当查询结果中的多行记录一模一样时,只显示一行,一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就打了!
SELECT DISTINCT *|列名 FROM 表名;
列运算
数量类型的列可以做加减乘除运算
SELECT 列名(+=*/)数字|列名 FROM 表名;
SELECT *,列名(+=*/)数字|列名 FROM 表名;
字符串类型可以做连续运算
SELECT CONCAT('$',sal) FROM emp;
转换NULL值
有时需要把NULL值转换成其他值,例如com+1000时,如果com列存在NULL值,那么NULL+1000还是NULL,而我们这时希望把NULL当作0来运算。
SELECT IFNULL(comm,0)+1000 FROM emp;
-->IFNULL(comm,0):如果comm中存在NULL值,那么当成0来运算。
给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了
SELECT IFNULL(comm,0)+1000 AS 别名 FROM 表名;
其中AS可以省略
条件控制
条件查询(where)
与前面介绍的UPDATE和DELETE语句一样,SELECT 语句也可以使用WHERE子句来控制记录。
SELECT 列名 FROM 表名 WHERE 条件;
模糊查询(like)
当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询。
SELECT * FROM 表名 WHERE 列名 LIKE '张 ';
模糊查询需要使用运算符:LIKE 其中,匹配一个任意字符,注意,只匹配一个字符而不是多个。
6.排序(ORDER BY)
升序
SELECT * FROM WHERE emp ORDER BY sal ASC;
按sal列排序,ASC表示升序,可省略。
降序
SELECT * FROM WHERE emp ORDER BY comm DESC;
按comm列排序,DESC表示降序,不可省略。
使用多列作为排序条件
SELECT * FROM WHERE emo ORDER BY sal ASC, comm DESC;
7.聚合函数(COUNT MAX MIN SUM AVG)
mysql> select * from car_detial;
+------+----------+----------+------------+--------+
| type | car_name | BIRTHDAY | owner_name | price |
+------+----------+----------+------------+--------+
| suv | 途观 | 2021 | yang | 150000 |
| suv | 哈佛H9 | 2020 | wang | 200000 |
| 轿车 | 桑塔纳 | 2019 | bu | NULL |
| suv | 途观 | 2020 | liu | 180000 |
+------+----------+----------+------------+--------+
4 rows in set (0.00 sec)
mysql> select min(price) from car_detial;
+------------+
| min(price) |
+------------+
| 150000 |
+------------+
1 row in set (0.00 sec)
mysql> select max(price) from car_detial;
+------------+
| max(price) |
+------------+
| 200000 |
+------------+
1 row in set (0.00 sec)
mysql> select sum(price) from car_detial;
+------------+
| sum(price) |
+------------+
| 530000 |
+------------+
1 row in set (0.00 sec)
mysql> select avg(price) from car_detial;
+-------------+
| avg(price) |
+-------------+
| 176666.6667 |
+-------------+
1 row in set (0.00 sec)
mysql> select count(*) from car_detial;
+----------+
| count(*) |
+----------+
| 4 |
+----------+
8.分组查询
mysql> select type,count(*) from car_detial group by type;
+------+----------+
| type | count(*) |
+------+----------+
| suv | 3 |
| 轿车 | 1 |
+------+----------+
优先级
select>from>where>group by>having>order by
9.limit方言
LIMIT用来限定查询结果的起始行,以及总行数。
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4,3;
其中,4表示从第5行开始,3表示一共查询3行,即第5、6、7行记录。