JAVA基础——SQL语句
SQL 简介
SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
一句话就是:访问和处理数据库的标准的计算机语言
SQL 是什么?
- SQL 指结构化查询语言
- SQL 使我们有能力访问数据库
- SQL 是一种 ANSI 的标准计算机语言
SQL 能做什么?
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
SQL基础语法(增删查改)
重要的事情说三遍:
使用SQL语句的时候 末尾一定要加’;’ 切记 (SQL 对大小写不敏感:SELECT 与 select 是相同的。)
使用SQL语句的时候 末尾一定要加’;’ 切记 (SQL 对大小写不敏感:SELECT 与 select 是相同的。)
使用SQL语句的时候 末尾一定要加’;’ 切记 (SQL 对大小写不敏感:SELECT 与 select 是相同的。)
数据库表
一个数据库通常包含一个或多个表(每个表又有不同的数据),每个表都有一个名字表示,表包含带有数据的记录(行)。
打个比方 就是:
一个班级有不同的学生,每个学生都有自己的兴趣爱好
mysql> use test;
Database changed
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | abc | abc | NULL |
| 4 | 111 | 111 | NULL |
+-------+----------+--------------+------------+
use test; 命令用于选择数据库。
select * from test; 读取数据表的信息。
上面的表包含2条记录(每一条对应一个人的信息)和4个列(pk_id,idx_name,idx_password,idx_driver)。
补充语句 set names utf8; 命令用于设置使用的字符集。 因为有人用的是GBK等版本 默认应该还是utf-8
例如我的test表的就是:
utf8mb4_0900_ai_ci
create table (新建表)
create TABLE text(
pk_id int,
idx_name varchar(20),
idx_password varchar(20),
idx_driver varchar(20)
)
SQL SELECT 语句(查询数据)
其实这个我刚刚上面已经放过代码了 没注意的铁子 可以看到 数据库表 这个地方
-
SELECT 语句用于从数据库中选取数据。
-
SELECT 语句用于从数据库中选取数据。
查询的结果被存储在一个结果表中,称为结果集。
SQL SELECT 语法
mysql> select idx_name ,idx_password from text;
+----------+--------------+
| idx_name | idx_password |
+----------+--------------+
| abc | abc |
| 111 | 111 |
+----------+--------------+
或者
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | abc | abc | NULL |
| 4 | 111 | 111 | NULL |
+-------+----------+--------------+------------+
其实 他们的区别就是 *(代表全部列)和具体的列名;
如果你下想查看每一列的数据,那就使用 select * from 表名; 如果只是查看具体的某几列,那就使用 select 列名1,列名2 from 表名;
SQL INSERT INTO 语句(新增数据)
INSERT INTO 语句用于向表中插入新记录。
SQL INSERT INTO语法
INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO 表名
VALUES (value1,value2,value3,...);
//这些个value都是对应表的每一列取写入的 所以 不管你的id是自增序列还是上面的 这个不能省略
//这个单引号是因为 列的数据类型是 varchar 因为要那个单引号 不然就会报错
mysql> insert into text values(123,'CCW','CCWNB','NB');
Query OK, 1 row affected (0.01 sec)
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | abc | abc | NULL |
| 4 | 111 | 111 | NULL |
| 123 | CCW | CCWNB | NB |
+-------+----------+--------------+------------+
3 rows in set (0.04 sec)
第二种形式需要指定列名及被插入的值:
INSERT INTO 表名(列名1,列名2,列名3,...)
VALUES (value1,value2,value3,...);
//如果说自增序列 你不想自己输入 那么这个就可以做到 因为你可以不输入那个列嘛
mysql> insert into text(idx_name,idx_password,idx_driver) values('CCW','CCWNB','NB');
Query OK, 1 row affected (0.01 sec)
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | abc | abc | NULL |
| 4 | 111 | 111 | NULL |
| 123 | CCW | CCWNB | NB |
| 124 | CCW | CCWNB | NB |
+-------+----------+--------------+------------+
4 rows in set (0.04 sec)
你看这个 124 就是数据库自动输入的 在上一个基础上+1
SQL UPDATE 语句(修改数据)
UPDATE 语句用于更新表中的记录(已存在)。
SQL UPDATE 语法
UPDATE 表名
SET 列名1=value1,列名2=value2,... //这里是要修改列里面的数据
WHERE some_column=some_value;
/*这个是 怎么说呢 让我思考一下 嗯... 你要修改某一行的数据,那么你首先找到这一行是吧
但你只需要 这一行的其他数据,然后通过这个取定位*/
演示:
mysql> UPDATE text
SET idx_name='AAA'
WHERE idx_password='111';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> SELECT * FROM TEXT;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | abc | abc | NULL |
| 4 | AAA | 111 | NULL |
| 123 | CCW | CCWNB | NB |
| 124 | CCW | CCWNB | NB |
+-------+----------+--------------+------------+
4 rows in set (0.02 sec)
特别注意: 如果 你的where后的的查找值不是唯一的 那么 那几行都会修改 如果不懂我的意思的话 就看下面的代码样例吧
mysql> UPDATE text
SET idx_name='ccw' //我把大写的 CCW 改成了小写的 ccw
WHERE idx_password='CCWNB';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | abc | abc | NULL |
| 4 | AAA | 111 | NULL |
| 123 | ccw | CCWNB | NB |
| 124 | ccw | CCWNB | NB |
+-------+----------+--------------+------------+
4 rows in set (0.03 sec)
Update 警告!
在更新记录时要格外小心!在上面的实例中,如果我们省略了 WHERE 子句,如下所示:
UPDATE text
SET idx_name='JSU',idx_password='jsu'
执行以上代码会将 Websites 表中所有数据的 idx_name改为 JSU,idx_password 改为 jsu。
执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。
这…我还是演示一下吧!
mysql> UPDATE text
SET idx_name='JSU',idx_password='jsu';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 1 | JSU | jsu | NULL |
| 4 | JSU | jsu | NULL |
| 123 | JSU | jsu | NB |
| 124 | JSU | jsu | NB |
+-------+----------+--------------+------------+
4 rows in set (0.04 sec)
SQL DELETE 语句(删除数据)
DELETE 语句用于删除表中的记录。
SQL DELETE 语法
DELETE FROM 表名
WHERE some_column=some_value;
//这个也是定位 指定一列的值 然后通过查找 然后删除指定的列对应的值的哪一行数据
演示:
mysql> delete from text where pk_id=1;
Query OK, 1 row affected (0.01 sec)
mysql> select * from text;
+-------+----------+--------------+------------+
| pk_id | idx_name | idx_password | idx_driver |
+-------+----------+--------------+------------+
| 4 | JSU | jsu | NULL |
| 123 | JSU | jsu | NB |
| 124 | JSU | jsu | NB |
+-------+----------+--------------+------------+
3 rows in set (0.04 sec)
同时 这个也是 注意where 和上面UPDATA警告 一样一样的
mysql> delete from text where idx_name='JSU';
Query OK, 3 rows affected (0.01 sec)
mysql> select * from text;
Empty set
//现在就是空表了 因为我删完了
拓展一下
1.多表查询
不多说 直接看例子好吧 待老夫先去整俩个表
测试数据:
表名为:person
表名为:text
1.1概述
在实际的数据库应用中,我们经常需要从多个数据表中读取数据,这时我们就可以使用SQL语句中的连接(JOIN),在两个或多个数据表中查询数据。
JOIN 按照功能可分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录。
1.2用法
1.2.1 SQL INNER JOIN (交集)
如图:
SQL INNER JOIN 语法
SELECT column_name(s) 查询的列
FROM table1 //表一
INNER JOIN table2 //表二
ON table1.column_name=table2.column_name; //需要判断相等的列
或:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
注释:INNER JOIN 与 JOIN 是相同的。
select text.idx_name ,person.idx_name
from text
inner join person
on person.idx_team=text.idx_name//需要判断相等的列
order by person.idx_name; //通过这一列 排序
+----------+----------+
| idx_name | idx_name |
+----------+----------+
| 皇马 | C罗 |
| 巴萨 | 格列兹曼 |
| 巴萨 | 梅西 |
| 拜仁 | 莱万 |
| 曼联 | 鲁尼 |
+----------+----------+
5 rows in set (0.03 sec)
注释:INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 “text” 表中的行在 “person” 中没有匹配,则不会列出这些行。
1.2.2 SQL LEFT JOIN (看左边)
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
上图:
SQL LEFT JOIN 语法
用法差不多,只是返回的结果不一样
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。(这个咱也没遇到过 咱也不晓得 所以不多赘述)
演示:
这个为了演示 在text中多加了与一行记录
INSERT into text VALUES(5,'曼城','曼城NB');
这个就是 通过表一的值 然后去表二去查找 找到返回,找不到 就返回NULL
select text.idx_name ,person.idx_name
from text
left join person //表二
on person.idx_team=text.idx_name; //判断条件
+----------+----------+
| idx_name | idx_name |
+----------+----------+
| 巴萨 | 格列兹曼 |
| 巴萨 | 梅西 |
| 皇马 | C罗 |
| 拜仁 | 莱万 |
| 曼联 | 鲁尼 |
| 曼城 | NULL |
+----------+----------+
6 rows in set (0.04 sec)
注释:LEFT JOIN 关键字从左表(text)返回所有的行,即使右表(person)中没有匹配。
1.2.3 SQL RIGHT JOIN (看右边)
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
返回结果如图:
SQL RIGHT JOIN 语法
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
演示:
这里为了演示在person表中新增一个 马儿吧
因为 右边返回的值 左边对应不上 就是 NULL
INSERT INTO person VALUES (6,'内马尔','巴黎');
mysql> select text.idx_name ,person.idx_name
from person
left join text
on person.idx_team=text.idx_name;
+----------+----------+
| idx_name | idx_name |
+----------+----------+
| 巴萨 | 梅西 |
| 皇马 | C罗 |
| 巴萨 | 格列兹曼 |
| 曼联 | 鲁尼 |
| 拜仁 | 莱万 |
| NULL | 内马尔 |
+----------+----------+
6 rows in set (0.04 sec)
注释:RIGHT JOIN 关键字从右表(access_log)返回所有的行,即使左表(Websites)中没有匹配。
2.约束
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
语法
SQL CREATE TABLE + CONSTRAINT 语法
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
在 SQL 中,我们有如下约束:
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE
的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。 - FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
SQL NOT NULL 约束
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
下面的 SQL 强制 “ID” 列、 “LastName” 列以及 “FirstName” 列不接受 NULL 值:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
添加 NOT NULL 约束
在一个已创建的表的 “Age” 字段中添加 NOT NULL 约束如下所示:
实例
ALTER TABLE Persons
MODIFY Age int NOT NULL;
删除 NOT NULL 约束
在一个已创建的表的 "Age" 字段中删除 NOT NULL 约束如下所示:
实例
ALTER TABLE Persons
MODIFY Age int NULL;
SQL UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY (主键)约束。
CREATE TABLE 时的 SQL UNIQUE 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 UNIQUE 约束:
MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
ALTER TABLE 时的 SQL UNIQUE 约束
当表已被创建时,如需在 “P_Id” 列创建 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
注:总的来说 “uc_PersonID ” 是一个约束名 !上面建的是唯一约束,为了方便区别约束名一般起得有规律点比如UC(就是UNIQUE CONSTRAINT的缩写意思是唯一约束) uc_PersonID 就是对表中的PersonID 建唯一约束
SQL PRIMARY KEY 约束
PRIMARY KEY (主键)约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
CREATE TABLE 时的 SQL PRIMARY KEY 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 PRIMARY KEY 约束:
MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
ALTER TABLE 时的 SQL PRIMARY KEY 约束
当表已被创建时,如需在 “P_Id” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP PRIMARY KEY //因为一般来说 一个表一个主键
.
SQL DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
CREATE TABLE 时的 SQL DEFAULT 约束
下面的 SQL 在 “Persons” 表创建时在 “City” 列上创建 DEFAULT 约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
ALTER TABLE 时的 SQL DEFAULT 约束
当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
这个就讲到这里了 下次见!